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

Reply via email to