On Sat, Jan 13, 2018 at 12:12:02PM +0100, Jakub Jelinek wrote: > Or we could not add those error_mark_nodes and > gcc_assert (seen_error () || cp_parser_error_occurred (parser));
This fixes the testcase: --- gcc/cp/parser.c.jj 2018-01-11 18:58:48.386391801 +0100 +++ gcc/cp/parser.c 2018-01-13 12:17:20.545347195 +0100 @@ -13403,6 +13403,9 @@ cp_parser_decl_specifier_seq (cp_parser* } } + if (attrs == error_mark_node) + gcc_assert (seen_error () || cp_parser_error_occurred (parser)); + else decl_specs->attributes = chainon (decl_specs->attributes, attrs); but there are 13 chainon calls like this in parser.c. Shouldn't we introduce a helper function for this, perhaps: void attr_chainon (cp_parser *parser, tree *attrs, tree attr) { /* Don't add error_mark_node to the chain, it can't be chained. Assert this is during error recovery. */ if (attr == error_mark_node) gcc_assert (seen_error () || cp_parser_error_occurred (parser)); else *attrs = chainon (*attrs, attr); } and change all affected spots, like attr_chainon (parser, &decl_specs->attributes, attrs); ? Jakub