openmp: Reject requires directives not at file or namespace scope [PR94593]
authorJakub Jelinek <jakub@redhat.com>
Wed, 15 Apr 2020 07:59:14 +0000 (09:59 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 15 Apr 2020 07:59:14 +0000 (09:59 +0200)
This change started with a bugreport about a typo in one requires testcase
(diagnosed with -Wunknown-pragmas only), but following discussion lead to
noting that we do not diagnose restriction that requires directives in
C/C++ may only appear at file or namespace scope; and several our tests
violated that.

2020-04-15  Jakub Jelinek  <jakub@redhat.com>

PR c/94593
* c-parser.c (c_parser_pragma) <case PRAGMA_OMP_REQUIRES>: Reject
requires directive when not at file scope.

* parser.c (cp_parser_pragma) <case PRAGMA_OMP_REQUIRES>: Reject
requires directive when not at file or namespace scope.

* c-c++-common/gomp/requires-1.c: Fix a typo, requries -> requires.
Move directives to file scope.
(i): Remove.
* c-c++-common/gomp/requires-2.c: Move directives to file scope.
(i, foo): Remove.
* c-c++-common/gomp/requires-4.c: Move directives to file scope.
* c-c++-common/gomp/atomic-19.c: Move requires directive to file scope.
* c-c++-common/gomp/atomic-20.c: Likewise.
* c-c++-common/gomp/atomic-21.c: Likewise.
* c-c++-common/gomp/atomic-22.c: Likewise.
* gcc.dg/gomp/requires-1.c: New test.
* g++.dg/gomp/requires-1.C: New test.
* g++.dg/gomp/requires-2.C: New test.
* g++.dg/gomp/atomic-18.C: Move requires directive to file scope.

16 files changed:
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/atomic-19.c
gcc/testsuite/c-c++-common/gomp/atomic-20.c
gcc/testsuite/c-c++-common/gomp/atomic-21.c
gcc/testsuite/c-c++-common/gomp/atomic-22.c
gcc/testsuite/c-c++-common/gomp/requires-1.c
gcc/testsuite/c-c++-common/gomp/requires-2.c
gcc/testsuite/c-c++-common/gomp/requires-4.c
gcc/testsuite/g++.dg/gomp/atomic-18.C
gcc/testsuite/g++.dg/gomp/requires-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/requires-2.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/requires-1.c [new file with mode: 0644]

index 482a01b307a0ea94d378bd38b8ab141b85afc252..a1831d46f12004b9dfa47c087d1174b760b07f78 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/94593
+       * c-parser.c (c_parser_pragma) <case PRAGMA_OMP_REQUIRES>: Reject
+       requires directive when not at file scope.
+
 2020-04-08  Tobias Burnus  <tobias@codesourcery.com>
 
        PR middle-end/94120
index d1c954cd02a4efcbb9afd7034750ddb62aaf740f..679c14db29cda07cbd18590b304d1cd0813e338c 100644 (file)
@@ -12402,6 +12402,13 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p)
       return false;
 
     case PRAGMA_OMP_REQUIRES:
+      if (context != pragma_external)
+       {
+         error_at (c_parser_peek_token (parser)->location,
+                   "%<#pragma omp requires%> may only be used at file scope");
+         c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
+         return false;
+       }
       c_parser_omp_requires (parser);
       return false;
 
index 4547674190e13d5f4488c2b07d8466397577d053..0f53923e76800a6478cedab55eda2df97ef90222 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/94593
+       * parser.c (cp_parser_pragma) <case PRAGMA_OMP_REQUIRES>: Reject
+       requires directive when not at file or namespace scope.
+
 2020-04-14  Iain Sandoe  <iain@sandoe.co.uk>
 
        PR c++/94359
index fec5203830ae01867305f3eb5f3fb322cbd29bab..3855416a85471ff79ec95b5cc4aa90867cd30034 100644 (file)
@@ -43801,6 +43801,13 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p)
       return true;
 
     case PRAGMA_OMP_REQUIRES:
+      if (context != pragma_external)
+       {
+         error_at (pragma_tok->location,
+                   "%<#pragma omp requires%> may only be used at file or "
+                   "namespace scope");
+         break;
+       }
       return cp_parser_omp_requires (parser, pragma_tok);
 
     case PRAGMA_OMP_ORDERED:
index 0e4eea3873d221fb7d4c60e86f74dd4305bfd620..0804bf57457765a488b4dd39b09e633b4556e543 100644 (file)
@@ -1,3 +1,16 @@
+2020-04-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/94593
+       * c-c++-common/gomp/requires-1.c: Fix a typo, requries -> requires.
+       Move directives to file scope.
+       (i): Remove.
+       * c-c++-common/gomp/requires-2.c: Move directives to file scope.
+       (i, foo): Remove.
+       * c-c++-common/gomp/requires-4.c: Move directives to file scope.
+       * gcc.dg/gomp/requires-1.c: New test.
+       * g++.dg/gomp/requires-1.C: New test.
+       * g++.dg/gomp/requires-2.C: New test.
+
 2020-04-15  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/94539
index b15761e2a5be598383409ec40c2c0013d5cbea19..c428262cfe0f85da45b8d84cae5f706028927e5c 100644 (file)
@@ -10,10 +10,16 @@ int i, j, k, l, m, n;
 void
 foo ()
 {
-  int v;
   #pragma omp atomic release
   i = i + 1;
-  #pragma omp requires atomic_default_mem_order (relaxed)
+}
+
+#pragma omp requires atomic_default_mem_order (relaxed)
+
+void
+bar ()
+{
+  int v;
   #pragma omp atomic
   j = j + 1;
   #pragma omp atomic update
index 3343d5e92353438a45e430f8eee6047617a4a0c6..d5059f4bb4ab35b751c9275b7b0f54c41a94bac1 100644 (file)
@@ -10,10 +10,16 @@ int i, j, k, l, m, n;
 void
 foo ()
 {
-  int v;
   #pragma omp atomic release
   i = i + 1;
-  #pragma omp requires atomic_default_mem_order (seq_cst)
+}
+
+#pragma omp requires atomic_default_mem_order (seq_cst)
+
+void
+bar ()
+{
+  int v;
   #pragma omp atomic
   j = j + 1;
   #pragma omp atomic update
index 8fa97b189e90f2be2c0d9b48847af9885a2606ba..8d052ae7bc710a9bbe765faca89f1b10c5411c81 100644 (file)
@@ -9,10 +9,16 @@ int i, j, k, l, m, n;
 void
 foo ()
 {
-  int v;
   #pragma omp atomic release
   i = i + 1;
-  #pragma omp requires atomic_default_mem_order (acq_rel)
+}
+
+#pragma omp requires atomic_default_mem_order (acq_rel)
+
+void
+bar ()
+{
+  int v;
   #pragma omp atomic
   j = j + 1;
   #pragma omp atomic update
index 57b0dcbefaec72b4ca1004e45d4229249fd05762..e1db3645ce0719ee9e8e9b20bdda889f2a9e25f0 100644 (file)
@@ -8,5 +8,6 @@ foo ()
   i = i + 1;
   #pragma omp atomic read
   v = j;
-  #pragma omp requires atomic_default_mem_order (acq_rel)      /* { dg-error "'atomic_default_mem_order' clause used lexically after first 'atomic' construct without memory order clause" } */
 }
+
+#pragma omp requires atomic_default_mem_order (acq_rel)        /* { dg-error "'atomic_default_mem_order' clause used lexically after first 'atomic' construct without memory order clause" } */
index f1ec8e7a154daadcfdecfed42976bec4b09375bc..e1f2e3a503fb9405e3b152fc5781dd8b233b6260 100644 (file)
@@ -3,15 +3,12 @@
 #pragma omp requires unified_shared_memory unified_address
 #pragma omp requires dynamic_allocators,reverse_offload
 
-int i;
-
 void
 foo ()
 {
-  if (0)
-    #pragma omp requires unified_shared_memory unified_address
-    i++;
-  #pragma omp requries atomic_default_mem_order(seq_cst)
 }
 
+#pragma omp requires unified_shared_memory unified_address
+#pragma omp requires atomic_default_mem_order(seq_cst)
+
 /* { dg-prune-output "not supported yet" } */
index ea07e763c55652c4505e3e39b87d651da88c36ef..717b65caeea021149408d66c8973b54718cde08f 100644 (file)
@@ -3,18 +3,8 @@
 #pragma omp requires unified_address   unified_address /* { dg-error "too many 'unified_address' clauses" } */
 #pragma omp requires reverse_offload reverse_offload   /* { dg-error "too many 'reverse_offload' clauses" } */
 #pragma omp requires foobarbaz /* { dg-error "expected 'unified_address', 'unified_shared_memory', 'dynamic_allocators', 'reverse_offload' or 'atomic_default_mem_order' clause" } */
-
-int i;
-
-void
-foo ()
-{
-  #pragma omp requires dynamic_allocators , dynamic_allocators /* { dg-error "too many 'dynamic_allocators' clauses" } */
-  if (0)
-    #pragma omp requires atomic_default_mem_order(seq_cst) atomic_default_mem_order(seq_cst)   /* { dg-error "too many 'atomic_default_mem_order' clauses" } */
-    i++;
-}
-
+#pragma omp requires dynamic_allocators , dynamic_allocators   /* { dg-error "too many 'dynamic_allocators' clauses" } */
+#pragma omp requires atomic_default_mem_order(seq_cst) atomic_default_mem_order(seq_cst)       /* { dg-error "too many 'atomic_default_mem_order' clauses" } */
 #pragma omp requires atomic_default_mem_order (seq_cst)        /* { dg-error "more than one 'atomic_default_mem_order' clause in a single compilation unit" } */
 
 /* { dg-prune-output "not supported yet" } */
index 37247a68c742785e6821b7da368ad260692ecf19..88ba7746cf81698c3aeb3f9ed877448fd5ca43e0 100644 (file)
@@ -4,9 +4,9 @@ foo (void)
 {
   #pragma omp target
   ;
-  #pragma omp requires unified_shared_memory   /* { dg-error "'unified_shared_memory' clause used lexically after first target construct or offloading API" } */
 }
 
+#pragma omp requires unified_shared_memory     /* { dg-error "'unified_shared_memory' clause used lexically after first target construct or offloading API" } */
 #pragma omp requires unified_address   /* { dg-error "'unified_address' clause used lexically after first target construct or offloading API" } */
 #pragma omp requires reverse_offload   /* { dg-error "'reverse_offload' clause used lexically after first target construct or offloading API" } */
 
index c93e732d8506d28b235b1359760af4a15cb46ad4..896cf468a0707979e6ff07e2d8d51ef0b50a9764 100644 (file)
@@ -36,7 +36,14 @@ foo (T *p)
   i = v;
   #pragma omp atomic hint(1),update,release
   f = f + 2.0;
-  #pragma omp requires atomic_default_mem_order (acq_rel)
+}
+
+#pragma omp requires atomic_default_mem_order (acq_rel)
+
+template <int N, int M, typename T>
+void
+baz (T *p)
+{
   #pragma omp atomic hint (M - 1) update
   *p += 1;
   #pragma omp atomic capture, hint (M)
@@ -47,4 +54,5 @@ void
 bar ()
 {
   foo <0, 1, int> (&i);
+  baz <0, 1, int> (&i);
 }
diff --git a/gcc/testsuite/g++.dg/gomp/requires-1.C b/gcc/testsuite/g++.dg/gomp/requires-1.C
new file mode 100644 (file)
index 0000000..aefeb28
--- /dev/null
@@ -0,0 +1,12 @@
+namespace N {
+namespace M {
+#pragma omp requires unified_address
+#pragma omp requires unified_shared_memory
+#pragma omp requires unified_shared_memory unified_address
+#pragma omp requires dynamic_allocators,reverse_offload
+#pragma omp requires unified_shared_memory unified_address
+#pragma omp requires atomic_default_mem_order(seq_cst)
+}
+}
+
+/* { dg-prune-output "not supported yet" } */
diff --git a/gcc/testsuite/g++.dg/gomp/requires-2.C b/gcc/testsuite/g++.dg/gomp/requires-2.C
new file mode 100644 (file)
index 0000000..c044e5e
--- /dev/null
@@ -0,0 +1,22 @@
+int i;
+
+void
+foo ()
+{
+  #pragma omp requires unified_address                         // { dg-error "may only be used at file or namespace scope" }
+  #pragma omp requires unified_shared_memory                   // { dg-error "may only be used at file or namespace scope" }
+  #pragma omp requires unified_shared_memory unified_address   // { dg-error "may only be used at file or namespace scope" }
+  #pragma omp requires dynamic_allocators,reverse_offload      // { dg-error "may only be used at file or namespace scope" }
+  #pragma omp requires atomic_default_mem_order(seq_cst)       // { dg-error "may only be used at file or namespace scope" }
+  if (0)
+    #pragma omp requires unified_address                       // { dg-error "may only be used at file or namespace scope" }
+    i++;
+  if (0)
+    #pragma omp requires atomic_default_mem_order(seq_cst)     // { dg-error "may only be used at file or namespace scope" }
+    i++;
+}
+
+struct S {
+  int s;
+  #pragma omp requires unified_address                         // { dg-error "may only be used at file or namespace scope" }
+};
diff --git a/gcc/testsuite/gcc.dg/gomp/requires-1.c b/gcc/testsuite/gcc.dg/gomp/requires-1.c
new file mode 100644 (file)
index 0000000..9f8d054
--- /dev/null
@@ -0,0 +1,22 @@
+int i;
+
+void
+foo ()
+{
+  #pragma omp requires unified_address                         /* { dg-error "may only be used at file scope" } */
+  #pragma omp requires unified_shared_memory                   /* { dg-error "may only be used at file scope" } */
+  #pragma omp requires unified_shared_memory unified_address   /* { dg-error "may only be used at file scope" } */
+  #pragma omp requires dynamic_allocators,reverse_offload      /* { dg-error "may only be used at file scope" } */
+  #pragma omp requires atomic_default_mem_order(seq_cst)       /* { dg-error "may only be used at file scope" } */
+  if (0)
+    #pragma omp requires unified_address                       /* { dg-error "may only be used at file scope" } */
+    i++;
+  if (0)
+    #pragma omp requires atomic_default_mem_order(seq_cst)     /* { dg-error "may only be used at file scope" } */
+    i++;
+}
+
+struct S {
+  int s;
+  #pragma omp requires unified_address                         /* { dg-error "may only be used at file scope" } */
+};