diff options
| author | Abramo Bagnara <abramo.bagnara@gmail.com> | 2011-10-03 20:34:03 +0000 |
|---|---|---|
| committer | Abramo Bagnara <abramo.bagnara@gmail.com> | 2011-10-03 20:34:03 +0000 |
| commit | fd3a455ac762fa488c6f770af6280011e1fe32ff (patch) | |
| tree | 90c339b2879ca741f5f98a61d95933f0dd9e4e1b /clang/lib | |
| parent | a279d9bd6adc5af63b751ca99f4e8adc04baf6a4 (diff) | |
| download | bcm5719-llvm-fd3a455ac762fa488c6f770af6280011e1fe32ff.tar.gz bcm5719-llvm-fd3a455ac762fa488c6f770af6280011e1fe32ff.zip | |
Fixed source range for template implicit instantiations.
llvm-svn: 141018
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 30 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 3 |
3 files changed, 25 insertions, 10 deletions
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 078869cec43..558a4ccac96 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -656,15 +656,27 @@ ClassTemplateSpecializationDecl::getSpecializedTemplate() const { SourceRange ClassTemplateSpecializationDecl::getSourceRange() const { - if (!ExplicitInfo) - return SourceRange(); - SourceLocation Begin = getExternLoc(); - if (Begin.isInvalid()) - Begin = getTemplateKeywordLoc(); - SourceLocation End = getRBraceLoc(); - if (End.isInvalid()) - End = getTypeAsWritten()->getTypeLoc().getEndLoc(); - return SourceRange(Begin, End); + if (ExplicitInfo) { + SourceLocation Begin = getExternLoc(); + if (Begin.isInvalid()) + Begin = getTemplateKeywordLoc(); + SourceLocation End = getRBraceLoc(); + if (End.isInvalid()) + End = getTypeAsWritten()->getTypeLoc().getEndLoc(); + return SourceRange(Begin, End); + } + else { + // No explicit info available. + llvm::PointerUnion<ClassTemplateDecl *, + ClassTemplatePartialSpecializationDecl *> + inst_from = getInstantiatedFrom(); + if (inst_from.isNull()) + return getSpecializedTemplate()->getSourceRange(); + if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>()) + return ctd->getSourceRange(); + return inst_from.get<ClassTemplatePartialSpecializationDecl*>() + ->getSourceRange(); + } } //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 06f783d58cf..c8cf6c4c2c9 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2007,7 +2007,7 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, Decl = ClassTemplateSpecializationDecl::Create(Context, ClassTemplate->getTemplatedDecl()->getTagKind(), ClassTemplate->getDeclContext(), - ClassTemplate->getLocation(), + ClassTemplate->getTemplatedDecl()->getLocStart(), ClassTemplate->getLocation(), ClassTemplate, Converted.data(), diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 42a654a0ee8..301bf6a1126 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1818,6 +1818,9 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, if (!FieldsWithMemberInitializers.empty()) ActOnFinishDelayedMemberInitializers(Instantiation); + if (TSK == TSK_ImplicitInstantiation) + Instantiation->setRBraceLoc(Pattern->getRBraceLoc()); + if (Instantiation->isInvalidDecl()) Invalid = true; else { |

