summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
diff options
context:
space:
mode:
authorLarisse Voufo <lvoufo@google.com>2013-08-22 00:28:27 +0000
committerLarisse Voufo <lvoufo@google.com>2013-08-22 00:28:27 +0000
commit4cda461ec48cf21b198fff940a0d9c65df8e3cc1 (patch)
tree51efd1d9eec249691a2ed93fbb40e80ff04c9aa9 /clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
parent5ba37d5282d05a6ca51267534f10eac4a0a479ad (diff)
downloadbcm5719-llvm-4cda461ec48cf21b198fff940a0d9c65df8e3cc1.tar.gz
bcm5719-llvm-4cda461ec48cf21b198fff940a0d9c65df8e3cc1.zip
Improve support for static data member templates. This revision still has at least one bug, as it does not respect the variable template specialization hierarchy well.
llvm-svn: 188969
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiateDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp37
1 files changed, 16 insertions, 21 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index b53c197d526..8d066a0ac2b 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -952,7 +952,6 @@ TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
Decl *TemplateDeclInstantiator::VisitVarTemplateDecl(VarTemplateDecl *D) {
assert(D->getTemplatedDecl()->isStaticDataMember() &&
"Only static data member templates are allowed.");
- // FIXME: Also only when instantiating a class?
// Create a local instantiation scope for this variable template, which
// will contain the instantiations of the template parameters.
@@ -971,28 +970,11 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateDecl(VarTemplateDecl *D) {
PrevVarTemplate = dyn_cast<VarTemplateDecl>(Found.front());
}
- // FIXME: This, and ForVarTemplate, is a hack that is probably unnecessary.
- // We should use a simplified version of VisitVarDecl.
VarDecl *VarInst =
cast_or_null<VarDecl>(VisitVarDecl(Pattern, /*ForVarTemplate=*/ true));
DeclContext *DC = Owner;
- /* FIXME: This should be handled in VisitVarDecl, as used to produce
- VarInst above.
- // Instantiate the qualifier.
- NestedNameSpecifierLoc QualifierLoc = Pattern->getQualifierLoc();
- if (QualifierLoc) {
- QualifierLoc =
- SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, TemplateArgs);
- if (!QualifierLoc)
- return 0;
- }
-
- if (QualifierLoc)
- VarInst->setQualifierInfo(QualifierLoc);
- */
-
VarTemplateDecl *Inst = VarTemplateDecl::Create(
SemaRef.Context, DC, D->getLocation(), D->getIdentifier(), InstParams,
VarInst, PrevVarTemplate);
@@ -1028,7 +1010,6 @@ Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
VarTemplatePartialSpecializationDecl *D) {
assert(D->isStaticDataMember() &&
"Only static data member templates are allowed.");
- // FIXME: Also only when instantiating a class?
VarTemplateDecl *VarTemplate = D->getSpecializedTemplate();
@@ -2669,11 +2650,18 @@ TemplateDeclInstantiator::InstantiateVarTemplatePartialSpecialization(
InstPartialSpec->setTypeAsWritten(WrittenTy);
InstPartialSpec->setAccess(PartialSpec->getAccess());
- // FIXME: How much of BuildVariableInstantiation() should go in here?
// Add this partial specialization to the set of variable template partial
// specializations. The instantiation of the initializer is not necessary.
VarTemplate->AddPartialSpecialization(InstPartialSpec, /*InsertPos=*/0);
+
+ // Set the initializer, to use as pattern for initialization.
+ if (VarDecl *Def = PartialSpec->getDefinition(SemaRef.getASTContext()))
+ PartialSpec = cast<VarTemplatePartialSpecializationDecl>(Def);
+ SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
+ LateAttrs, StartingScope);
+ InstPartialSpec->setInit(PartialSpec->getInit());
+
return InstPartialSpec;
}
@@ -3303,8 +3291,10 @@ VarTemplateSpecializationDecl *Sema::CompleteVarTemplateSpecializationDecl(
const MultiLevelTemplateArgumentList &TemplateArgs) {
// Do substitution on the type of the declaration
+ MultiLevelTemplateArgumentList Innermost;
+ Innermost.addOuterTemplateArguments(TemplateArgs.getInnermost());
TypeSourceInfo *DI =
- SubstType(PatternDecl->getTypeSourceInfo(), TemplateArgs,
+ SubstType(PatternDecl->getTypeSourceInfo(), Innermost,
PatternDecl->getTypeSpecStartLoc(), PatternDecl->getDeclName());
if (!DI)
return 0;
@@ -3386,6 +3376,11 @@ void Sema::BuildVariableInstantiation(
if (isa<VarTemplateSpecializationDecl>(NewVar)) {
// Do not instantiate the variable just yet.
+ } else if (ForVarTemplate) {
+ assert(!NewVar->getInit() &&
+ "A variable should not have an initializer if it is templated"
+ " and we are instantiating its template");
+ NewVar->setInit(OldVar->getInit());
} else
InstantiateVariableInitializer(NewVar, OldVar, TemplateArgs);
OpenPOWER on IntegriCloud