Fully-qualify template args of outer types in getFullyQualifiedType

Template args of outer types were not fully-qualified when calling getFullyQualifiedType() for inner types.

For simplicity the patch is a copy-paste of the same call from getFullyQualifiedType().

Reviewed at: https://reviews.llvm.org/D103039
This commit is contained in:
Victor Kuznetsov 2021-06-03 10:23:49 -07:00 committed by Sterling Augustine
parent 44d70d298a
commit 3e55f55048
2 changed files with 17 additions and 7 deletions

View File

@ -356,11 +356,19 @@ NestedNameSpecifier *createNestedNameSpecifier(const ASTContext &Ctx,
const TypeDecl *TD,
bool FullyQualify,
bool WithGlobalNsPrefix) {
const Type *TypePtr = TD->getTypeForDecl();
if (isa<const TemplateSpecializationType>(TypePtr) ||
isa<const RecordType>(TypePtr)) {
// We are asked to fully qualify and we have a Record Type (which
// may point to a template specialization) or Template
// Specialization Type. We need to fully qualify their arguments.
TypePtr = getFullyQualifiedTemplateType(Ctx, TypePtr, WithGlobalNsPrefix);
}
return NestedNameSpecifier::Create(
Ctx,
createOuterNNS(Ctx, TD, FullyQualify, WithGlobalNsPrefix),
false /*No TemplateKeyword*/,
TD->getTypeForDecl());
Ctx, createOuterNNS(Ctx, TD, FullyQualify, WithGlobalNsPrefix),
false /*No TemplateKeyword*/, TypePtr);
}
/// Return the fully qualified type, including fully-qualified

View File

@ -93,12 +93,14 @@ TEST(QualTypeNameTest, getFullyQualifiedName) {
"Foo<X>::non_dependent_type";
Visitor.ExpectedQualTypeNames["AnEnumVar"] = "EnumScopeClass::AnEnum";
Visitor.ExpectedQualTypeNames["AliasTypeVal"] = "A::B::C::InnerAlias<int>";
Visitor.ExpectedQualTypeNames["AliasInnerTypeVal"] =
"OuterTemplateClass<A::B::Class0>::Inner";
Visitor.ExpectedQualTypeNames["CheckM"] = "const A::B::Class0 *";
Visitor.ExpectedQualTypeNames["CheckN"] = "const X *";
Visitor.runOver(
"int CheckInt;\n"
"template <typename T>\n"
"class OuterTemplateClass { };\n"
"class OuterTemplateClass { public: struct Inner {}; };\n"
"namespace A {\n"
" namespace B {\n"
" class Class0 { };\n"
@ -107,6 +109,7 @@ TEST(QualTypeNameTest, getFullyQualifiedName) {
" template <typename T>\n"
" using InnerAlias = OuterTemplateClass<T>;\n"
" InnerAlias<int> AliasTypeVal;\n"
" InnerAlias<Class0>::Inner AliasInnerTypeVal;\n"
" }\n"
" template<class X, class Y> class Template0;"
" template<class X, class Y> class Template1;"
@ -165,8 +168,7 @@ TEST(QualTypeNameTest, getFullyQualifiedName) {
" enum AnEnum { ZERO, ONE };\n"
"};\n"
"EnumScopeClass::AnEnum AnEnumVar;\n",
TypeNameVisitor::Lang_CXX11
);
TypeNameVisitor::Lang_CXX11);
TypeNameVisitor Complex;
Complex.ExpectedQualTypeNames["CheckTX"] = "B::TX";