On Thu, Apr 10, 2014 at 02:23:16PM +0000, Zamyatin, Igor wrote: > 2014-04-10 Igor Zamyatin <igor.zamya...@intel.com> > > PR c++/60189 > * parser.c (cp_parser_postfix_expression): Make sure only > semicolon can go after Cilk_sync. > > gcc/testsuite/ChangeLog: > > 2014-04-10 Igor Zamyatin <igor.zamya...@intel.com> > > PR c++/60189 > * c-c++-common/cilk-plus/CK/invalid_sync.cс: New test.
CCing Jason as this is a C++ FE change. > --- a/gcc/cp/parser.c > +++ b/gcc/cp/parser.c > @@ -5835,20 +5835,33 @@ 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; > + { I don't see the point of adding the extra {} around the whole case, there is no varaible declared at that point. Other than that it looks good to me, but I'll defer the review to Jason. > + cp_lexer_consume_token (parser->lexer); > + if (flag_cilkplus) > + { > + token = cp_lexer_peek_token (parser->lexer); > + if (token->type != 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); > + finish_expr_stmt (sync_expr); > + } > + else > + { > + error_at (token->location, "-fcilkplus must be enabled to use" > + " %<_Cilk_sync%>"); > + postfix_expression = error_mark_node; > + } > + break; > + } Jakub