diff options
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 17 |
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"); } |