diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/Sema.h | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 13 |
4 files changed, 26 insertions, 12 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 5106a54f952..3755744126d 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -295,6 +295,8 @@ public: SourceRange Range2 = SourceRange(), QualType PrintType = QualType()); + QualType getQualifiedNameType(const CXXScopeSpec &SS, QualType T); + //===--------------------------------------------------------------------===// // Symbol table / Decl tracking callbacks: SemaDecl.cpp. // diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 63d446f70c0..483b79a0984 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -87,13 +87,8 @@ Sema::TypeTy *Sema::getTypeName(IdentifierInfo &II, SourceLocation NameLoc, } else return 0; - if (SS && SS->isNotEmpty() && SS->isSet()) { - llvm::SmallVector<NestedNameSpecifier, 4> TNNs; - for (CXXScopeSpec::iterator TNN = SS->begin(), TNNEnd = SS->end(); - TNN != TNNEnd; ++TNN) - TNNs.push_back(NestedNameSpecifier::getFromOpaquePtr(*TNN)); - T = Context.getQualifiedNameType(&TNNs[0], TNNs.size(), T); - } + if (SS) + T = getQualifiedNameType(*SS, T); return T.getAsOpaquePtr(); } diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index f5317787bac..b4e505e7c2f 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -765,6 +765,9 @@ Sema::ActOnClassTemplateId(DeclTy *TemplateD, SourceLocation TemplateLoc, &TemplateArgs[0], TemplateArgs.size(), RAngleLoc); + + if (SS) + Result = getQualifiedNameType(*SS, Result); TemplateArgsIn.release(); return Result.getAsOpaquePtr(); @@ -1910,11 +1913,12 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagKind TK, // actually wrote the specialization, rather than formatting the // name based on the "canonical" representation used to store the // template arguments in the specialization. - Specialization->setTypeAsWritten( - Context.getClassTemplateSpecializationType(ClassTemplate, - &TemplateArgs[0], - TemplateArgs.size(), - Context.getTypeDeclType(Specialization))); + QualType WrittenTy + = Context.getClassTemplateSpecializationType(ClassTemplate, + &TemplateArgs[0], + TemplateArgs.size(), + Context.getTypeDeclType(Specialization)); + Specialization->setTypeAsWritten(getQualifiedNameType(SS, WrittenTy)); TemplateArgsIn.release(); // C++ [temp.expl.spec]p9: diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index a8be924fc88..24b32e8147c 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1077,3 +1077,16 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag, return true; } + +/// \brief Retrieve a version of the type 'T' that is qualified by the +/// nested-name-specifier contained in SS. +QualType Sema::getQualifiedNameType(const CXXScopeSpec &SS, QualType T) { + if (!SS.isSet() || SS.isInvalid() || T.isNull()) + return T; + + llvm::SmallVector<NestedNameSpecifier, 4> Specs; + for (CXXScopeSpec::iterator Spec = SS.begin(), SpecEnd = SS.end(); + Spec != SpecEnd; ++Spec) + Specs.push_back(NestedNameSpecifier::getFromOpaquePtr(*Spec)); + return Context.getQualifiedNameType(&Specs[0], Specs.size(), T); +} |