From: Serge Pavlov Date: Sat, 10 Aug 2013 05:54:47 +0000 (+0000) Subject: Avoid spurious error messages if parent template class cannot be instantiated X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=62f675cf69ca52c163fd9c0564d84356bb7ffca1;p=clang Avoid spurious error messages if parent template class cannot be instantiated Differential Revision: http://llvm-reviews.chandlerc.com/D924 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188133 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index e62be69789..64465bf66e 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -920,8 +920,13 @@ Parser::TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, << Id; } - if (!Template) + if (!Template) { + TemplateArgList TemplateArgs; + SourceLocation LAngleLoc, RAngleLoc; + ParseTemplateIdAfterTemplateName(TemplateTy(), IdLoc, SS, + true, LAngleLoc, TemplateArgs, RAngleLoc); return true; + } // Form the template name UnqualifiedId TemplateName; diff --git a/lib/Parse/ParseTemplate.cpp b/lib/Parse/ParseTemplate.cpp index 92c59b029f..5ab5cec028 100644 --- a/lib/Parse/ParseTemplate.cpp +++ b/lib/Parse/ParseTemplate.cpp @@ -679,6 +679,8 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position) { /// \param RAngleLoc the location of the consumed '>'. /// /// \param ConsumeLastToken if true, the '>' is not consumed. +/// +/// \returns true, if current token does not start with '>', false otherwise. bool Parser::ParseGreaterThanInTemplateList(SourceLocation &RAngleLoc, bool ConsumeLastToken) { // What will be left once we've consumed the '>'. diff --git a/test/Parser/cxx-template-argument.cpp b/test/Parser/cxx-template-argument.cpp index a2c69be646..8bf2a4f78a 100644 --- a/test/Parser/cxx-template-argument.cpp +++ b/test/Parser/cxx-template-argument.cpp @@ -42,3 +42,66 @@ namespace PR13210 { new C(); // expected-error {{requires template arguments}} } } + +// Don't emit spurious messages +namespace pr16225add { + + template struct Known { }; // expected-note 3 {{template is declared here}} + template struct X; + template struct ABC; // expected-note {{template is declared here}} + template struct ABC2 {}; + + template struct foo : + UnknownBase // expected-error {{unknown template name 'UnknownBase'}} + { }; + + template struct foo2 : + UnknownBase, // expected-error {{unknown template name 'UnknownBase'}} + Known // expected-error {{too few template arguments for class template 'Known'}} + { }; + + template struct foo3 : + UnknownBase > // expected-error {{unknown template name 'UnknownBase'}} + { }; + + template struct foo4 : + UnknownBase >, // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{too few template arguments for class template 'ABC'}} + Known // expected-error {{too few template arguments for class template 'Known'}} + { }; + + template struct foo5 : + UnknownBase> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template struct foo6 : + UnknownBase>, // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + Known // expected-error {{too few template arguments for class template 'Known'}} + { }; + + template struct foo7 : + UnknownBase1)> // expected-error {{unknown template name 'UnknownBase'}} + { }; + + template struct foo8 : + UnknownBase,X> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template struct foo9 : + UnknownBase,X> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template struct foo10 : + UnknownBase,X>> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template struct foo11 : + UnknownBase<2 // expected-error {{unknown template name 'UnknownBase'}} + { }; + +} diff --git a/test/SemaCXX/class.cpp b/test/SemaCXX/class.cpp index 972a79bb60..636f584cf6 100644 --- a/test/SemaCXX/class.cpp +++ b/test/SemaCXX/class.cpp @@ -126,12 +126,8 @@ struct S // Don't crash on this bogus code. namespace pr6629 { - // TODO: most of these errors are spurious template struct foo : - bogus > // expected-error {{unknown template name 'bogus'}} \ - // BOGUS expected-error {{expected '{' after base class list}} \ - // BOGUS expected-error {{expected ';' after struct}} \ - // BOGUS expected-error {{expected unqualified-id}} + bogus > // expected-error {{unknown template name 'bogus'}} { }; template<> struct foo { // expected-error {{undeclared identifier 'unknown'}}