diff mbox

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

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

Commit Message

Zamyatin, Igor May 20, 2014, 2:10 p.m. UTC
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.zamyatin@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.zamyatin@intel.com>

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


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:jason@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

Comments

Jeff Law May 20, 2014, 4:38 p.m. UTC | #1
On 05/20/14 08:10, Zamyatin, Igor wrote:
> 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.zamyatin@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.zamyatin@intel.com>
>
> PR c++/60189
> * c-c++-common/cilk-plus/CK/invalid_sync.cс: New test.
This is fine for both the trunk and the 4.9 branch.

Thanks,
Jeff
diff mbox

Patch

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