forked from OSchip/llvm-project
Improve error recovery when presented with an ill-formed template-id
(e.g. due to a broken template argument) following template parameters. Fixes rdar://problem/8254267 llvm-svn: 109853
This commit is contained in:
parent
6263d492b5
commit
413021a8c7
|
@ -680,7 +680,8 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
|
|||
// "FOO : BAR" is not a potential typo for "FOO::BAR".
|
||||
ColonProtectionRAIIObject X(*this);
|
||||
|
||||
ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/0, true);
|
||||
if (ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/0, true))
|
||||
DS.SetTypeSpecError();
|
||||
if (SS.isSet())
|
||||
if (Tok.isNot(tok::identifier) && Tok.isNot(tok::annot_template_id))
|
||||
Diag(Tok, diag::err_expected_ident);
|
||||
|
@ -804,10 +805,13 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
|
|||
else
|
||||
TUK = Action::TUK_Reference;
|
||||
|
||||
if (!Name && !TemplateId && TUK != Action::TUK_Definition) {
|
||||
// We have a declaration or reference to an anonymous class.
|
||||
Diag(StartLoc, diag::err_anon_type_definition)
|
||||
<< DeclSpec::getSpecifierName(TagType);
|
||||
if (!Name && !TemplateId && (DS.getTypeSpecType() == DeclSpec::TST_error ||
|
||||
TUK != Action::TUK_Definition)) {
|
||||
if (DS.getTypeSpecType() != DeclSpec::TST_error) {
|
||||
// We have a declaration or reference to an anonymous class.
|
||||
Diag(StartLoc, diag::err_anon_type_definition)
|
||||
<< DeclSpec::getSpecifierName(TagType);
|
||||
}
|
||||
|
||||
SkipUntil(tok::comma, true);
|
||||
|
||||
|
|
|
@ -41,3 +41,7 @@ typedef N::C<float> c2;
|
|||
template<typename T> struct Foo { }; // expected-note{{template is declared here}}
|
||||
|
||||
void f(void) { Foo bar; } // expected-error{{without a template argument list}}
|
||||
|
||||
// rdar://problem/8254267
|
||||
template <typename T> class Party;
|
||||
template <> class Party<T> { friend struct Party<>; }; // expected-error {{use of undeclared identifier 'T'}}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
// Note that the error count below doesn't matter. We just want to
|
||||
// make sure that the parser doesn't crash.
|
||||
// CHECK: 16 errors
|
||||
// CHECK: 15 errors
|
||||
template<a>
|
||||
struct int_;
|
||||
|
||||
|
|
Loading…
Reference in New Issue