diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index 18db427b5239e..fe4ef9c50cc12 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -525,7 +525,13 @@ template static void populateInfo(Info &I, const T *D, const FullComment *C, bool &IsInAnonymousNamespace) { I.USR = getUSRForDecl(D); - I.Name = D->getNameAsString(); + if (auto ConversionDecl = dyn_cast_or_null(D); + ConversionDecl && ConversionDecl->getConversionType() + .getTypePtr() + ->isTemplateTypeParmType()) + I.Name = "operator " + ConversionDecl->getConversionType().getAsString(); + else + I.Name = D->getNameAsString(); populateParentNamespaces(I.Namespace, D, IsInAnonymousNamespace); if (C) { I.Description.emplace_back(); diff --git a/clang-tools-extra/test/clang-doc/conversion_function.cpp b/clang-tools-extra/test/clang-doc/conversion_function.cpp index ebde35e38278d..bf97d85661346 100644 --- a/clang-tools-extra/test/clang-doc/conversion_function.cpp +++ b/clang-tools-extra/test/clang-doc/conversion_function.cpp @@ -11,9 +11,8 @@ struct MyStruct { operator T(); }; -// Output incorrect conversion names. -// CHECK-YAML: Name: 'operator type-parameter-0-0' -// CHECK-YAML-NOT: Name: 'operator T' +// Output correct conversion names. +// CHECK-YAML: Name: 'operator T' -// CHECK-HTML-NOT:

operator T

-// CHECK-HTML-NOT:

public T operator T()

+// CHECK-HTML:

operator T

+// CHECK-HTML:

public T operator T()