Author: sepavloff Date: Sat Aug 10 00:54:47 2013 New Revision: 188133 URL: http://llvm.org/viewvc/llvm-project?rev=188133&view=rev Log: Avoid spurious error messages if parent template class cannot be instantiated
Differential Revision: http://llvm-reviews.chandlerc.com/D924 Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp cfe/trunk/lib/Parse/ParseTemplate.cpp cfe/trunk/test/Parser/cxx-template-argument.cpp cfe/trunk/test/SemaCXX/class.cpp Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=188133&r1=188132&r2=188133&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original) +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Sat Aug 10 00:54:47 2013 @@ -920,8 +920,13 @@ Parser::TypeResult Parser::ParseBaseType << 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; Modified: cfe/trunk/lib/Parse/ParseTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTemplate.cpp?rev=188133&r1=188132&r2=188133&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseTemplate.cpp (original) +++ cfe/trunk/lib/Parse/ParseTemplate.cpp Sat Aug 10 00:54:47 2013 @@ -679,6 +679,8 @@ Parser::ParseNonTypeTemplateParameter(un /// \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 '>'. Modified: cfe/trunk/test/Parser/cxx-template-argument.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-template-argument.cpp?rev=188133&r1=188132&r2=188133&view=diff ============================================================================== --- cfe/trunk/test/Parser/cxx-template-argument.cpp (original) +++ cfe/trunk/test/Parser/cxx-template-argument.cpp Sat Aug 10 00:54:47 2013 @@ -42,3 +42,66 @@ namespace PR13210 { new C(); // expected-error {{requires template arguments}} } } + +// Don't emit spurious messages +namespace pr16225add { + + template<class T1, typename T2> struct Known { }; // expected-note 3 {{template is declared here}} + template<class T1, typename T2> struct X; + template<class T1, typename T2> struct ABC; // expected-note {{template is declared here}} + template<int N1, int N2> struct ABC2 {}; + + template<class T1, typename T2> struct foo : + UnknownBase<T1,T2> // expected-error {{unknown template name 'UnknownBase'}} + { }; + + template<class T1, typename T2> struct foo2 : + UnknownBase<T1,T2>, // expected-error {{unknown template name 'UnknownBase'}} + Known<T1> // expected-error {{too few template arguments for class template 'Known'}} + { }; + + template<class T1, typename T2> struct foo3 : + UnknownBase<T1,T2,ABC<T2,T1> > // expected-error {{unknown template name 'UnknownBase'}} + { }; + + template<class T1, typename T2> struct foo4 : + UnknownBase<T1,ABC<T2> >, // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{too few template arguments for class template 'ABC'}} + Known<T1> // expected-error {{too few template arguments for class template 'Known'}} + { }; + + template<class T1, typename T2> struct foo5 : + UnknownBase<T1,T2,ABC<T2,T1>> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template<class T1, typename T2> struct foo6 : + UnknownBase<T1,ABC<T2,T1>>, // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + Known<T1> // expected-error {{too few template arguments for class template 'Known'}} + { }; + + template<class T1, typename T2, int N> struct foo7 : + UnknownBase<T1,T2,(N>1)> // expected-error {{unknown template name 'UnknownBase'}} + { }; + + template<class T1, typename T2> struct foo8 : + UnknownBase<X<int,int>,X<int,int>> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template<class T1, typename T2> struct foo9 : + UnknownBase<Known<int,int>,X<int,int>> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template<class T1, typename T2> struct foo10 : + UnknownBase<Known<int,int>,X<int,X<int,int>>> // expected-error {{unknown template name 'UnknownBase'}} \ + // expected-error {{use '> >'}} + { }; + + template<int N1, int N2> struct foo11 : + UnknownBase<2<N1,N2<4> // expected-error {{unknown template name 'UnknownBase'}} + { }; + +} Modified: cfe/trunk/test/SemaCXX/class.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/class.cpp?rev=188133&r1=188132&r2=188133&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/class.cpp (original) +++ cfe/trunk/test/SemaCXX/class.cpp Sat Aug 10 00:54:47 2013 @@ -126,12 +126,8 @@ struct S // Don't crash on this bogus code. namespace pr6629 { - // TODO: most of these errors are spurious template<class T1, class T2> struct foo : - bogus<foo<T1,T2> > // 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<foo<T1,T2> > // expected-error {{unknown template name 'bogus'}} { }; template<> struct foo<unknown,unknown> { // expected-error {{undeclared identifier 'unknown'}} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
