diff mbox

[PR60189,Cilk+] Fix for ICE with incorrect Cilk_sync usage

Message ID 0EFAB2BDD0F67E4FB6CCC8B9F87D7569429DBFEF@IRSMSX103.ger.corp.intel.com
State New
Headers show

Commit Message

Zamyatin, Igor April 10, 2014, 1:56 p.m. UTC
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.zamyatin@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.zamyatin@intel.com>

      PR c++/60189
      * c-c++-common/cilk-plus/CK/invalid_sync.cс: New test.
diff mbox

Patch

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;
+}