Hi! This fixes ICE on inappropriate usage of Cilk_sync keyword.
Bootstrapped/regtested on x86_64. Ok for trunk? Thanks, Igor gcc/ChangeLog: 2014-04-10 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-10 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 7bea3d2..95f9c93 100644 --- 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; + { + 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; + } case RID_BUILTIN_SHUFFLE: { diff --git a/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.сc b/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cс new file mode 100644 index 0000000..e7bec68 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cс @@ -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; +}