aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-04-15 09:59:14 +0200
committerJakub Jelinek <jakub@redhat.com>2020-04-15 09:59:14 +0200
commit2dc9294c3c7c81a6d5e1d4dedf58fea87bbadde6 (patch)
treee5020dd979b8eb5897157a8c3adfd2ec55f78159 /gcc
parente71b408aa242ffc76ffd19ebcdbd40279a1d9349 (diff)
downloadgcc-2dc9294c3c7c81a6d5e1d4dedf58fea87bbadde6.zip
gcc-2dc9294c3c7c81a6d5e1d4dedf58fea87bbadde6.tar.gz
gcc-2dc9294c3c7c81a6d5e1d4dedf58fea87bbadde6.tar.bz2
openmp: Reject requires directives not at file or namespace scope [PR94593]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-parser.c7
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/ChangeLog13
-rw-r--r--gcc/testsuite/c-c++-common/gomp/atomic-19.c10
-rw-r--r--gcc/testsuite/c-c++-common/gomp/atomic-20.c10
-rw-r--r--gcc/testsuite/c-c++-common/gomp/atomic-21.c10
-rw-r--r--gcc/testsuite/c-c++-common/gomp/atomic-22.c3
-rw-r--r--gcc/testsuite/c-c++-common/gomp/requires-1.c9
-rw-r--r--gcc/testsuite/c-c++-common/gomp/requires-2.c14
-rw-r--r--gcc/testsuite/c-c++-common/gomp/requires-4.c2
-rw-r--r--gcc/testsuite/g++.dg/gomp/atomic-18.C10
-rw-r--r--gcc/testsuite/g++.dg/gomp/requires-1.C12
-rw-r--r--gcc/testsuite/g++.dg/gomp/requires-2.C22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/requires-1.c22
16 files changed, 136 insertions, 27 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 482a01b..a1831d4 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index d1c954c..679c14d 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -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;
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4547674..0f53923 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index fec5203..3855416 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0e4eea3..0804bf5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-19.c b/gcc/testsuite/c-c++-common/gomp/atomic-19.c
index b15761e..c428262 100644
--- a/gcc/testsuite/c-c++-common/gomp/atomic-19.c
+++ b/gcc/testsuite/c-c++-common/gomp/atomic-19.c
@@ -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
diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-20.c b/gcc/testsuite/c-c++-common/gomp/atomic-20.c
index 3343d5e..d5059f4 100644
--- a/gcc/testsuite/c-c++-common/gomp/atomic-20.c
+++ b/gcc/testsuite/c-c++-common/gomp/atomic-20.c
@@ -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
diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-21.c b/gcc/testsuite/c-c++-common/gomp/atomic-21.c
index 8fa97b1..8d052ae 100644
--- a/gcc/testsuite/c-c++-common/gomp/atomic-21.c
+++ b/gcc/testsuite/c-c++-common/gomp/atomic-21.c
@@ -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
diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-22.c b/gcc/testsuite/c-c++-common/gomp/atomic-22.c
index 57b0dcb..e1db364 100644
--- a/gcc/testsuite/c-c++-common/gomp/atomic-22.c
+++ b/gcc/testsuite/c-c++-common/gomp/atomic-22.c
@@ -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" } */
diff --git a/gcc/testsuite/c-c++-common/gomp/requires-1.c b/gcc/testsuite/c-c++-common/gomp/requires-1.c
index f1ec8e7..e1f2e3a 100644
--- a/gcc/testsuite/c-c++-common/gomp/requires-1.c
+++ b/gcc/testsuite/c-c++-common/gomp/requires-1.c
@@ -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" } */
diff --git a/gcc/testsuite/c-c++-common/gomp/requires-2.c b/gcc/testsuite/c-c++-common/gomp/requires-2.c
index ea07e76..717b65c 100644
--- a/gcc/testsuite/c-c++-common/gomp/requires-2.c
+++ b/gcc/testsuite/c-c++-common/gomp/requires-2.c
@@ -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" } */
diff --git a/gcc/testsuite/c-c++-common/gomp/requires-4.c b/gcc/testsuite/c-c++-common/gomp/requires-4.c
index 37247a6..88ba774 100644
--- a/gcc/testsuite/c-c++-common/gomp/requires-4.c
+++ b/gcc/testsuite/c-c++-common/gomp/requires-4.c
@@ -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" } */
diff --git a/gcc/testsuite/g++.dg/gomp/atomic-18.C b/gcc/testsuite/g++.dg/gomp/atomic-18.C
index c93e732..896cf46 100644
--- a/gcc/testsuite/g++.dg/gomp/atomic-18.C
+++ b/gcc/testsuite/g++.dg/gomp/atomic-18.C
@@ -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
index 0000000..aefeb28
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/requires-1.C
@@ -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
index 0000000..c044e5e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/requires-2.C
@@ -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
index 0000000..9f8d054
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/requires-1.c
@@ -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" } */
+};