diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-05-11 23:26:17 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-05-11 23:26:17 +0000 |
commit | 175c5bb2b09217df71319cb3d58b3c511fd04138 (patch) | |
tree | 5742e47603c5849c47bd8f0fa06cfff657c37342 /lib/Sema/SemaTemplate.cpp | |
parent | cf41cdd14d0b0be75bf2da4559ad5f48cc8dc33e (diff) |
When checking for the necessary 'template<>' headers based on the
nested of an out-of-line declaration, only require a 'template<>'
header for each enclosing class template that hasn't been previously
specialized; previously, we were requiring 'template<>' for enclosing
class templates and members of class templates that hadn't been
previously specialized. Fixes <rdar://problem/9422013>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131207 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index d76ca76693..a9b8af28c7 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -1614,6 +1614,11 @@ Sema::MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, // expect to see. TemplateParameterList *ExpectedTemplateParams = 0; + // C++0x [temp.expl.spec]p15: + // A member or a member template may be nested within many enclosing + // class templates. In an explicit specialization for such a member, the + // member declaration shall be preceded by a template<> for each + // enclosing class template that is explicitly specialized. if (CXXRecordDecl *Record = T->getAsCXXRecordDecl()) { if (ClassTemplatePartialSpecializationDecl *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(Record)) { @@ -1637,10 +1642,11 @@ Sema::MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, break; } else if (Record->getTemplateSpecializationKind()) { if (Record->getTemplateSpecializationKind() - != TSK_ExplicitSpecialization) - NeedEmptyTemplateHeader = true; - else - break; + != TSK_ExplicitSpecialization && + TypeIdx == NumTypes - 1) + IsExplicitSpecialization = true; + + continue; } } else if (const TemplateSpecializationType *TST = T->getAs<TemplateSpecializationType>()) { |