On Thu, Mar 03, 2016 at 03:15:41PM +0100, Marek Polacek wrote: > This is ICE on invalid Cilk+ code. cilk_spawn expects a function call, so > e.g. > _Cilk_spawn (void) is invalid. The function call after the cilk_spawn keyword > is parsed using recursive call in c_parser_postfix_expression (case > RID_CILK_SPAWN). Now, c_parser_postfix_expression sees '(' followed by a > typename, so it thinks we're inside a compound literal, which means it expects > '{', but that isn't there, so we crash on the assert in c_parser_braced_init: > gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE)); > But as the comment in c_parser_postfix_expression says, the code for parsing > a compound literal here is likely dead. I made an experiment and added > gcc_unreachable () in that block, ran regtest, and there were no failures. > Thus it should be safe to just remove the code, which also fixes this ICE; > with > the patch we just give a proper error and don't crash anymore. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? I'm actually slightly > nervous about the change, so maybe better table until gcc7?
This reminds me of PR67495. Perhaps the answer here is also during the _Cilk* stuff parsing don't call c_parser_postfix_expression, but call c_parser_cast_expression instead and then verify what it got? > 2016-03-03 Marek Polacek <pola...@redhat.com> > > PR c/69798 > * c-parser.c (c_parser_postfix_expression): Remove code dealing with > compound literals. > > * gcc.dg/cilk-plus/pr69798-1.c: New test. > * gcc.dg/cilk-plus/pr69798-2.c: New test. Jakub