This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C PATCH] Fix ICE on invalid Cilk+ code (PR c/69798)
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Joseph Myers <joseph at codesourcery dot com>
- Date: Thu, 3 Mar 2016 15:15:41 +0100
- Subject: [C PATCH] Fix ICE on invalid Cilk+ code (PR c/69798)
- Authentication-results: sourceware.org; auth=none
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 <polacek@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