[PATCH] c++: Fix tentative parsing of enum-specifier [PR96077]

Nathan Sidwell nathan@acm.org
Mon Jul 13 14:08:52 GMT 2020


On 7/10/20 11:43 AM, Marek Polacek via Gcc-patches wrote:
> Here's an interesting issue: in this code a ) is missing:
> 
>    enum { E = (2 } e;
> 
> but we compile the code anyway, and E is set to 0 in build_enumerator,
> which is sneaky.
> 
> The problem is that cp_parser_enum_specifier parses tentatively, because
> when we see the enum keyword, we don't know yet if we'll find an
> enum-specifier, opaque-enum-declaration, or elaborated-enum-specifier.
> 
> In this test when we call cp_parser_enumerator_list we're still parsing
> tentatively, and as a consequence, parens.require_close (parser) in
> cp_parser_primary_expression doesn't report any errors.  But we only go
> on to parse the enumerator-list after we've seen a {, at which point we
> might as well commit -- we know we're dealing with an enum-specifier.
> 
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

ok, (with the typo Jakub noticed fixed :)

does this also fix 95288?

> gcc/cp/ChangeLog:
> 
> 	PR c++/96077
> 	* parser.c (cp_parser_enum_specifier): Commit to tentative parse
> 	after we've seen an opening brace.
> 
> gcc/testsuite/ChangeLog:
> 
> 	PR c++/96077
> 	* g++.dg/parse/enum14.C: New test.


nathan


-- 
Nathan Sidwell


More information about the Gcc-patches mailing list