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