summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/Sema.h2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp9
-rw-r--r--clang/lib/Sema/SemaTemplate.cpp14
-rw-r--r--clang/lib/Sema/SemaType.cpp13
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);
+}
OpenPOWER on IntegriCloud