diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-10-12 20:18:28 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-10-12 20:18:28 +0000 |
commit | b3ae4fcd4314a9c1c46d41b200883599c32025b4 (patch) | |
tree | a25ed84a04f126c2beae7a3b09dc855d7c37d196 /lib/AST/Decl.cpp | |
parent | 2ebe7ebb1d6149a1845dd3169009f99b78e91bc9 (diff) |
Diagnose the declaration of explicit specializations after an implicit
instantiation has already been required. To do so, keep track of the
point of instantiation for anything that can be instantiated.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83890 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 86c5719bb2..638d1cfd46 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -374,8 +374,7 @@ SourceRange VarDecl::getSourceRange() const { } VarDecl *VarDecl::getInstantiatedFromStaticDataMember() { - if (MemberSpecializationInfo *MSI - = getASTContext().getInstantiatedFromStaticDataMember(this)) + if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) return cast<VarDecl>(MSI->getInstantiatedFrom()); return 0; @@ -389,9 +388,12 @@ TemplateSpecializationKind VarDecl::getTemplateSpecializationKind() { return TSK_Undeclared; } +MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() { + return getASTContext().getInstantiatedFromStaticDataMember(this); +} + void VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { - MemberSpecializationInfo *MSI - = getASTContext().getInstantiatedFromStaticDataMember(this); + MemberSpecializationInfo *MSI = getMemberSpecializationInfo(); assert(MSI && "Not an instantiated static data member?"); MSI->setTemplateSpecializationKind(TSK); } @@ -703,13 +705,16 @@ OverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { } FunctionDecl *FunctionDecl::getInstantiatedFromMemberFunction() const { - if (MemberSpecializationInfo *Info - = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) + if (MemberSpecializationInfo *Info = getMemberSpecializationInfo()) return cast<FunctionDecl>(Info->getInstantiatedFrom()); return 0; } +MemberSpecializationInfo *FunctionDecl::getMemberSpecializationInfo() const { + return TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>(); +} + void FunctionDecl::setInstantiationOfMemberFunction(FunctionDecl *FD, TemplateSpecializationKind TSK) { |