forked from OSchip/llvm-project
Improve recovery when a comma is missing between enumerators in an
enumeration definition. Fixes <rdar://problem/7159693>. llvm-svn: 113201
This commit is contained in:
parent
1ecb978214
commit
ce66d02877
|
@ -55,6 +55,8 @@ def ext_c99_compound_literal : Extension<
|
|||
def ext_enumerator_list_comma : Extension<
|
||||
"commas at the end of enumerator lists are a %select{C99|C++0x}0-specific "
|
||||
"feature">;
|
||||
def err_enumerator_list_missing_comma : Error<
|
||||
"missing ',' between enumerators">;
|
||||
|
||||
def ext_gnu_indirect_goto : Extension<
|
||||
"use of GNU indirect-goto extension">, InGroup<GNU>;
|
||||
|
|
|
@ -2127,6 +2127,14 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {
|
|||
EnumConstantDecls.push_back(EnumConstDecl);
|
||||
LastEnumConstDecl = EnumConstDecl;
|
||||
|
||||
if (Tok.is(tok::identifier)) {
|
||||
// We're missing a comma between enumerators.
|
||||
SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation);
|
||||
Diag(Loc, diag::err_enumerator_list_missing_comma)
|
||||
<< FixItHint::CreateInsertion(Loc, ", ");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Tok.isNot(tok::comma))
|
||||
break;
|
||||
SourceLocation CommaLoc = ConsumeToken();
|
||||
|
|
|
@ -1737,11 +1737,11 @@ void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) {
|
|||
break;
|
||||
// If the next token looks like a base or member initializer, assume that
|
||||
// we're just missing a comma.
|
||||
else if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon))
|
||||
Diag(Tok.getLocation(), diag::err_ctor_init_missing_comma)
|
||||
<< FixItHint::CreateInsertion(PP.getLocForEndOfToken(PrevTokLocation),
|
||||
", ");
|
||||
else {
|
||||
else if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) {
|
||||
SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation);
|
||||
Diag(Loc, diag::err_ctor_init_missing_comma)
|
||||
<< FixItHint::CreateInsertion(Loc, ", ");
|
||||
} else {
|
||||
// Skip over garbage, until we get to '{'. Don't eat the '{'.
|
||||
Diag(Tok.getLocation(), diag::err_expected_lbrace_or_comma);
|
||||
SkipUntil(tok::l_brace, true, true);
|
||||
|
|
|
@ -41,3 +41,10 @@ int test_cond(int y, int fooBar) {
|
|||
|
||||
// CHECK: typedef int int_t;
|
||||
typedef typedef int int_t;
|
||||
|
||||
// <rdar://problem/7159693>
|
||||
enum Color {
|
||||
Red // expected-error{{missing ',' between enumerators}}
|
||||
Green = 17 // expected-error{{missing ',' between enumerators}}
|
||||
Blue,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue