Any feedback?
2013/11/18 Serge Pavlov <[email protected]> > Friendly ping. > > > 2013/11/7 Serge Pavlov <[email protected]> > >> sepavloff added you to the CC list for the revision "Recover from errors >> in enum definition.". >> >> Previously any error in enum definition body stopped parsing it. With this >> change parser tries to recover from errors. >> The patch fixes PR10982. >> >> http://llvm-reviews.chandlerc.com/D2116 >> >> Files: >> include/clang/Basic/DiagnosticParseKinds.td >> lib/Parse/ParseDecl.cpp >> test/Parser/cxx0x-ambig.cpp >> test/Parser/declarators.c >> >> Index: include/clang/Basic/DiagnosticParseKinds.td >> =================================================================== >> --- include/clang/Basic/DiagnosticParseKinds.td >> +++ include/clang/Basic/DiagnosticParseKinds.td >> @@ -475,6 +475,7 @@ >> def err_expected_catch : Error<"expected catch">; >> def err_expected_lbrace_or_comma : Error<"expected '{' or ','">; >> def err_expected_rbrace_or_comma : Error<"expected '}' or ','">; >> +def err_expected_rbrace_comma_or_equal : Error<"expected '}' or ',' or >> '='">; >> def err_expected_rsquare_or_comma : Error<"expected ']' or ','">; >> def err_using_namespace_in_class : Error< >> "'using namespace' is not allowed in classes">; >> Index: lib/Parse/ParseDecl.cpp >> =================================================================== >> --- lib/Parse/ParseDecl.cpp >> +++ lib/Parse/ParseDecl.cpp >> @@ -3724,7 +3724,15 @@ >> Decl *LastEnumConstDecl = 0; >> >> // Parse the enumerator-list. >> - while (Tok.is(tok::identifier)) { >> + while (Tok.isNot(tok::r_brace)) { >> + if (Tok.isNot(tok::identifier)) { >> + Diag(Tok.getLocation(), diag::err_expected_ident); >> + SkipUntil(tok::comma, tok::r_brace, true, true); >> + if (Tok.isNot(tok::comma)) >> + break; >> + ConsumeToken(); >> + continue; >> + } >> IdentifierInfo *Ident = Tok.getIdentifierInfo(); >> SourceLocation IdentLoc = ConsumeToken(); >> >> @@ -3738,7 +3746,9 @@ >> ExprResult AssignedVal; >> ParsingDeclRAIIObject PD(*this, ParsingDeclRAIIObject::NoParent); >> >> + bool EqualSeen = false; >> if (Tok.is(tok::equal)) { >> + EqualSeen = true; >> EqualLoc = ConsumeToken(); >> AssignedVal = ParseConstantExpression(); >> if (AssignedVal.isInvalid()) >> @@ -3764,19 +3774,29 @@ >> continue; >> } >> >> - if (Tok.isNot(tok::comma)) >> + if (Tok.is(tok::r_brace)) >> break; >> + if (Tok.isNot(tok::comma)) { >> + Diag(Tok.getLocation(), >> + EqualSeen ? diag::err_expected_rbrace_or_comma >> + : diag::err_expected_rbrace_comma_or_equal); >> + SkipUntil(tok::comma, tok::r_brace, true, true); >> + if (Tok.isNot(tok::comma)) >> + break; >> + } >> + >> SourceLocation CommaLoc = ConsumeToken(); >> >> - if (Tok.isNot(tok::identifier)) { >> + if (Tok.is(tok::r_brace)) { >> if (!getLangOpts().C99 && !getLangOpts().CPlusPlus11) >> Diag(CommaLoc, getLangOpts().CPlusPlus ? >> diag::ext_enumerator_list_comma_cxx : >> diag::ext_enumerator_list_comma_c) >> << FixItHint::CreateRemoval(CommaLoc); >> else if (getLangOpts().CPlusPlus11) >> Diag(CommaLoc, diag::warn_cxx98_compat_enumerator_list_comma) >> << FixItHint::CreateRemoval(CommaLoc); >> + break; >> } >> } >> >> Index: test/Parser/cxx0x-ambig.cpp >> =================================================================== >> --- test/Parser/cxx0x-ambig.cpp >> +++ test/Parser/cxx0x-ambig.cpp >> @@ -48,7 +48,7 @@ >> }; >> // This could be a bit-field. >> struct S2 { >> - enum E : T { a = 1, b = 2, c = 3, 4 }; // expected-error >> {{non-integral type}} expected-error {{expected '}'}} expected-note {{to >> match}} >> + enum E : T { a = 1, b = 2, c = 3, 4 }; // expected-error >> {{non-integral type}} expected-error {{expected identifier}} >> }; >> struct S3 { >> enum E : int { a = 1, b = 2, c = 3, d }; // ok, defines an enum >> @@ -64,7 +64,7 @@ >> }; >> // This could be a bit-field. >> struct S6 { >> - enum E : int { 1 }; // expected-error {{expected '}'}} expected-note >> {{to match}} >> + enum E : int { 1 }; // expected-error {{expected identifier}} >> }; >> >> struct U { >> Index: test/Parser/declarators.c >> =================================================================== >> --- test/Parser/declarators.c >> +++ test/Parser/declarators.c >> @@ -113,3 +113,32 @@ >> struct S { int n; }: // expected-error {{expected ';'}} >> >> }; >> + >> +// PR10982 >> +enum E11 { >> + A1 = 1, >> +}; >> + >> +enum E12 { >> + , // expected-error{{expected identifier}} >> + A2 >> +}; >> +void func_E12(enum E12 *p) { *p = A2; } >> + >> +enum E13 { >> + 1D, // expected-error{{expected identifier}} >> + A3 >> +}; >> +void func_E13(enum E13 *p) { *p = A3; } >> + >> +enum E14 { >> + A4 12, // expected-error{{expected '}' or ',' or '='}} >> + A4a >> +}; >> +void func_E14(enum E14 *p) { *p = A4a; } >> + >> +enum E15 { >> + A5=12 4, // expected-error{{expected '}' or ','}} >> + A5a >> +}; >> +void func_E15(enum E15 *p) { *p = A5a; } >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> > > > -- > Thanks, > --Serge > -- Thanks, --Serge
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
