forked from OSchip/llvm-project
Avoid spurious error messages if parent template class cannot be instantiated
Differential Revision: http://llvm-reviews.chandlerc.com/D924 llvm-svn: 188133
This commit is contained in:
parent
0b8e4a1e21
commit
b716b3ca1f
|
@ -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;
|
||||
|
|
|
@ -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 '>'.
|
||||
|
|
|
@ -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'}}
|
||||
{ };
|
||||
|
||||
}
|
||||
|
|
|
@ -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'}}
|
||||
|
|
Loading…
Reference in New Issue