From ea9f54aefc0cbf963df8b79028775a39bcf7393f Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 1 Nov 2011 21:35:16 +0000 Subject: [PATCH] When we see an out-of-line definition of a member class template that does not match any declaration in the class (or class template), be sure to mark it as invalid. Fixes PR10924 / . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143504 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplate.cpp | 4 +++- test/SemaTemplate/nested-template.cpp | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index de0193c61d..41c62550e8 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -989,9 +989,11 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, // If the name of the template was qualified, we must be defining the // template out-of-line. if (!SS.isInvalid() && !Invalid && !PrevClassTemplate && - !(TUK == TUK_Friend && CurContext->isDependentContext())) + !(TUK == TUK_Friend && CurContext->isDependentContext())) { Diag(NameLoc, diag::err_member_def_does_not_match) << Name << SemanticContext << SS.getRange(); + Invalid = true; + } } CXXRecordDecl *NewClass = diff --git a/test/SemaTemplate/nested-template.cpp b/test/SemaTemplate/nested-template.cpp index ab647aa226..7849bae4d5 100644 --- a/test/SemaTemplate/nested-template.cpp +++ b/test/SemaTemplate/nested-template.cpp @@ -142,3 +142,16 @@ namespace PR10896 { f.foo(); } } + +namespace PR10924 { + template< class Topology, class ctype > + struct ReferenceElement + { + }; + + template< class Topology, class ctype > + template< int codim > + class ReferenceElement< Topology, ctype > :: BaryCenterArray // expected-error{{out-of-line definition of 'BaryCenterArray' does not match any declaration in 'ReferenceElement'}} + { + }; +} -- 2.40.0