forked from OSchip/llvm-project
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:
parent
44d70d298a
commit
3e55f55048
|
@ -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
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue