summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp17
1 files changed, 14 insertions, 3 deletions
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");
}
OpenPOWER on IntegriCloud