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? 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. diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bb508b7..9e8ac1b 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -7512,28 +7512,6 @@ c_parser_postfix_expression (c_parser *parser) set_c_expr_source_range (&expr, loc, close_loc); mark_exp_read (expr.value); } - else if (c_token_starts_typename (c_parser_peek_2nd_token (parser))) - { - /* A compound literal. ??? Can we actually get here rather - than going directly to - c_parser_postfix_expression_after_paren_type from - elsewhere? */ - location_t loc; - struct c_type_name *type_name; - c_parser_consume_token (parser); - loc = c_parser_peek_token (parser)->location; - type_name = c_parser_type_name (parser); - c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, - "expected %<)%>"); - if (type_name == NULL) - { - expr.value = error_mark_node; - } - else - expr = c_parser_postfix_expression_after_paren_type (parser, - type_name, - loc); - } else { /* A parenthesized expression. */ diff --git gcc/testsuite/gcc.dg/cilk-plus/pr69798-1.c gcc/testsuite/gcc.dg/cilk-plus/pr69798-1.c index e69de29..1120193 100644 --- gcc/testsuite/gcc.dg/cilk-plus/pr69798-1.c +++ gcc/testsuite/gcc.dg/cilk-plus/pr69798-1.c @@ -0,0 +1,12 @@ +/* PR c/69798 */ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +int +main () +{ + _Cilk_spawn (void); /* { dg-error "expected expression" } */ + _Cilk_spawn (char []); /* { dg-error "expected expression" } */ + _Cilk_spawn (int *); /* { dg-error "expected expression" } */ + _Cilk_spawn ({}); /* { dg-error "only function calls can be spawned" } */ +} diff --git gcc/testsuite/gcc.dg/cilk-plus/pr69798-2.c gcc/testsuite/gcc.dg/cilk-plus/pr69798-2.c index e69de29..66bcdc8 100644 --- gcc/testsuite/gcc.dg/cilk-plus/pr69798-2.c +++ gcc/testsuite/gcc.dg/cilk-plus/pr69798-2.c @@ -0,0 +1,11 @@ +/* PR c/69798 */ +/* { dg-do compile } */ + +int +main () +{ + _Cilk_spawn (void); /* { dg-error "expected expression" } */ + _Cilk_spawn (char []); /* { dg-error "expected expression" } */ + _Cilk_spawn (int *); /* { dg-error "expected expression" } */ + _Cilk_spawn ({}); /* { dg-error "only function calls can be spawned" } */ +} Marek