Index: cfe/trunk/lib/Tooling/Core/QualTypeNames.cpp =================================================================== --- cfe/trunk/lib/Tooling/Core/QualTypeNames.cpp +++ cfe/trunk/lib/Tooling/Core/QualTypeNames.cpp @@ -304,6 +304,8 @@ Decl = TDT->getDecl(); } else if (const auto *TagDeclType = dyn_cast(TypePtr)) { Decl = TagDeclType->getDecl(); + } else if (const auto *TST = dyn_cast(TypePtr)) { + Decl = TST->getTemplateName().getAsTemplateDecl(); } else { Decl = TypePtr->getAsCXXRecordDecl(); } Index: cfe/trunk/unittests/Tooling/QualTypeNamesTest.cpp =================================================================== --- cfe/trunk/unittests/Tooling/QualTypeNamesTest.cpp +++ cfe/trunk/unittests/Tooling/QualTypeNamesTest.cpp @@ -87,13 +87,19 @@ Visitor.ExpectedQualTypeNames["non_dependent_type_var"] = "Foo::non_dependent_type"; Visitor.ExpectedQualTypeNames["AnEnumVar"] = "EnumScopeClass::AnEnum"; + Visitor.ExpectedQualTypeNames["AliasTypeVal"] = "A::B::C::InnerAlias"; Visitor.runOver( "int CheckInt;\n" + "template \n" + "class OuterTemplateClass { };\n" "namespace A {\n" " namespace B {\n" " class Class0 { };\n" " namespace C {\n" " typedef int MyInt;" + " template \n" + " using InnerAlias = OuterTemplateClass;\n" + " InnerAlias AliasTypeVal;\n" " }\n" " template class Template0;" " template class Template1;" @@ -148,7 +154,8 @@ "public:\n" " enum AnEnum { ZERO, ONE };\n" "};\n" - "EnumScopeClass::AnEnum AnEnumVar;\n" + "EnumScopeClass::AnEnum AnEnumVar;\n", + TypeNameVisitor::Lang_CXX11 ); TypeNameVisitor Complex;