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 | 06db9f50a2d6db82335790213f653accc1da6cb7 (patch) | |
tree | 02db68020ca7c263eb2f0e92678214aa0072f686 /clang/lib/AST/DeclCXX.cpp | |
parent | e7196431c19acf165314136a57a70ca597f596a3 (diff) | |
download | bcm5719-llvm-06db9f50a2d6db82335790213f653accc1da6cb7.tar.gz bcm5719-llvm-06db9f50a2d6db82335790213f653accc1da6cb7.zip |
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.
llvm-svn: 83890
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 64e800094e0..b9a87aedd76 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -434,13 +434,16 @@ void CXXRecordDecl::addConversionFunction(FunctionTemplateDecl *ConvDecl) { } CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const { - if (MemberSpecializationInfo *MSInfo - = TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>()) + if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom()); return 0; } +MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const { + return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>(); +} + void CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK) { @@ -456,8 +459,7 @@ TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() { = dyn_cast<ClassTemplateSpecializationDecl>(this)) return Spec->getSpecializationKind(); - if (MemberSpecializationInfo *MSInfo - = TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>()) + if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) return MSInfo->getTemplateSpecializationKind(); return TSK_Undeclared; @@ -471,8 +473,7 @@ CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { return; } - if (MemberSpecializationInfo *MSInfo - = TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>()) { + if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { MSInfo->setTemplateSpecializationKind(TSK); return; } |