public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [committed] Fix atomic seq_cst parsing
@ 2014-04-24 21:45 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2014-04-24 21:45 UTC (permalink / raw)
  To: gcc-patches

Hi!

I've apparently missed a paragraph that made into OpenMP 4.0
on page 131:
"In all atomic construct forms, the seq_cst clause and the clause that denotes the
type of the atomic construct can appear in any order. In addition, an optional comma
may be used to separate the clauses."
While the syntax doesn't suggest that, this paragraph supposedly overrides
it.

So, I'm therefore reverting the omp atomic part of
http://gcc.gnu.org/ml/gcc-patches/2013-07/msg00139.html
(just the new test is kept, with dg-error removed and keywords fixed).

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk
and 4.9.

2014-04-24  Jakub Jelinek  <jakub@redhat.com>

gcc/c/
	* c-parser.c (c_parser_omp_atomic): Allow seq_cst before
	atomic-clause, allow comma in between atomic-clause and
	seq_cst.
gcc/cp/
	* parser.c (cp_parser_omp_atomic): Allow seq_cst before
	atomic-clause, allow comma in between atomic-clause and
	seq_cst.
gcc/testsuite/
	* c-c++-common/gomp/atomic-16.c: Remove all dg-error directives.
	Replace load with read and store with write.
libgomp/
	* testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and
	atomic type clauses in any order and optional comma in between.
	* testsuite/libgomp.c++/atomic-15.C: Likewise.
	* testsuite/libgomp.c/atomic-17.c: Likewise.

--- gcc/c/c-parser.c	(revision 200646)
+++ gcc/c/c-parser.c	(revision 200645)
@@ -10391,6 +10391,18 @@ c_parser_omp_atomic (location_t loc, c_p
   if (c_parser_next_token_is (parser, CPP_NAME))
     {
       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
+      if (!strcmp (p, "seq_cst"))
+	{
+	  seq_cst = true;
+	  c_parser_consume_token (parser);
+	  if (c_parser_next_token_is (parser, CPP_COMMA)
+	      && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+	    c_parser_consume_token (parser);
+	}
+    }
+  if (c_parser_next_token_is (parser, CPP_NAME))
+    {
+      const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
 
       if (!strcmp (p, "read"))
 	code = OMP_ATOMIC_READ;
@@ -10405,13 +10417,21 @@ c_parser_omp_atomic (location_t loc, c_p
       if (p)
 	c_parser_consume_token (parser);
     }
-  if (c_parser_next_token_is (parser, CPP_NAME))
+  if (!seq_cst)
     {
-      const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
-      if (!strcmp (p, "seq_cst"))
+      if (c_parser_next_token_is (parser, CPP_COMMA)
+	  && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+	c_parser_consume_token (parser);
+
+      if (c_parser_next_token_is (parser, CPP_NAME))
 	{
-	  seq_cst = true;
-	  c_parser_consume_token (parser);
+	  const char *p
+	    = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
+	  if (!strcmp (p, "seq_cst"))
+	    {
+	      seq_cst = true;
+	      c_parser_consume_token (parser);
+	    }
 	}
     }
   c_parser_skip_to_pragma_eol (parser);
--- gcc/cp/parser.c	(revision 200646)
+++ gcc/cp/parser.c	(revision 200645)
@@ -27939,6 +27939,20 @@ cp_parser_omp_atomic (cp_parser *parser,
       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
       const char *p = IDENTIFIER_POINTER (id);
 
+      if (!strcmp (p, "seq_cst"))
+	{
+	  seq_cst = true;
+	  cp_lexer_consume_token (parser->lexer);
+	  if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
+	      && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
+	    cp_lexer_consume_token (parser->lexer);
+	}
+    }
+  if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
+    {
+      tree id = cp_lexer_peek_token (parser->lexer)->u.value;
+      const char *p = IDENTIFIER_POINTER (id);
+
       if (!strcmp (p, "read"))
 	code = OMP_ATOMIC_READ;
       else if (!strcmp (p, "write"))
@@ -27952,16 +27966,22 @@ cp_parser_omp_atomic (cp_parser *parser,
       if (p)
 	cp_lexer_consume_token (parser->lexer);
     }
-
-  if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
+  if (!seq_cst)
     {
-      tree id = cp_lexer_peek_token (parser->lexer)->u.value;
-      const char *p = IDENTIFIER_POINTER (id);
+      if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
+	  && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
+	cp_lexer_consume_token (parser->lexer);
 
-      if (!strcmp (p, "seq_cst"))
+      if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
 	{
-	  seq_cst = true;
-	  cp_lexer_consume_token (parser->lexer);
+	  tree id = cp_lexer_peek_token (parser->lexer)->u.value;
+	  const char *p = IDENTIFIER_POINTER (id);
+
+	  if (!strcmp (p, "seq_cst"))
+	    {
+	      seq_cst = true;
+	      cp_lexer_consume_token (parser->lexer);
+	    }
 	}
     }
   cp_parser_require_pragma_eol (parser, pragma_tok);
--- gcc/testsuite/c-c++-common/gomp/atomic-16.c	2013-10-11 11:23:59.000000000 +0200
+++ gcc/testsuite/c-c++-common/gomp/atomic-16.c	2014-04-24 18:45:26.402284385 +0200
@@ -7,28 +7,28 @@ void
 foo ()
 {
   int v;
-  #pragma omp atomic seq_cst load	/* { dg-error "expected end of line" } */
-  v = x;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic seq_cst, load	/* { dg-error "expected end of line" } */
-  v = x;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic seq_cst store	/* { dg-error "expected end of line" } */
-  x = v;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic seq_cst ,store	/* { dg-error "expected end of line" } */
-  x = v;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic seq_cst update	/* { dg-error "expected end of line" } */
+  #pragma omp atomic seq_cst read
+  v = x;
+  #pragma omp atomic seq_cst, read
+  v = x;
+  #pragma omp atomic seq_cst write
+  x = v;
+  #pragma omp atomic seq_cst ,write
+  x = v;
+  #pragma omp atomic seq_cst update
   x += v;
-  #pragma omp atomic seq_cst , update	/* { dg-error "expected end of line" } */
+  #pragma omp atomic seq_cst , update
   x += v;
-  #pragma omp atomic seq_cst capture	/* { dg-error "expected end of line" } */
-  v = x += 2;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic seq_cst, capture	/* { dg-error "expected end of line" } */
-  v = x += 2;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic load , seq_cst	/* { dg-error "expected end of line" } */
-  v = x;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic store ,seq_cst	/* { dg-error "expected end of line" } */
-  x = v;			  	/* { dg-error "invalid form" } */
-  #pragma omp atomic update, seq_cst	/* { dg-error "expected end of line" } */
+  #pragma omp atomic seq_cst capture
+  v = x += 2;
+  #pragma omp atomic seq_cst, capture
+  v = x += 2;
+  #pragma omp atomic read , seq_cst
+  v = x;
+  #pragma omp atomic write ,seq_cst
+  x = v;
+  #pragma omp atomic update, seq_cst
   x += v;
-  #pragma omp atomic capture, seq_cst	/* { dg-error "expected end of line" } */
+  #pragma omp atomic capture, seq_cst
   v = x += 2;
 }
--- libgomp/testsuite/libgomp.c++/atomic-14.C	(revision 200646)
+++ libgomp/testsuite/libgomp.c++/atomic-14.C	(revision 200645)
@@ -13,13 +13,13 @@ main ()
     v = x;
   if (v != 3)
     abort ();
-  #pragma omp atomic update seq_cst
+  #pragma omp atomic seq_cst update
     x = 3 * 2 * 1 + x;
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic read, seq_cst
     v = x;
   if (v != 9)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst, capture
     v = x = x | 16;
   if (v != 25)
     abort ();
@@ -27,15 +27,15 @@ main ()
     v = x = x + 14 * 2 / 4;
   if (v != 32)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     v = x = 5 | x;
   if (v != 37)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture, seq_cst
     v = x = 40 + 12 - 2 - 7 - x;
   if (v != 6)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic seq_cst read
     v = x;
   if (v != 6)
     abort ();
@@ -43,7 +43,7 @@ main ()
     { v = x; x = 3 + x; }
   if (v != 6)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { v = x; x = -1 * -1 * -1 * -1 - x; }
   if (v != 9)
     abort ();
@@ -51,11 +51,11 @@ main ()
     v = x;
   if (v != -8)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture, seq_cst
     { x = 2 * 2 - x; v = x; }
   if (v != 12)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { x = 7 & x; v = x; }
   if (v != 4)
     abort ();
@@ -63,7 +63,7 @@ main ()
     { v = x; x = 6; }
   if (v != 4)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic read, seq_cst
     v = x;
   if (v != 6)
     abort ();
@@ -71,11 +71,11 @@ main ()
     { v = x; x = 7 * 8 + 23; }
   if (v != 6)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic seq_cst, read
     v = x;
   if (v != 79)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture , seq_cst
     { v = x; x = 23 + 6 * 4; }
   if (v != 79)
     abort ();
@@ -83,7 +83,7 @@ main ()
     v = x;
   if (v != 47)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { v = x; x = l ? 17 : 12; }
   if (v != 47)
     abort ();
--- libgomp/testsuite/libgomp.c++/atomic-15.C	(revision 200646)
+++ libgomp/testsuite/libgomp.c++/atomic-15.C	(revision 200645)
@@ -14,13 +14,13 @@ foo ()
     v = x;
   if (v != 3)
     abort ();
-  #pragma omp atomic update seq_cst
+  #pragma omp atomic seq_cst update
     x = 3 * 2 * 1 + x;
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic read, seq_cst
     v = x;
   if (v != 9)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst, capture
     v = x = x | 16;
   if (v != 25)
     abort ();
@@ -28,15 +28,15 @@ foo ()
     v = x = x + 14 * 2 / 4;
   if (v != 32)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     v = x = 5 | x;
   if (v != 37)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture, seq_cst
     v = x = 40 + 12 - 2 - 7 - x;
   if (v != 6)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic seq_cst read
     v = x;
   if (v != 6)
     abort ();
@@ -44,7 +44,7 @@ foo ()
     { v = x; x = 3 + x; }
   if (v != 6)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { v = x; x = -1 * -1 * -1 * -1 - x; }
   if (v != 9)
     abort ();
@@ -52,11 +52,11 @@ foo ()
     v = x;
   if (v != -8)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture, seq_cst
     { x = 2 * 2 - x; v = x; }
   if (v != 12)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { x = 7 & x; v = x; }
   if (v != 4)
     abort ();
@@ -64,7 +64,7 @@ foo ()
     { v = x; x = 6; }
   if (v != 4)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic read, seq_cst
     v = x;
   if (v != 6)
     abort ();
@@ -72,11 +72,11 @@ foo ()
     { v = x; x = 7 * 8 + 23; }
   if (v != 6)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic seq_cst, read
     v = x;
   if (v != 79)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture , seq_cst
     { v = x; x = 23 + 6 * 4; }
   if (v != 79)
     abort ();
@@ -84,7 +84,7 @@ foo ()
     v = x;
   if (v != 47)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { v = x; x = l ? 17 : 12; }
   if (v != 47)
     abort ();
--- libgomp/testsuite/libgomp.c/atomic-17.c	(revision 200646)
+++ libgomp/testsuite/libgomp.c/atomic-17.c	(revision 200645)
@@ -13,13 +13,13 @@ main ()
     v = x;
   if (v != 3)
     abort ();
-  #pragma omp atomic update seq_cst
+  #pragma omp atomic seq_cst update
     x = 3 * 2 * 1 + x;
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic read, seq_cst
     v = x;
   if (v != 9)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst, capture
     v = x = x | 16;
   if (v != 25)
     abort ();
@@ -27,15 +27,15 @@ main ()
     v = x = x + 14 * 2 / 4;
   if (v != 32)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     v = x = 5 | x;
   if (v != 37)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture, seq_cst
     v = x = 40 + 12 - 2 - 7 - x;
   if (v != 6)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic seq_cst read
     v = x;
   if (v != 6)
     abort ();
@@ -43,7 +43,7 @@ main ()
     { v = x; x = 3 + x; }
   if (v != 6)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { v = x; x = -1 * -1 * -1 * -1 - x; }
   if (v != 9)
     abort ();
@@ -51,11 +51,11 @@ main ()
     v = x;
   if (v != -8)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture, seq_cst
     { x = 2 * 2 - x; v = x; }
   if (v != 12)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { x = 7 & x; v = x; }
   if (v != 4)
     abort ();
@@ -63,7 +63,7 @@ main ()
     { v = x; x = 6; }
   if (v != 4)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic read, seq_cst
     v = x;
   if (v != 6)
     abort ();
@@ -71,11 +71,11 @@ main ()
     { v = x; x = 7 * 8 + 23; }
   if (v != 6)
     abort ();
-  #pragma omp atomic read seq_cst
+  #pragma omp atomic seq_cst, read
     v = x;
   if (v != 79)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic capture , seq_cst
     { v = x; x = 23 + 6 * 4; }
   if (v != 79)
     abort ();
@@ -83,7 +83,7 @@ main ()
     v = x;
   if (v != 47)
     abort ();
-  #pragma omp atomic capture seq_cst
+  #pragma omp atomic seq_cst capture
     { v = x; x = l ? 17 : 12; }
   if (v != 47)
     abort ();


	Jakub

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-04-24 21:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-24 21:45 [committed] Fix atomic seq_cst parsing Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).