> -----Original Message----- > From: Jason Merrill [mailto:ja...@redhat.com] > Sent: Monday, April 14, 2014 8:13 AM > To: Zamyatin, Igor; Jakub Jelinek > Cc: GCC Patches (gcc-patches@gcc.gnu.org); Iyer, Balaji V > Subject: Re: [PATCH, PR60189, Cilk+] Fix for ICE with incorrect Cilk_sync > usage > > On 04/11/2014 03:08 PM, Zamyatin, Igor wrote: > > I remembered - I haven't used cp_parser_require since it calls > cp_lexer_consume_token which is not needed at this point. It is already > called a bit earlier. > > So the call to cp_parser_require can replace that call as well. As far as I understand, it can't replace it in this case since cp_parser_require contains call to cp_lexer_peek_token and, without consuming, it will still return pointer to CILK_SYNC not on the token after it. (Actually, this is somewhat similar to the check in RID_CILK_SPAWN case)
So I suggest the following gcc/ChangeLog: 2014-04-14 Igor Zamyatin <igor.zamya...@intel.com> PR c++/60189 * cp/parser.c (cp_parser_postfix_expression): Make sure only semicolon can go after Cilk_sync. gcc/testsuite/ChangeLog: 2014-04-14 Igor Zamyatin <igor.zamya...@intel.com> PR c++/60189 * c-c++-common/cilk-plus/CK/invalid_sync.cс: New test. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bb59e3b..0b3cb5a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5837,17 +5837,27 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, } case RID_CILK_SYNC: + cp_lexer_consume_token (parser->lexer); if (flag_cilkplus) - { + { + if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)) + { + error_at (token->location, "%<_Cilk_sync%> must be followed" + " by semicolon"); + postfix_expression = error_mark_node; + break; + } tree sync_expr = build_cilk_sync (); - SET_EXPR_LOCATION (sync_expr, - cp_lexer_peek_token (parser->lexer)->location); + SET_EXPR_LOCATION (sync_expr, + token->location); finish_expr_stmt (sync_expr); } else - error_at (token->location, "-fcilkplus must be enabled to use" - " %<_Cilk_sync%>"); - cp_lexer_consume_token (parser->lexer); + { + error_at (token->location, "-fcilkplus must be enabled to use" + " %<_Cilk_sync%>"); + postfix_expression = error_mark_node; + } break; case RID_BUILTIN_SHUFFLE: diff --git a/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc b/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc new file mode 100644 index 0000000..e7bec68 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc @@ -0,0 +1,9 @@ +/* PR c/60189 */ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +int main (void) +{ + _Cilk_sync return; /* { dg-error " '_Cilk_sync' must be followed by semicolon" } */ + return 0; +} Igor > > Jason >