Please look then on the following patch. Regtested successfully on x86_64. Is it ok for trunk and 4.9?
gcc/cp/ChangeLog: 2014-05-20 Igor Zamyatin <igor.zamya...@intel.com> PR c/60189 * parser.c (cp_parser_postfix_expression): Move handling of cilk_sync from here to... (cp_parser_statement): ...here. Make sure only semicolon can go after Cilk_sync. gcc/testsuite/ChangeLog: 2014-05-20 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 0c9e113..814f323 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5845,20 +5845,6 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, } break; } - - case RID_CILK_SYNC: - if (flag_cilkplus) - { - tree sync_expr = build_cilk_sync (); - SET_EXPR_LOCATION (sync_expr, - cp_lexer_peek_token (parser->lexer)->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); - break; case RID_BUILTIN_SHUFFLE: { @@ -9414,6 +9400,24 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, statement = cp_parser_jump_statement (parser); break; + case RID_CILK_SYNC: + cp_lexer_consume_token (parser->lexer); + if (flag_cilkplus) + { + tree sync_expr = build_cilk_sync (); + SET_EXPR_LOCATION (sync_expr, + token->location); + statement = finish_expr_stmt (sync_expr); + } + else + { + error_at (token->location, "-fcilkplus must be enabled to use" + " %<_Cilk_sync%>"); + statement = error_mark_node; + } + cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); + break; + /* Objective-C++ exception-handling constructs. */ case RID_AT_TRY: case RID_AT_CATCH: 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..cf1caf1 --- /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 " expected ';' before 'return'" } */ + return 0; +} Thanks, Igor > -----Original Message----- > From: Zamyatin, Igor > Sent: Tuesday, May 13, 2014 12:28 AM > To: 'Jason Merrill'; '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 > > Ping. Should I prepare the patch? > > Thanks, > Igor > > > > -----Original Message---- > > > From: Jason Merrill [mailto:ja...@redhat.com] > > > Sent: Monday, April 14, 2014 9:49 PM > > > 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 > > > > > > Oh, I see where the problem is coming from. Cilk_sync is a > > > statement, but it's being parsed as an expression. Let's move it to > > cp_parser_statement. > > > > Something like this (better to put new code in separate routine?)? > > > > diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bb59e3b..3105d6c > > 100644 > > --- a/gcc/cp/parser.c > > +++ b/gcc/cp/parser.c > > @@ -5835,20 +5835,6 @@ cp_parser_postfix_expression (cp_parser > > *parser, bool address_p, bool cast_p, > > } > > break; > > } > > - > > - case RID_CILK_SYNC: > > - if (flag_cilkplus) > > - { > > - tree sync_expr = build_cilk_sync (); > > - SET_EXPR_LOCATION (sync_expr, > > - cp_lexer_peek_token (parser->lexer)->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); > > - break; > > > > case RID_BUILTIN_SHUFFLE: > > { > > @@ -9404,6 +9390,24 @@ cp_parser_statement (cp_parser* parser, tree > > in_statement_expr, > > statement = cp_parser_jump_statement (parser); > > break; > > > > + case RID_CILK_SYNC: > > + cp_lexer_consume_token (parser->lexer); > > + if (flag_cilkplus) > > + { > > + tree sync_expr = build_cilk_sync (); > > + SET_EXPR_LOCATION (sync_expr, > > + token->location); > > + statement = finish_expr_stmt (sync_expr); > > + } > > + else > > + { > > + error_at (token->location, "-fcilkplus must be enabled to use" > > + " %<_Cilk_sync%>"); > > + statement = error_mark_node; > > + } > > + cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); > > + break; > > + > > /* Objective-C++ exception-handling constructs. */ > > case RID_AT_TRY: > > case RID_AT_CATCH: > > > > Thanks, > > Igor > > > > > > > > Jason