summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/DeclTemplate.cpp10
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp17
-rw-r--r--clang/lib/Serialization/ASTWriterDecl.cpp1
3 files changed, 25 insertions, 3 deletions
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
index 6e734a18c75..0b0228869ef 100644
--- a/clang/lib/AST/DeclTemplate.cpp
+++ b/clang/lib/AST/DeclTemplate.cpp
@@ -963,6 +963,16 @@ void VarTemplateDecl::DeallocateCommon(void *Ptr) {
static_cast<Common *>(Ptr)->~Common();
}
+VarTemplateDecl *VarTemplateDecl::getDefinition() {
+ VarTemplateDecl *CurD = this;
+ while (CurD) {
+ if (CurD->isThisDeclarationADefinition())
+ return CurD;
+ CurD = CurD->getPreviousDecl();
+ }
+ return 0;
+}
+
VarTemplateDecl *VarTemplateDecl::Create(ASTContext &C, DeclContext *DC,
SourceLocation L, DeclarationName Name,
TemplateParameterList *Params,
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 315a405c6d3..5766afa1011 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -3481,11 +3481,22 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
llvm::PointerUnion<VarTemplateDecl *,
VarTemplatePartialSpecializationDecl *> PatternPtr =
VarSpec->getSpecializedTemplateOrPartial();
- if (PatternPtr.is<VarTemplatePartialSpecializationDecl *>())
+ if (PatternPtr.is<VarTemplatePartialSpecializationDecl *>()) {
PatternDecl = cast<VarDecl>(
PatternPtr.get<VarTemplatePartialSpecializationDecl *>());
- else
- PatternDecl = (PatternPtr.get<VarTemplateDecl *>())->getTemplatedDecl();
+
+ // Find actual definition
+ if (VarDecl *Def = PatternDecl->getDefinition(getASTContext()))
+ PatternDecl = Def;
+ } else {
+ VarTemplateDecl *PatternTemplate = PatternPtr.get<VarTemplateDecl *>();
+
+ // Find actual definition
+ if (VarTemplateDecl *Def = PatternTemplate->getDefinition())
+ PatternTemplate = Def;
+
+ PatternDecl = PatternTemplate->getTemplatedDecl();
+ }
assert(PatternDecl && "instantiating a non-template");
}
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index 60acbc585ba..bb7fd1edf6e 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -735,6 +735,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
D->getInitStyle() == VarDecl::CInit &&
D->getInit() == 0 &&
!isa<ParmVarDecl>(D) &&
+ !isa<VarTemplateSpecializationDecl>(D) &&
!D->isConstexpr() &&
!SpecInfo)
AbbrevToUse = Writer.getDeclVarAbbrev();
OpenPOWER on IntegriCloud