summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/gomp
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gcc.dg/gomp
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gcc.dg/gomp')
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c41
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c35
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c26
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c29
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/asm-1.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-1.c99
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-10.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-11.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-12.c306
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-13.c9
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-14.c43
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-2.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-3.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-4.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-5.c39
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-6.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-7.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-8.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-9.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/barrier-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/barrier-2.c26
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-1.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-10.c40
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-11.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-2.c32
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-3.c57
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-4.c9
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-5.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-6.c9
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-7.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-8.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-9.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/clause-1.c94
-rw-r--r--gcc/testsuite/gcc.dg/gomp/clause-2.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/collapse-1.c92
-rw-r--r--gcc/testsuite/gcc.dg/gomp/combined-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/complex-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/copyin-1.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-1.c28
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-2.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-3.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-4.c28
-rw-r--r--gcc/testsuite/gcc.dg/gomp/empty.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/flush-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/flush-2.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-1.c49
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-10.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-11.c73
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-12.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-13.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-14.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-15.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-16.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-17.c67
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-18.c42
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-19.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-2.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-3.c62
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-4.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-5.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-6.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-7.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-8.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-9.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/gomp.exp36
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-2.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-3.c26
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-4.c29
-rw-r--r--gcc/testsuite/gcc.dg/gomp/master-1.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/master-2.c7
-rw-r--r--gcc/testsuite/gcc.dg/gomp/master-3.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/nestedfn-1.c53
-rw-r--r--gcc/testsuite/gcc.dg/gomp/nesting-1.c198
-rw-r--r--gcc/testsuite/gcc.dg/gomp/num-threads-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/ordered-1.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/ordered-2.c7
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-1.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-2.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-3.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-4.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr25874.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr25989.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr25990.c261
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr25996.c32
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr26412.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27328.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27358.c8
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27388-1.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27388-2.c35
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27388-3.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27415.c50
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27416.c31
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27499.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr27573.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29955.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29965-1.c45
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29965-2.c98
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29965-3.c62
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29965-4.c44
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29965-5.c44
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29965-6.c44
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr30421.c39
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr30494.c30
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr32468-1.c100
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr34607.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr34610.c28
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr34692.c28
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr34694.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr34964.c6
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35244.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35438.c6
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35439.c6
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35738.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35751.c34
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr35818.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr36790.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr38633.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr38676.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr39495-1.c95
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr39495-2.c39
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr44085.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr47963.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr48591.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr48716.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr49640.c29
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr51339.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr51360.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/preprocess-1.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-1.c39
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-2.c29
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-3.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-4.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sharing-1.c58
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sharing-2.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sharing-3.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/static.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/tls-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/tls-2.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/uninit-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-1.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-2.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-3.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-4.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-5.c11
176 files changed, 5077 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c
new file mode 100644
index 000000000..f7f2924ce
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+void
+a1 (int n, float *a, float *b)
+{
+ int i;
+#pragma omp parallel for
+ for (i = 1; i < n; i++) /* i is private by default */
+ b[i] = (a[i] + a[i - 1]) / 2.0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c
new file mode 100644
index 000000000..750bc378c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+void
+work1 ()
+{
+}
+
+void
+work2 ()
+{
+}
+void
+a10 ()
+{
+#pragma omp parallel
+ {
+#pragma omp single
+ printf ("Beginning work1.\n");
+ work1 ();
+#pragma omp single
+ printf ("Finishing work1.\n");
+#pragma omp single nowait
+ printf ("Finished work1 and beginning work2.\n");
+ work2 ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c
new file mode 100644
index 000000000..fab948dd7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+extern float average (float, float, float);
+void
+a12 (float *x, float *xold, int n, float tol)
+{
+ int c, i, toobig;
+ float error, y;
+ c = 0;
+#pragma omp parallel
+ {
+ do
+ {
+#pragma omp for private(i)
+ for (i = 1; i < n - 1; ++i)
+ {
+ xold[i] = x[i];
+ }
+#pragma omp single
+ {
+ toobig = 0;
+ }
+#pragma omp for private(i,y,error) reduction(+:toobig)
+ for (i = 1; i < n - 1; ++i)
+ {
+ y = x[i];
+ x[i] = average (xold[i - 1], x[i], xold[i + 1]);
+ error = y - x[i];
+ if (error > tol || error < -tol)
+ ++toobig;
+ }
+#pragma omp master
+ {
+ ++c;
+ printf ("iteration %d, toobig=%d\n", c, toobig);
+ }
+ }
+ while (toobig > 0);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c
new file mode 100644
index 000000000..cc0fcc25d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+int dequeue (float *a);
+void work (int i, float *a);
+void
+a13 (float *x, float *y)
+{
+ int ix_next, iy_next;
+#pragma omp parallel shared(x, y) private(ix_next, iy_next)
+ {
+#pragma omp critical (xaxis)
+ ix_next = dequeue (x);
+ work (ix_next, x);
+#pragma omp critical (yaxis)
+ iy_next = dequeue (y);
+ work (iy_next, y);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c
new file mode 100644
index 000000000..14a7ed0bd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+void
+a14 ()
+{
+ int i = 1;
+#pragma omp parallel sections
+ {
+#pragma omp section
+ {
+#pragma omp critical (name)
+ {
+#pragma omp parallel
+ {
+#pragma omp single
+ {
+ i++;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c
new file mode 100644
index 000000000..c460f7566
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+void
+a17_1_wrong ()
+{
+ union
+ {
+ int n;
+ float x;
+ } u;
+#pragma omp parallel
+ {
+#pragma omp atomic
+ u.n++;
+#pragma omp atomic
+ u.x += 1.0;
+/* Incorrect because the atomic constructs reference the same location
+ through incompatible types */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c
new file mode 100644
index 000000000..aaaec7ea3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+void
+a17_2_wrong ()
+{
+ int x;
+ int *i;
+ float *r;
+ i = &x;
+ r = (float *) &x;
+#pragma omp parallel
+ {
+#pragma omp atomic
+ *i += 1;
+#pragma omp atomic
+ *r += 1.0;
+/* Incorrect because the atomic constructs reference the same location
+ through incompatible types */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c
new file mode 100644
index 000000000..d43e0cf45
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+a20_wrong ()
+{
+ int a = 1;
+#pragma omp parallel
+ {
+ if (a != 0)
+#pragma omp flush(a) /* { dg-error "'#pragma omp flush' may only" } */
+/* incorrect as flush cannot be immediate substatement
+ of if statement */
+ if (a != 0)
+#pragma omp barrier /* { dg-error "'#pragma omp barrier' may only" } */
+/* incorrect as barrier cannot be immediate substatement
+ of if statement */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c
new file mode 100644
index 000000000..4f1138356
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+a20 ()
+{
+ int a = 1;
+#pragma omp parallel
+ {
+ if (a != 0)
+ {
+#pragma omp flush(a)
+ }
+ if (a != 0)
+ {
+#pragma omp barrier
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c
new file mode 100644
index 000000000..a9b81d0c3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+void
+work (int i)
+{
+}
+
+void
+a21_wrong (int n)
+{
+ int i;
+#pragma omp for ordered
+ for (i = 0; i < n; i++)
+ {
+/* incorrect because an iteration may not execute more than one
+ ordered region */
+#pragma omp ordered
+ work (i);
+#pragma omp ordered
+ work (i + 1);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c
new file mode 100644
index 000000000..4d1ed6a52
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+void work (int);
+
+void
+a21_good (int n)
+{
+ int i;
+#pragma omp for ordered
+ for (i = 0; i < n; i++)
+ {
+ if (i <= 10)
+ {
+#pragma omp ordered
+ work (i);
+ }
+ if (i > 10)
+ {
+#pragma omp ordered
+ work (i + 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c
new file mode 100644
index 000000000..e3586838a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+int counter = 0;
+#pragma omp threadprivate(counter)
+int
+increment_counter ()
+{
+ counter++;
+ return (counter);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c
new file mode 100644
index 000000000..7a6e901a8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+int
+increment_counter_2 ()
+{
+ static int counter = 0;
+#pragma omp threadprivate(counter)
+ counter++;
+ return (counter);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c
new file mode 100644
index 000000000..9d8baa37f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+extern int omp_get_num_threads (void);
+int x, y, t, z[1000];
+#pragma omp threadprivate(x)
+void
+a24 (int a)
+{
+ const int c = 1;
+ int i = 0;
+ int l = 0;
+#pragma omp parallel default(none) private(a) shared(z)
+ {
+ int j = omp_get_num_threads ();
+ /* O.K. - j is declared within parallel region */
+ /* O.K. - a is listed in private clause */
+ /* - z is listed in shared clause */
+ x = c; /* O.K. - x is threadprivate */
+ /* - c has const-qualified type */
+ z[i] = y;
+ /* { dg-error "'i' not specified" "" { target *-*-* } 21 } */
+ /* { dg-error "enclosing parallel" "" { target *-*-* } 13 } */
+ /* { dg-error "'y' not specified" "" { target *-*-* } 21 } */
+#pragma omp for firstprivate(y)
+ for (i = 0; i < 10; i++)
+ {
+ z[i] = y; /* O.K. - i is the loop iteration variable */
+ /* - y is listed in firstprivate clause */
+ }
+ z[l] = t;
+ /* { dg-error "'l' not specified" "" { target *-*-* } 31 } */
+ /* { dg-error "'t' not specified" "" { target *-*-* } 31 } */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c
new file mode 100644
index 000000000..b655edc10
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -std=c99" } */
+
+int a;
+void
+g (int k)
+{
+ a = k; /* The global "a", not the private "a" in f */
+}
+
+void
+f (int n)
+{
+ int a = 0;
+#pragma omp parallel for private(a)
+ for (int i = 1; i < n; i++)
+ {
+ a = i;
+ g (a * 2); /* Private copy of "a" */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c
new file mode 100644
index 000000000..faa6ac621
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+void
+a27 ()
+{
+ int i, a;
+#pragma omp parallel private(a)
+ {
+#pragma omp parallel for private(a)
+ for (i = 0; i < 10; i++)
+ {
+ /* do work here */
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c
new file mode 100644
index 000000000..e34be4c42
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void
+a30 (int n, float *a, float *b)
+{
+ int i;
+#pragma omp parallel
+ {
+#pragma omp for lastprivate(i)
+ for (i = 0; i < n - 1; i++)
+ a[i] = b[i] + b[i + 1];
+ }
+ a[i] = b[i]; /* i == n-1 here */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c
new file mode 100644
index 000000000..cbb3f60df
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+void
+a31_1 (float *x, int *y, int n)
+{
+ int i, b;
+ float a;
+ a = 0.0;
+ b = 0;
+#pragma omp parallel for private(i) shared(x, y, n) \
+ reduction(+:a) reduction(^:b)
+ for (i = 0; i < n; i++)
+ {
+ a += x[i];
+ b ^= y[i];
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c
new file mode 100644
index 000000000..f9da3f4fc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+void
+a31_2 (float *x, int *y, int n)
+{
+ int i, b, b_p;
+ float a, a_p;
+ a = 0.0;
+ b = 0;
+#pragma omp parallel shared(a, b, x, y, n) \
+ private(a_p, b_p)
+ {
+ a_p = 0.0;
+ b_p = 0;
+#pragma omp for private(i)
+ for (i = 0; i < n; i++)
+ {
+ a_p += x[i];
+ b_p ^= y[i];
+ }
+#pragma omp critical
+ {
+ a += a_p;
+ b ^= b_p;
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c
new file mode 100644
index 000000000..d2cb316f3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#include <stdlib.h>
+float *work;
+int size;
+float tol;
+void build (void);
+#pragma omp threadprivate(work,size,tol)
+void
+a32 (float t, int n)
+{
+ tol = t;
+ size = n;
+#pragma omp parallel copyin(tol,size)
+ {
+ build ();
+ }
+}
+void
+build ()
+{
+ int i;
+ work = (float *) malloc (sizeof (float) * size);
+ for (i = 0; i < size; ++i)
+ work[i] = tol;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c
new file mode 100644
index 000000000..99c06da6a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#include <stdio.h>
+float x, y;
+#pragma omp threadprivate(x, y)
+void
+init (float a, float b)
+{
+#pragma omp single copyprivate(a,b,x,y)
+ {
+ scanf ("%f %f %f %f", &a, &b, &x, &y);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c
new file mode 100644
index 000000000..a0da739dd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+#include <stdlib.h>
+float
+read_next ()
+{
+ float *tmp;
+ float return_val;
+#pragma omp single copyprivate(tmp)
+ {
+ tmp = (float *) malloc (sizeof (float));
+ } /* copies the pointer only */
+#pragma omp master
+ {
+ scanf ("%f", tmp);
+ }
+#pragma omp barrier
+ return_val = *tmp;
+#pragma omp barrier
+#pragma omp single nowait
+ {
+ free (tmp);
+ }
+ return return_val;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c
new file mode 100644
index 000000000..e5ae7a61e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+void
+work (int i, int j)
+{
+}
+
+void
+good_nesting (int n)
+{
+ int i, j;
+#pragma omp parallel default(shared)
+ {
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+#pragma omp parallel shared(i, n)
+ {
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c
new file mode 100644
index 000000000..7cc265fec
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+
+void
+work (int i, int j)
+{
+}
+
+void
+work1 (int i, int n)
+{
+ int j;
+#pragma omp parallel default(shared)
+ {
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+ }
+}
+void
+good_nesting2 (int n)
+{
+ int i;
+#pragma omp parallel default(shared)
+ {
+#pragma omp for
+ for (i = 0; i < n; i++)
+ work1 (i, n);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
new file mode 100644
index 000000000..4196b2d15
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+void
+work (int i, int j)
+{
+}
+
+void
+wrong1 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i, j;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+ /* incorrect nesting of loop regions */
+#pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < n; j++)
+ work (i, j);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c
new file mode 100644
index 000000000..165c86e27
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+void work (int, int);
+
+void
+work1 (int i, int n)
+{
+ int j;
+ /* incorrect nesting of loop regions */
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+}
+
+void
+wrong2 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ work1 (i, n);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
new file mode 100644
index 000000000..31b2ddf03
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+void work (int, int);
+
+void
+wrong3 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+/* incorrect nesting of regions */
+#pragma omp single /* { dg-warning "may not be closely nested" } */
+ work (i, 0);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c
new file mode 100644
index 000000000..d7579e6e7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+wrong4 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+ work (i, 0);
+ /* incorrect nesting of barrier region in a loop region */
+#pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ work (i, 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c
new file mode 100644
index 000000000..7b5301557
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+void
+wrong5 (int n)
+{
+#pragma omp parallel
+ {
+#pragma omp critical
+ {
+ work (n, 0);
+/* incorrect nesting of barrier region in a critical region */
+#pragma omp barrier
+ work (n, 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c
new file mode 100644
index 000000000..ac850e541
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+void
+wrong6 (int n)
+{
+#pragma omp parallel
+ {
+#pragma omp single
+ {
+ work (n, 0);
+/* incorrect nesting of barrier region in a single region */
+#pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ work (n, 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c
new file mode 100644
index 000000000..3581ee27d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+extern int omp_get_num_threads (void);
+void work (int i);
+void
+incorrect ()
+{
+ int np, i;
+ np = omp_get_num_threads (); /* misplaced */
+#pragma omp parallel for schedule(static)
+ for (i = 0; i < np; i++)
+ work (i);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c
new file mode 100644
index 000000000..64256c78d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+extern int omp_get_thread_num (void);
+void work (int i);
+void
+correct ()
+{
+ int i;
+#pragma omp parallel private(i)
+ {
+ i = omp_get_thread_num ();
+ work (i);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c
new file mode 100644
index 000000000..eed21b367
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+#include <math.h>
+void
+a8 (int n, int m, float *a, float *b, float *y, float *z)
+{
+ int i;
+#pragma omp parallel
+ {
+#pragma omp for nowait
+ for (i = 1; i < n; i++)
+ b[i] = (a[i] + a[i - 1]) / 2.0;
+#pragma omp for nowait
+ for (i = 0; i < m; i++)
+ y[i] = sqrt (z[i]);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c
new file mode 100644
index 000000000..45be33f16
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void XAXIS ();
+void YAXIS ();
+void ZAXIS ();
+void
+a9 ()
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ XAXIS ();
+#pragma omp section
+ YAXIS ();
+#pragma omp section
+ ZAXIS ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/asm-1.c b/gcc/testsuite/gcc.dg/gomp/asm-1.c
new file mode 100644
index 000000000..ced31f3b1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/asm-1.c
@@ -0,0 +1,19 @@
+/* PR middle-end/30263 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+void
+foo (void)
+{
+ int s0, s1 = 5, s2 = 6;
+ int p0, p1, p2;
+ int f0 = 4, f1 = 5, f2 = 6;
+#pragma omp parallel shared (s0, s1, s2) private (p0, p1, p2) \
+ firstprivate (f0, f1, f2)
+ {
+ asm ("" : "=m" (p0) : "m" (p1), "mr" (p2));
+ if (omp_get_thread_num () == 0)
+ asm ("" : "=m" (s0) : "m" (s1), "mr" (s2));
+ asm ("" : "=m" (f0) : "m" (f1), "mr" (f2));
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-1.c b/gcc/testsuite/gcc.dg/gomp/atomic-1.c
new file mode 100644
index 000000000..3e4bc569b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-1.c
@@ -0,0 +1,99 @@
+/* { dg-do compile } */
+
+int x;
+volatile int y;
+volatile unsigned char z;
+
+void f1(void)
+{
+ #pragma omp atomic
+ x++;
+ #pragma omp atomic
+ x--;
+ #pragma omp atomic
+ ++x;
+ #pragma omp atomic
+ --x;
+ #pragma omp atomic
+ x += 1;
+ #pragma omp atomic
+ x -= y;
+ #pragma omp atomic
+ x |= 1;
+ #pragma omp atomic
+ x &= 1;
+ #pragma omp atomic
+ x ^= 1;
+ #pragma omp atomic
+ x *= 3;
+ #pragma omp atomic
+ x /= 3;
+ #pragma omp atomic
+ x /= 3;
+ #pragma omp atomic
+ x <<= 3;
+ #pragma omp atomic
+ x >>= 3;
+}
+
+void f2(void)
+{
+ #pragma omp atomic
+ y++;
+ #pragma omp atomic
+ y--;
+ #pragma omp atomic
+ ++y;
+ #pragma omp atomic
+ --y;
+ #pragma omp atomic
+ y += 1;
+ #pragma omp atomic
+ y -= x;
+ #pragma omp atomic
+ y |= 1;
+ #pragma omp atomic
+ y &= 1;
+ #pragma omp atomic
+ y ^= 1;
+ #pragma omp atomic
+ y *= 3;
+ #pragma omp atomic
+ y /= 3;
+ #pragma omp atomic
+ y /= 3;
+ #pragma omp atomic
+ y <<= 3;
+ #pragma omp atomic
+ y >>= 3;
+}
+
+void f3(void)
+{
+ #pragma omp atomic
+ z++;
+ #pragma omp atomic
+ z--;
+ #pragma omp atomic
+ ++z;
+ #pragma omp atomic
+ --z;
+ #pragma omp atomic
+ z += 1;
+ #pragma omp atomic
+ z |= 1;
+ #pragma omp atomic
+ z &= 1;
+ #pragma omp atomic
+ z ^= 1;
+ #pragma omp atomic
+ z *= 3;
+ #pragma omp atomic
+ z /= 3;
+ #pragma omp atomic
+ z /= 3;
+ #pragma omp atomic
+ z <<= 3;
+ #pragma omp atomic
+ z >>= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-10.c b/gcc/testsuite/gcc.dg/gomp/atomic-10.c
new file mode 100644
index 000000000..936d0c1f2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-10.c
@@ -0,0 +1,24 @@
+/* PR middle-end/28046 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+int a[3], b;
+struct C { int x; int y; } c;
+
+int bar (void), *baz (void);
+
+void
+foo (void)
+{
+#pragma omp atomic
+ a[2] += bar ();
+#pragma omp atomic
+ b += bar ();
+#pragma omp atomic
+ c.y += bar ();
+#pragma omp atomic
+ *baz () += bar ();
+}
+
+/* { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 4 "ompexp" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-11.c b/gcc/testsuite/gcc.dg/gomp/atomic-11.c
new file mode 100644
index 000000000..397972b3c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-11.c
@@ -0,0 +1,17 @@
+/* PR middle-end/36877 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+/* { dg-options "-fopenmp -march=i386" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+int i;
+float f;
+
+void foo (void)
+{
+#pragma omp atomic
+ i++;
+#pragma omp atomic
+ f += 1.0;
+}
+
+/* { dg-final { scan-assembler-not "__sync_(fetch|add|bool|val)" { target i?86-*-* x86_64-*-* powerpc*-*-* ia64-*-* s390*-*-* sparc*-*-* } } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-12.c b/gcc/testsuite/gcc.dg/gomp/atomic-12.c
new file mode 100644
index 000000000..618c4c8e6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-12.c
@@ -0,0 +1,306 @@
+/* PR middle-end/45423 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple -g0" } */
+/* atomicvar should never be referenced in between the barrier and
+ following #pragma omp atomic_load. */
+/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
+
+#ifdef __cplusplus
+bool atomicvar, c;
+#else
+_Bool atomicvar, c;
+#endif
+int i, atomicvar2, c2;
+
+int
+foo (void)
+{
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar |= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar |= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar |= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar |= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar |= c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar ^= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar ^= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar ^= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar ^= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar ^= c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar &= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar &= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar &= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar &= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar &= c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar += -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar += 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar += 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar += 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar += c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar -= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar -= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar -= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar -= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar -= c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar *= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar *= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar *= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar *= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar *= c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar /= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar /= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar /= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar /= c;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar <<= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar <<= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar <<= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar <<= i;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar >>= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar >>= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar >>= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar >>= i;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar++;
+ #pragma omp barrier
+ #pragma omp atomic
+ ++atomicvar;
+ #pragma omp barrier
+#ifndef __cplusplus
+ #pragma omp atomic
+ atomicvar--;
+ #pragma omp barrier
+ #pragma omp atomic
+ --atomicvar;
+ #pragma omp barrier
+#endif
+ return 0;
+}
+
+int
+bar (void)
+{
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 |= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 |= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 |= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 |= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 |= c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 ^= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 ^= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 ^= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 ^= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 ^= c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 &= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 &= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 &= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 &= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 &= c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 += -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 += 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 += 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 += 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 += c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 -= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 -= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 -= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 -= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 -= c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 *= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 *= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 *= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 *= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 *= c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 /= -1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 /= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 /= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 /= c2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 <<= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 <<= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 <<= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 <<= i;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 >>= 0;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 >>= 1;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 >>= 2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2 >>= i;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2++;
+ #pragma omp barrier
+ #pragma omp atomic
+ ++atomicvar2;
+ #pragma omp barrier
+ #pragma omp atomic
+ atomicvar2--;
+ #pragma omp barrier
+ #pragma omp atomic
+ --atomicvar2;
+ #pragma omp barrier
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-13.c b/gcc/testsuite/gcc.dg/gomp/atomic-13.c
new file mode 100644
index 000000000..0146825f2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-13.c
@@ -0,0 +1,9 @@
+/* PR middle-end/45423 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple -g0 -O2" } */
+/* atomicvar should never be referenced in between the barrier and
+ following #pragma omp atomic_load. */
+/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
+
+#include "atomic-12.c"
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-14.c b/gcc/testsuite/gcc.dg/gomp/atomic-14.c
new file mode 100644
index 000000000..f8fc9d872
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-14.c
@@ -0,0 +1,43 @@
+/* PR middle-end/45423 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#ifdef __cplusplus
+bool *baz ();
+#else
+_Bool *baz ();
+#endif
+int *bar ();
+
+int
+foo (void)
+{
+ #pragma omp barrier
+ #pragma omp atomic
+ (*bar ())++;
+ #pragma omp barrier
+ #pragma omp atomic
+ ++(*bar ());
+ #pragma omp barrier
+ #pragma omp atomic
+ (*bar ())--;
+ #pragma omp barrier
+ #pragma omp atomic
+ --(*bar ());
+ #pragma omp barrier
+ #pragma omp atomic
+ (*baz ())++;
+ #pragma omp barrier
+ #pragma omp atomic
+ ++(*baz ());
+#ifndef __cplusplus
+ #pragma omp barrier
+ #pragma omp atomic
+ (*baz ())--;
+ #pragma omp barrier
+ #pragma omp atomic
+ --(*baz ());
+ #pragma omp barrier
+#endif
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-2.c b/gcc/testsuite/gcc.dg/gomp/atomic-2.c
new file mode 100644
index 000000000..720ec9e8b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-2.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+float x, y;
+
+void f1(void)
+{
+ #pragma omp atomic
+ x++;
+ #pragma omp atomic
+ x--;
+ #pragma omp atomic
+ ++x;
+ #pragma omp atomic
+ --x;
+ #pragma omp atomic
+ x += 1;
+ #pragma omp atomic
+ x -= y;
+ #pragma omp atomic
+ x *= 3;
+ #pragma omp atomic
+ x /= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-3.c b/gcc/testsuite/gcc.dg/gomp/atomic-3.c
new file mode 100644
index 000000000..7ea792d34
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-3.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+int *xyzzy;
+
+void f1(void)
+{
+ #pragma omp atomic
+ xyzzy++;
+}
+
+/* { dg-final { scan-tree-dump-times "xyzzy, 4" 1 "ompexp" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-4.c b/gcc/testsuite/gcc.dg/gomp/atomic-4.c
new file mode 100644
index 000000000..7f27370d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-4.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+int a[4];
+int *p;
+struct S { int x; int y[4]; } s;
+int *bar(void);
+
+void f1(void)
+{
+ #pragma omp atomic
+ a[4] += 1;
+ #pragma omp atomic
+ *p += 1;
+ #pragma omp atomic
+ s.x += 1;
+ #pragma omp atomic
+ s.y[*p] += 1;
+ #pragma omp atomic
+ s.y[*p] *= 42;
+ #pragma omp atomic
+ *bar() += 1;
+ #pragma omp atomic
+ *bar() *= 42;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-5.c b/gcc/testsuite/gcc.dg/gomp/atomic-5.c
new file mode 100644
index 000000000..be7cbb862
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-5.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+
+int x;
+const int y;
+int bar(void);
+
+void f1(void)
+{
+ register int z;
+
+ #pragma omp atomic
+ x %= 2; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ x = x + 1; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ x = 1; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ ++y; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ y--; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ y += 1; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ z += 1; /* { dg-error "register variable" } */
+ #pragma omp atomic
+ bar(); /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ bar() += 1; /* { dg-error "lvalue required" } */
+ #pragma omp atomic a /* { dg-error "expected end of line" } */
+ x++;
+ #pragma omp atomic
+ ; /* { dg-error "expected expression" } */
+ #pragma omp atomic
+ #pragma omp atomic /* { dg-error "expected expression" } */
+ ;
+ /* Check that we didn't get stuck on the pragma eol marker. */
+ undef; /* { dg-error "" } */
+ /* { dg-message "undeclared identifier is reported only once" "reminder" { target *-*-* } 37 } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-6.c b/gcc/testsuite/gcc.dg/gomp/atomic-6.c
new file mode 100644
index 000000000..0d56becd8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-6.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+int x[10], z;
+double y[10];
+
+void f1(void)
+{
+ #pragma omp atomic
+ x[z] /= y[z];
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-7.c b/gcc/testsuite/gcc.dg/gomp/atomic-7.c
new file mode 100644
index 000000000..612e97f45
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-7.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+double x, y;
+
+void f2(void)
+{
+ #pragma omp atomic
+ y++;
+ #pragma omp atomic
+ y--;
+ #pragma omp atomic
+ ++y;
+ #pragma omp atomic
+ --y;
+ #pragma omp atomic
+ y += 1;
+ #pragma omp atomic
+ y -= x;
+ #pragma omp atomic
+ y *= 3;
+ #pragma omp atomic
+ y /= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-8.c b/gcc/testsuite/gcc.dg/gomp/atomic-8.c
new file mode 100644
index 000000000..2f04151f0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-8.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+long double z;
+
+void f3(void)
+{
+ #pragma omp atomic
+ z++;
+ #pragma omp atomic
+ z--;
+ #pragma omp atomic
+ ++z;
+ #pragma omp atomic
+ --z;
+ #pragma omp atomic
+ z += 1;
+ #pragma omp atomic
+ z *= 3;
+ #pragma omp atomic
+ z /= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-9.c b/gcc/testsuite/gcc.dg/gomp/atomic-9.c
new file mode 100644
index 000000000..2fafbd409
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-9.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+volatile int *bar(void);
+
+void f1(void)
+{
+ #pragma omp atomic
+ *bar() += 1;
+}
+
+/* { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 1 "ompexp" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/barrier-1.c b/gcc/testsuite/gcc.dg/gomp/barrier-1.c
new file mode 100644
index 000000000..ef7c9afb1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/barrier-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+void f1(void)
+{
+ #pragma omp barrier
+}
+
+void f2(_Bool p)
+{
+ if (p)
+ {
+ #pragma omp barrier
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_barrier" 2 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/barrier-2.c b/gcc/testsuite/gcc.dg/gomp/barrier-2.c
new file mode 100644
index 000000000..3787c35a1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/barrier-2.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp barrier a /* { dg-error "expected end of line" } */
+}
+
+/* OpenMP 2.5, section 2.7.3:
+
+ Note that because the barrier construct does not have a C language
+ statement as part of its syntax, there are some restrictions on its
+ placement within a program. The barrier directive may only be placed
+ in the program at a position where ignoring or deleting the directive
+ would result in a program with correct syntax. */
+
+void f2(void)
+{
+ label: /* { dg-error "label at end of compound statement" } */
+ #pragma omp barrier
+}
+
+void f3(_Bool p)
+{
+ if (p)
+ #pragma omp barrier /* { dg-error "compound statements" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-1.c b/gcc/testsuite/gcc.dg/gomp/block-1.c
new file mode 100644
index 000000000..dd7fe7783
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-1.c
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+void foo()
+{
+ bad1:
+ #pragma omp parallel
+ goto bad1; // { dg-error "invalid branch" }
+
+ goto bad2; // { dg-error "invalid entry" }
+ #pragma omp parallel
+ {
+ bad2: ;
+ }
+
+ #pragma omp parallel
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-10.c b/gcc/testsuite/gcc.dg/gomp/block-10.c
new file mode 100644
index 000000000..76ee39745
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-10.c
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+void foo(int i)
+{
+ int j;
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp parallel
+ { case 0:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp for
+ for (j = 0; j < 10; ++ j)
+ { case 1:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp critical
+ { case 2:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp master
+ { case 3:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp sections
+ { case 4:;
+ #pragma omp section
+ { case 5:; }
+ }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp ordered
+ { default:; }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-11.c b/gcc/testsuite/gcc.dg/gomp/block-11.c
new file mode 100644
index 000000000..c2800061b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-11.c
@@ -0,0 +1,19 @@
+/* PR c++/24516 */
+/* { dg-do compile } */
+
+void
+bar (int *p)
+{
+ int m;
+#pragma omp parallel for
+ for (m = 0; m < 1000; ++m)
+ switch (p[m])
+ {
+ case 1:
+ p[m] = 2;
+ break;
+ default:
+ p[m] = 3;
+ break;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-2.c b/gcc/testsuite/gcc.dg/gomp/block-2.c
new file mode 100644
index 000000000..4c56add57
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-2.c
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i, j;
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ break; // { dg-error "break" }
+
+ bad1:
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ goto bad1; // { dg-error "invalid branch" }
+
+ goto bad2; // { dg-error "invalid entry" }
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ {
+ bad2: ;
+ }
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ for (j = 0; j < 10; ++j)
+ if (i == j)
+ break;
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ continue;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-3.c b/gcc/testsuite/gcc.dg/gomp/block-3.c
new file mode 100644
index 000000000..c72b04c35
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-3.c
@@ -0,0 +1,57 @@
+// { dg-do compile }
+
+extern int test(int);
+void foo()
+{
+ int i;
+
+ for (i = 0; i < 10; ++i)
+ {
+ #pragma omp sections
+ {
+ continue; // { dg-error "invalid branch" }
+ }
+ }
+
+ #pragma omp sections
+ {
+ #pragma omp section
+ { bad1: ; }
+ #pragma omp section
+ goto bad1; // { dg-error "invalid branch" }
+ }
+
+ #pragma omp sections
+ {
+ goto bad2; // { dg-error "invalid branch" }
+ }
+ bad2:;
+
+ goto bad3; // { dg-error "invalid entry" }
+ #pragma omp sections
+ {
+ bad3: ;
+ }
+
+ #pragma omp sections
+ {
+ goto ok1;
+ ok1:;
+
+ #pragma omp section
+ for (i = 0; i < 10; ++i)
+ if (test(i))
+ break;
+ else
+ continue;
+
+ #pragma omp section
+ switch (i)
+ {
+ case 0:
+ break;
+ default:
+ test(i);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-4.c b/gcc/testsuite/gcc.dg/gomp/block-4.c
new file mode 100644
index 000000000..61f490c00
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-4.c
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp critical
+ {
+ return; // { dg-error "invalid branch" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-5.c b/gcc/testsuite/gcc.dg/gomp/block-5.c
new file mode 100644
index 000000000..741049fdd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-5.c
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp master
+ {
+ goto bad1; // { dg-error "invalid branch" }
+ }
+
+ #pragma omp master
+ {
+ bad1:
+ return; // { dg-error "invalid branch" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-6.c b/gcc/testsuite/gcc.dg/gomp/block-6.c
new file mode 100644
index 000000000..87e6392e5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-6.c
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp ordered
+ {
+ return; // { dg-error "invalid branch" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-7.c b/gcc/testsuite/gcc.dg/gomp/block-7.c
new file mode 100644
index 000000000..2bc1cdb57
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-7.c
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i, j;
+ for (i = 0; i < 10; ++i)
+ {
+ #pragma omp for
+ for (j = ({ continue; 0; }); // { dg-error "invalid branch" }
+ j < ({ continue; 10; }); // { dg-error "invalid branch" }
+ j += ({ continue; 1; })) // { dg-error "invalid branch" }
+ continue;
+
+ #pragma omp for
+ for (j = ({ break; 0; }); // { dg-error "invalid branch" }
+ j < ({ break; 10; }); // { dg-error "invalid branch" }
+ j += ({ break; 1; })) // { dg-error "invalid branch" }
+ break; // { dg-error "break" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-8.c b/gcc/testsuite/gcc.dg/gomp/block-8.c
new file mode 100644
index 000000000..3c717d927
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-8.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// PR 24451
+
+int foo()
+{
+ int i;
+
+ #pragma omp parallel for
+ for (i = 0; i < 10; ++i)
+ return 0; // { dg-error "invalid branch" }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-9.c b/gcc/testsuite/gcc.dg/gomp/block-9.c
new file mode 100644
index 000000000..9217cb749
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-9.c
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+void foo(int i)
+{
+ int j;
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp parallel
+ { case 0:; }
+ #pragma omp for
+ for (j = 0; j < 10; ++ j)
+ { case 1:; }
+ #pragma omp critical
+ { case 2:; }
+ #pragma omp master
+ { case 3:; }
+ #pragma omp sections
+ { case 4:;
+ #pragma omp section
+ { case 5:; }
+ }
+ #pragma omp ordered
+ { default:; }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/clause-1.c b/gcc/testsuite/gcc.dg/gomp/clause-1.c
new file mode 100644
index 000000000..ace973804
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/clause-1.c
@@ -0,0 +1,94 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#define p parallel
+
+extern void bar (void);
+extern char q[];
+int t;
+#pragma omp threadprivate (t)
+
+void
+foo (int x)
+{
+ char *p;
+ struct S { int i; int j; } s;
+ char a[32];
+ double d;
+ int i;
+ const int c = 8;
+#pragma omp p shared (x, x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p private (x) private (x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p shared (x) firstprivate (x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p firstprivate (x, x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p for shared (x) lastprivate (x) /* { dg-error "more than" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p for private (x) lastprivate (x) /* { dg-error "more than" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p for lastprivate (x, x) /* { dg-error "more than once" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp single private (x) copyprivate (x) /* { dg-error "more than" } */
+ ;
+#pragma omp p shared (bar) /* { dg-error "is not a variable" } */
+ ;
+#pragma omp p private (bar) /* { dg-error "is not a variable" } */
+ ;
+#pragma omp p firstprivate (bar) /* { dg-error "is not a variable" } */
+ ;
+#pragma omp p reduction (+:p) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p reduction (*:s) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p reduction (-:a) /* { dg-error "has invalid type for" } */
+ ;
+ d = 0;
+#pragma omp p reduction (*:d)
+ ;
+#pragma omp p reduction (|:d) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p reduction (&&:d) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p copyin (d) /* { dg-error "must be 'threadprivate'" } */
+ ;
+#pragma omp p copyin (x) /* { dg-error "must be 'threadprivate'" } */
+ ;
+#pragma omp p for firstprivate (x) lastprivate (x)
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p private (q) /* { dg-error "incomplete type" } */
+ ;
+#pragma omp p firstprivate (q) /* { dg-error "incomplete type" } */
+ ;
+#pragma omp p for lastprivate (q) /* { dg-error "incomplete type" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p shared (t) /* { dg-error "predetermined 'threadprivate'" } */
+ ;
+#pragma omp p private (t) /* { dg-error "predetermined 'threadprivate'" } */
+ ;
+#pragma omp p firstprivate (t) /* { dg-error "predetermined 'threadpriv" } */
+ ;
+#pragma omp p for lastprivate (t) /* { dg-error "predetermined 'threadpr" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p reduction (*:t) /* { dg-error "predetermined 'threadprivate" } */
+ ;
+#pragma omp p shared (c) /* { dg-error "predetermined 'shared'" } */
+ ;
+#pragma omp p private (c) /* { dg-error "predetermined 'shared'" } */
+ ;
+#pragma omp p firstprivate (c) /* { dg-error "predetermined 'shared'" } */
+ ;
+#pragma omp p for lastprivate (c) /* { dg-error "predetermined 'shared'" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p reduction (*:c) /* { dg-error "predetermined 'shared'" } */
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/clause-2.c b/gcc/testsuite/gcc.dg/gomp/clause-2.c
new file mode 100644
index 000000000..4b12fc8f0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/clause-2.c
@@ -0,0 +1,23 @@
+/* PR c/34506 */
+/* { dg-do compile } */
+
+#define p parallel
+
+void
+foo (int x)
+{
+#pragma omp p num_threads (4) if (1) private (x)
+ ;
+#pragma omp p num_threads(4)if(1)private(x)
+ ;
+#pragma omp p num_threads (4), if (1) , private (x)
+ ;
+#pragma omp p num_threads(4),if(1),private(x)
+ ;
+#pragma omp p, num_threads (4), if (1), private (x) /* { dg-error "clause before" } */
+ ;
+#pragma omp p num_threads (4), if (1), private (x), /* { dg-error "clause before" } */
+ ;
+#pragma omp p num_threads (4), , if (1), private (x) /* { dg-error "clause before" } */
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/collapse-1.c b/gcc/testsuite/gcc.dg/gomp/collapse-1.c
new file mode 100644
index 000000000..89b76bb66
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/collapse-1.c
@@ -0,0 +1,92 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+int i, j, k;
+extern int foo (void);
+
+void
+f1 (void)
+{
+ #pragma omp for collapse (2)
+ for (i = 0; i < 5; i++)
+ ; /* { dg-error "not enough perfectly nested" } */
+ {
+ for (j = 0; j < 5; j++)
+ ;
+ }
+}
+
+void
+f2 (void)
+{
+ #pragma omp for collapse (2)
+ for (i = 0; i < 5; i++)
+ {
+ {
+ {
+ for (j = 0; j < 5; j++)
+ {
+ }
+ }
+ }
+ }
+}
+
+void
+f3 (void)
+{
+ #pragma omp for collapse (2)
+ for (i = 0; i < 5; i++)
+ {
+ int k = foo (); /* { dg-error "not enough perfectly nested" } */
+ {
+ {
+ for (j = 0; j < 5; j++)
+ {
+ }
+ }
+ }
+ }
+}
+
+void
+f4 (void)
+{
+ #pragma omp for collapse (2)
+ for (i = 0; i < 5; i++)
+ {
+ {
+ for (j = 0; j < 5; j++)
+ ;
+ foo (); /* { dg-error "collapsed loops not perfectly nested before" } */
+ }
+ }
+}
+
+void
+f5 (void)
+{
+ #pragma omp for collapse (2)
+ for (i = 0; i < 5; i++)
+ {
+ {
+ for (j = 0; j < 5; j++)
+ ;
+ }
+ foo (); /* { dg-error "collapsed loops not perfectly nested before" } */
+ }
+}
+
+void
+f6 (void)
+{
+ #pragma omp for collapse (2)
+ for (i = 0; i < 5; i++)
+ {
+ {
+ for (j = 0; j < 5; j++)
+ ;
+ }
+ }
+ foo ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/combined-1.c b/gcc/testsuite/gcc.dg/gomp/combined-1.c
new file mode 100644
index 000000000..dfed64737
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/combined-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fopenmp -fdump-tree-optimized" } */
+
+int a[10];
+int foo (void)
+{
+ int i;
+#pragma omp parallel for schedule(runtime)
+ for (i = 0; i < 10; i++)
+ a[i] = i;
+#pragma omp parallel
+#pragma omp for schedule(runtime)
+ for (i = 0; i < 10; i++)
+ a[i] = 10 - i;
+#pragma omp parallel
+ {
+#pragma omp for schedule(runtime)
+ for (i = 0; i < 10; i++)
+ a[i] = i;
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_runtime_start" 3 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/complex-1.c b/gcc/testsuite/gcc.dg/gomp/complex-1.c
new file mode 100644
index 000000000..0858ac9d3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/complex-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O1" } */
+/* PR middle-end/30143 */
+
+
+int f (int n)
+{
+ int i;
+ _Complex float t;
+#pragma omp parallel
+ for (i = 1; i < n - 1; ++i)
+ t+=1;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/copyin-1.c b/gcc/testsuite/gcc.dg/gomp/copyin-1.c
new file mode 100644
index 000000000..117f82f81
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/copyin-1.c
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+int i, j;
+
+#pragma omp threadprivate (i)
+
+void bar(void);
+void foo(void)
+{
+ int k;
+ extern int l;
+ extern int m;
+
+#pragma omp threadprivate (m)
+
+ #pragma omp parallel copyin(i)
+ bar();
+ #pragma omp parallel copyin(j) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(k) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(l) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(m)
+ bar();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-1.c b/gcc/testsuite/gcc.dg/gomp/critical-1.c
new file mode 100644
index 000000000..6f3348c88
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp critical
+ bar(0);
+
+ /* Note that "name" is in its own namespace, thus this foo is not
+ the same as the function. */
+ #pragma omp critical(foo)
+ {
+ bar(1);
+ bar(2);
+ }
+
+ #pragma omp critical
+ #pragma omp critical(foo)
+ bar(3);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_critical_start" 2 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_end" 2 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_name_start" 2 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_name_end" 2 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-2.c b/gcc/testsuite/gcc.dg/gomp/critical-2.c
new file mode 100644
index 000000000..d1ba3963f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-2.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp critical a /* { dg-error "expected" } */
+ ;
+ #pragma omp critical ( /* { dg-error "expected identifier" } */
+ ;
+ #pragma omp critical (a /* { dg-error "expected .\\)." } */
+ ;
+ #pragma omp critical (a b) /* { dg-error "expected .\\)." } */
+} /* { dg-error "expected expression" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-3.c b/gcc/testsuite/gcc.dg/gomp/critical-3.c
new file mode 100644
index 000000000..c0046f571
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-3.c
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-ompexp" }
+
+void bar(void);
+void foo(void)
+{
+ #pragma omp critical (xyzzy)
+ bar();
+}
+
+// { dg-final { scan-tree-dump-times "\\&\\.gomp_critical_user_xyzzy" 2 "ompexp" } }
+// { dg-final { cleanup-tree-dump "ompexp" } }
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-4.c b/gcc/testsuite/gcc.dg/gomp/critical-4.c
new file mode 100644
index 000000000..530e7c976
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-4.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void
+foo1 (void)
+{
+ #pragma omp critical
+ #pragma omp critical(foo)
+ #pragma omp critical(bar)
+ bar (0);
+}
+
+void
+foo2 (void)
+{
+ #pragma omp critical
+ #pragma omp critical /* { dg-warning "with the same name" } */
+ bar (0);
+}
+
+void
+foo3 (void)
+{
+ #pragma omp critical(foo)
+ #pragma omp critical(foo) /* { dg-warning "with the same name" } */
+ bar (0);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/empty.c b/gcc/testsuite/gcc.dg/gomp/empty.c
new file mode 100644
index 000000000..6a21c0460
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/empty.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -fdump-tree-ompexp" } */
+
+main()
+{
+#pragma omp parallel
+ {;}
+}
+
+/* There should not be a GOMP_parallel_start call. */
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_start" 0 "ompexp"} } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/flush-1.c b/gcc/testsuite/gcc.dg/gomp/flush-1.c
new file mode 100644
index 000000000..d1a4d4a5b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/flush-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+void f1(void)
+{
+ #pragma omp flush
+}
+
+int x, y, z;
+
+void f2(_Bool p)
+{
+ if (p)
+ {
+ #pragma omp flush (x)
+ }
+ else
+ {
+ #pragma omp flush (x, y, z)
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "__sync_synchronize" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/flush-2.c b/gcc/testsuite/gcc.dg/gomp/flush-2.c
new file mode 100644
index 000000000..25878c85b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/flush-2.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-message "undeclared identifier is reported only once" "reminder" { target *-*-* } 0 } */
+void f1(void)
+{
+ #pragma omp flush a /* { dg-error "expected" } */
+ #pragma omp flush ( /* { dg-error "expected identifier" } */
+ #pragma omp flush (b /* { dg-error "undeclared|expected|for each" } */
+ #pragma omp flush (c d) /* { dg-error "undeclared|expected" } */
+ #pragma omp flush (e) /* { dg-error "undeclared" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-1.c b/gcc/testsuite/gcc.dg/gomp/for-1.c
new file mode 100644
index 000000000..384293e82
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-1.c
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fshow-column" } */
+
+void foo (int j, int k)
+{
+ int i;
+
+ /* Valid loops. */
+ #pragma omp for
+ for (i = 0; i < 10; i++)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i <= 10; i+=4)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i > 0; i = i - 1)
+ baz (j);
+
+ #pragma omp for
+ for (i = j; i >= k; i--)
+ baz (i);
+
+ /* Malformed parallel loops. */
+ #pragma omp for
+ i = 0; /* { dg-error "3:for statement expected" } */
+ for ( ; i < 10; )
+ {
+ baz (i);
+ i++;
+ }
+
+ #pragma omp for
+ for (i = 0; ; i--) /* { dg-error "missing controlling predicate" } */
+ {
+ if (i >= 10)
+ break; /* { dg-error "break" } */
+ baz (i);
+ }
+
+ #pragma omp for
+ for (i = 0; i < 10 && j > 4; i-=3) /* { dg-error "15:invalid controlling predicate" } */
+ baz (i);
+
+ #pragma omp for
+ for (i = 0; i < 10; i-=3, j+=2) /* { dg-error "27:invalid increment expression" } */
+ baz (i);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-10.c b/gcc/testsuite/gcc.dg/gomp/for-10.c
new file mode 100644
index 000000000..f21404249
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-10.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(runtime) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-11.c b/gcc/testsuite/gcc.dg/gomp/for-11.c
new file mode 100644
index 000000000..8c747cdb9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-11.c
@@ -0,0 +1,73 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -fopenmp" } */
+
+extern void baz (int);
+
+void foo (int j, int k)
+{
+ int i;
+
+ /* Valid loops. */
+ #pragma omp for
+ for (i = 0; i < 10; i++)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i <= 10; i+=4)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i > 0; i = i - 1)
+ baz (j);
+
+ #pragma omp for
+ for (i = j; i >= k; i--)
+ baz (i);
+
+ #pragma omp for
+ for (int l = j; l < 10; l++)
+ baz (l);
+
+ /* Malformed parallel loops. */
+ #pragma omp for
+ i = 0; /* { dg-error "for statement expected" } */
+ for ( ; i < 10; )
+ {
+ baz (i);
+ i++;
+ }
+
+ #pragma omp for
+ for (i = 0; ; i--) /* { dg-error "missing controlling predicate" } */
+ {
+ if (i >= 10)
+ break; /* { dg-error "break" } */
+ baz (i);
+ }
+
+ #pragma omp for
+ for (i = 0;
+ i < 10 && j > 4; /* { dg-error "invalid controlling predicate" } */
+ i-=3)
+ baz (i);
+
+ #pragma omp for
+ for (i = 0;
+ i < 10;
+ i-=3, j+=2) /* { dg-error "invalid increment expression" } */
+ baz (i);
+
+ int m = 0;
+ #pragma omp for
+ for (; m < 10; m++) /* { dg-error "expected" } */
+ baz (m);
+
+ m = 0;
+ #pragma omp for
+ for (int n = 0; m < 10; m++) /* { dg-error "invalid controlling predicate|invalid increment expression" } */
+ baz (m);
+
+ #pragma omp for
+ for (m = 0; m < 10; i++) /* { dg-error "invalid increment expression" } */
+ baz (m);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-12.c b/gcc/testsuite/gcc.dg/gomp/for-12.c
new file mode 100644
index 000000000..98318d7d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-12.c
@@ -0,0 +1,12 @@
+int foo (void)
+{
+ int i, a;
+
+ a = 30;
+
+ #pragma omp parallel for lastprivate (a)
+ for (i = 0; i < 10; i++)
+ a = a + i;
+
+ return a;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-13.c b/gcc/testsuite/gcc.dg/gomp/for-13.c
new file mode 100644
index 000000000..607de49c7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-13.c
@@ -0,0 +1,18 @@
+// At one point in development, a typo disabled the remapping of the
+// for iteration variable as private.
+
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-ompexp" }
+
+extern void bar(int);
+void foo(void)
+{
+ int i;
+
+#pragma omp parallel for default(none)
+ for (i = 0; i < 10; i++)
+ bar(i);
+}
+
+// { dg-final { scan-tree-dump-times "omp_data_o" 0 "ompexp" } }
+// { dg-final { cleanup-tree-dump "ompexp" } }
diff --git a/gcc/testsuite/gcc.dg/gomp/for-14.c b/gcc/testsuite/gcc.dg/gomp/for-14.c
new file mode 100644
index 000000000..fb2641370
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-14.c
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+extern int printf (const char *, ...);
+extern void foo (int *);
+
+int main (void)
+{
+ double d = 6;
+ int i = 1, j = 6, k = 8;
+#pragma omp parallel shared(d) private(i) num_threads (4)
+ {
+ i = 4;
+#pragma omp for lastprivate(j)
+ for (j = 1; j <= k; j++)
+ printf ("%s %d %d %d %p %g\n", "Hello, World!", i, j, k, &j, d);
+ printf ("%s %d %g\n", "Hello, World!", i, d);
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-15.c b/gcc/testsuite/gcc.dg/gomp/for-15.c
new file mode 100644
index 000000000..28c2c926c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-15.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void foo()
+{
+ long n = 10;
+ int i;
+#pragma omp for
+ for (i=0; i < n; ++i) ;
+#pragma omp for
+ for (i=0; n > i; ++i) ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-16.c b/gcc/testsuite/gcc.dg/gomp/for-16.c
new file mode 100644
index 000000000..2f221e4c1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-16.c
@@ -0,0 +1,18 @@
+// PR 24703
+// { dg-do compile }
+
+void work(int);
+int work_param;
+int sphinx_omp_thread_count;
+int schedule_loop_cap;
+
+int measure_omp_parallel_for_dynamic (void)
+{
+ int j;
+
+#pragma omp parallel for schedule(dynamic)
+ for(j=0; j < sphinx_omp_thread_count * schedule_loop_cap; j++)
+ work(work_param);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-17.c b/gcc/testsuite/gcc.dg/gomp/for-17.c
new file mode 100644
index 000000000..1c51f1a4c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-17.c
@@ -0,0 +1,67 @@
+/* { dg-do compile } */
+extern int bar (int);
+
+void
+foo (void)
+{
+ int j, k = 1, l = 30, m = 4;
+ long int o = 4;
+ long long int p = 0;
+#pragma omp for
+ for (j = k; j <= l; j += m - 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += bar (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + m - 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + bar (m - 1))
+ ;
+#pragma omp for
+ for (j = ({ int n; n = k; n; }); j <= l; j++)
+ ;
+#pragma omp for
+ for (j = k; j <= ({ int n; n = l; n; }); j++)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += ({ int n; n = 1; n; }))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += m + 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += o)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + o)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = o + 1 + j)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = o + m + j)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += o + p)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + o + p)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= o)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= p)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= o + p)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-18.c b/gcc/testsuite/gcc.dg/gomp/for-18.c
new file mode 100644
index 000000000..545f271c8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-18.c
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -fdump-tree-ompexp" } */
+
+void
+foo (int *a, int i)
+{
+ int j, k = 1, l = 30, m = 4;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 1;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 2;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 3;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 4;
+}
+
+void
+bar (int *a, int i)
+{
+ int j, k = 1, l = 30, m = 4;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, i * 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 1;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, i * 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 2;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 3;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 4;
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_dynamic_start" 4 "ompexp" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_guided_start" 4 "ompexp" { xfail *-*-* } } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-19.c b/gcc/testsuite/gcc.dg/gomp/for-19.c
new file mode 100644
index 000000000..a202ba479
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-19.c
@@ -0,0 +1,21 @@
+/* Verify that if GOMP_parallel_loop_dynamic_start is used, variables
+ mentioned in the INIT, COND and INCR expressions aren't unnecessarily
+ copied to the omp_fn function. */
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -fdump-tree-gimple" } */
+
+void foo (int *a, int i, int j, int k, int l, int m)
+{
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = 0; j <= (6 * l + 4 * k); j++)
+ a[j] = 1;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = m; j <= l; j += (k + l - m))
+ a[j] = 1;
+}
+
+/* { dg-final { scan-tree-dump-times "shared\\(a\\)" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "shared\\(k\\)" 0 "gimple" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "shared\\(l\\)" 0 "gimple" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "shared\\(m\\)" 0 "gimple" { xfail *-*-* } } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-2.c b/gcc/testsuite/gcc.dg/gomp/for-2.c
new file mode 100644
index 000000000..37e5929af
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-2.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void foo()
+{
+ int i;
+
+ #pragma omp for nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for nowait nowait /* { dg-error "too many" } */
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for ordered
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for ordered ordered /* { dg-error "too many" } */
+ for (i = 0; i < 10; ++i) ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-3.c b/gcc/testsuite/gcc.dg/gomp/for-3.c
new file mode 100644
index 000000000..f3b0dbda7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-3.c
@@ -0,0 +1,62 @@
+// { dg-do compile }
+
+int bar ();
+
+void foo()
+{
+ int i;
+
+ #pragma omp for schedule // { dg-error "expected '\\('" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule static // { dg-error "expected '\\('" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( // { dg-error "invalid schedule kind" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static )
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( foo ) // { dg-error "invalid schedule kind" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static 1 // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static 1 ) nowait // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1 ) nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1, 1 ) nowait // { dg-error "expected '\\)'" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1 + 1 ) nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1.0 ) // { dg-error "expected integer expression" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (dynamic)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (dynamic, bar ())
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (guided)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (guided, bar ())
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (runtime)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (runtime, bar ()) // { dg-error "does not take" }
+ for (i = 0; i < 10; ++i) ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-4.c b/gcc/testsuite/gcc.dg/gomp/for-4.c
new file mode 100644
index 000000000..fb6994ea2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-4.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(dynamic)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-5.c b/gcc/testsuite/gcc.dg/gomp/for-5.c
new file mode 100644
index 000000000..5912a4e55
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-5.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(guided)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-6.c b/gcc/testsuite/gcc.dg/gomp/for-6.c
new file mode 100644
index 000000000..100ee2c8c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-6.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(runtime)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-7.c b/gcc/testsuite/gcc.dg/gomp/for-7.c
new file mode 100644
index 000000000..10763dc59
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-7.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(static) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-8.c b/gcc/testsuite/gcc.dg/gomp/for-8.c
new file mode 100644
index 000000000..1bc66c49a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-8.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(dynamic) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-9.c b/gcc/testsuite/gcc.dg/gomp/for-9.c
new file mode 100644
index 000000000..af99e216e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-9.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(guided) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_start" 1 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_next" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/gomp.exp b/gcc/testsuite/gcc.dg/gomp/gomp.exp
new file mode 100644
index 000000000..e4f31cca9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/gomp.exp
@@ -0,0 +1,36 @@
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+if ![check_effective_target_fopenmp] {
+ return
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [find $srcdir/$subdir *.c]] \
+ "" "-fopenmp"
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-1.c b/gcc/testsuite/gcc.dg/gomp/macro-1.c
new file mode 100644
index 000000000..b04610d2c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/macro-1.c
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+#define N 10
+
+extern void bar(void);
+void foo(void)
+{
+ #pragma omp parallel num_threads(N)
+ bar();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-2.c b/gcc/testsuite/gcc.dg/gomp/macro-2.c
new file mode 100644
index 000000000..75d6490cd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/macro-2.c
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+#define p parallel
+#define s(x) shared(x##1, x##2)
+#define d(x) default(x)
+
+void bar(int, int, int, int);
+void foo(void)
+{
+ int a1, a2, b1, b2;
+
+ #pragma omp p s(a) s(b) d(none)
+ bar(a1, a2, b1, b2);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-3.c b/gcc/testsuite/gcc.dg/gomp/macro-3.c
new file mode 100644
index 000000000..233d2edcd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/macro-3.c
@@ -0,0 +1,26 @@
+/* PR preprocessor/27746 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+#define omp FOO
+#define p parallel
+#define omp_parallel _Pragma ("omp parallel")
+#define omp_p _Pragma ("omp p")
+
+void bar (void);
+
+void
+foo (void)
+{
+ #pragma omp parallel
+ bar ();
+ #pragma omp p
+ bar ();
+ omp_parallel
+ bar ();
+ omp_p
+ bar ();
+}
+
+/* { dg-final { scan-tree-dump-times "#pragma omp parallel" 4 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-4.c b/gcc/testsuite/gcc.dg/gomp/macro-4.c
new file mode 100644
index 000000000..7d20f4cd6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/macro-4.c
@@ -0,0 +1,29 @@
+/* PR preprocessor/27746 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -Wunknown-pragmas" } */
+
+#define p _Pragma ("omp parallel")
+#define omp_p _Pragma ("omp p")
+
+void bar (void);
+
+void
+foo (void)
+{
+#pragma omp p /* { dg-warning "ignoring #pragma omp _Pragma" } */
+ bar ();
+ omp_p /* { dg-warning "ignoring #pragma omp _Pragma" } */
+ bar ();
+}
+
+#define parallel serial
+#define omp_parallel _Pragma ("omp parallel")
+
+void
+baz (void)
+{
+#pragma omp parallel /* { dg-warning "ignoring #pragma omp serial" } */
+ bar ();
+ omp_parallel /* { dg-warning "ignoring #pragma omp serial" } */
+ bar ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/master-1.c b/gcc/testsuite/gcc.dg/gomp/master-1.c
new file mode 100644
index 000000000..2681c216a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/master-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp master
+ bar(0);
+
+ #pragma omp master
+ {
+ bar(1);
+ bar(2);
+ }
+
+ /* Yes, this is legal -- structured-block contains statement contains
+ openmp-construct contains master-construct. */
+ #pragma omp master
+ #pragma omp master
+ #pragma omp master
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/master-2.c b/gcc/testsuite/gcc.dg/gomp/master-2.c
new file mode 100644
index 000000000..3b0bdfc90
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/master-2.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp master asdf /* { dg-error "expected" } */
+ #pragma omp master
+} /* { dg-error "expected expression" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/master-3.c b/gcc/testsuite/gcc.dg/gomp/master-3.c
new file mode 100644
index 000000000..fee09ddd7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/master-3.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp master
+ bar(0);
+}
+
+/* { dg-final { scan-tree-dump-times "omp_get_thread_num" 1 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/nestedfn-1.c b/gcc/testsuite/gcc.dg/gomp/nestedfn-1.c
new file mode 100644
index 000000000..8532d8af1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/nestedfn-1.c
@@ -0,0 +1,53 @@
+/* This testcase violates the OpenMP requirements, as nested functions
+ access the original variables.
+ We test it just to make sure we don't ICE on it. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void abort (void);
+extern int omp_get_thread_num ();
+extern void omp_set_dynamic (int);
+
+int
+main (void)
+{
+ int j = 0, k = 6, l = 7, m = 8;
+ void foo (void)
+ {
+ int i = 5;
+ int bar (void)
+ {
+ return i + 1 + (j > 100 ? 10000 : 0);
+ }
+#pragma omp sections private (i)
+ {
+#pragma omp section
+ {
+ i = 6;
+ if (bar () != 6)
+#pragma omp atomic
+ ++j;
+ }
+#pragma omp section
+ {
+ if (bar () != 6)
+#pragma omp atomic
+ ++j;
+ }
+ }
+ if (k != 6 || l != 7 || m != 8)
+#pragma omp atomic
+ ++j;
+ }
+ omp_set_dynamic (0);
+#pragma omp parallel num_threads (2) firstprivate (k) shared (l) private (m)
+ {
+ if (omp_get_thread_num () != 0)
+ k += omp_get_thread_num ();
+ m = 9;
+ foo ();
+ }
+ if (j)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/nesting-1.c b/gcc/testsuite/gcc.dg/gomp/nesting-1.c
new file mode 100644
index 000000000..6f27b907e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/nesting-1.c
@@ -0,0 +1,198 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+f1 (void)
+{
+ int i, j;
+ #pragma omp for
+ for (i = 0; i < 3; i++)
+ {
+ #pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections /* { dg-warning "may not be closely nested" } */
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp master /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ }
+ #pragma omp sections
+ {
+ #pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections /* { dg-warning "may not be closely nested" } */
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp master /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single
+ {
+ #pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections /* { dg-warning "may not be closely nested" } */
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp master /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ }
+ #pragma omp master
+ {
+ #pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections /* { dg-warning "may not be closely nested" } */
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp master
+ ;
+ #pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ }
+ #pragma omp task
+ {
+ #pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections /* { dg-warning "may not be closely nested" } */
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp master /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ }
+ #pragma omp parallel
+ {
+ #pragma omp for
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single
+ ;
+ #pragma omp master
+ ;
+ #pragma omp barrier
+ }
+}
+
+void
+f2 (void)
+{
+ int i, j;
+ #pragma omp ordered
+ {
+ #pragma omp for /* { dg-warning "may not be closely nested" } */
+ for (j = 0; j < 3; j++)
+ ;
+ #pragma omp sections /* { dg-warning "may not be closely nested" } */
+ {
+ ;
+ #pragma omp section
+ ;
+ }
+ #pragma omp single /* { dg-warning "may not be closely nested" } */
+ ;
+ #pragma omp master
+ ;
+ #pragma omp barrier /* { dg-warning "may not be closely nested" } */
+ }
+}
+
+void
+f3 (void)
+{
+ #pragma omp critical
+ {
+ #pragma omp ordered /* { dg-warning "may not be closely nested" } */
+ ;
+ }
+}
+
+void
+f4 (void)
+{
+ #pragma omp task
+ {
+ #pragma omp ordered /* { dg-warning "may not be closely nested" } */
+ ;
+ }
+}
+
+void
+f5 (void)
+{
+ int i;
+ #pragma omp for
+ for (i = 0; i < 10; i++)
+ {
+ #pragma omp ordered /* { dg-warning "must be closely nested" } */
+ ;
+ }
+ #pragma omp for ordered
+ for (i = 0; i < 10; i++)
+ {
+ #pragma omp ordered
+ ;
+ }
+}
+
+void
+f6 (void)
+{
+ #pragma omp critical (foo)
+ #pragma omp critical (bar)
+ ;
+ #pragma omp critical
+ #pragma omp critical (baz)
+ ;
+}
+
+void
+f7 (void)
+{
+ #pragma omp critical (foo2)
+ #pragma omp critical
+ ;
+ #pragma omp critical (bar)
+ #pragma omp critical (bar) /* { dg-warning "may not be nested" } */
+ ;
+ #pragma omp critical
+ #pragma omp critical /* { dg-warning "may not be nested" } */
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/num-threads-1.c b/gcc/testsuite/gcc.dg/gomp/num-threads-1.c
new file mode 100644
index 000000000..f792ef96b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/num-threads-1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+extern void bar(void);
+void foo(void)
+{
+ #pragma omp parallel num_threads (0) /* { dg-warning "must be positive" } */
+ {
+ bar ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c b/gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c
new file mode 100644
index 000000000..ca06aeef9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+extern int foo(void);
+extern void bar(void);
+
+int main ()
+{
+ /* Malformed uses of 'if' and 'num_threads'. */
+ #pragma omp parallel if (foo () > 10) if (foo () == 3) /* { dg-error "too many" } */
+ {
+ bar ();
+ }
+
+ #pragma omp parallel num_threads (3) num_threads (20) /* { dg-error "too many" } */
+ {
+ bar ();
+ }
+
+ /* Valid uses of 'if' and 'num_threads'. */
+ #pragma omp parallel if (foo () == 10) num_threads (foo ())
+ {
+ bar ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/ordered-1.c b/gcc/testsuite/gcc.dg/gomp/ordered-1.c
new file mode 100644
index 000000000..de5e116eb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/ordered-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-ompexp" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp ordered
+ bar(0);
+
+ #pragma omp ordered
+ {
+ bar(1);
+ bar(2);
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_ordered_start" 2 "ompexp" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_ordered_end" 2 "ompexp" } } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/ordered-2.c b/gcc/testsuite/gcc.dg/gomp/ordered-2.c
new file mode 100644
index 000000000..2884b1026
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/ordered-2.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp ordered asdf /* { dg-error "expected" } */
+ #pragma omp ordered
+} /* { dg-error "expected expression" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-1.c b/gcc/testsuite/gcc.dg/gomp/parallel-1.c
new file mode 100644
index 000000000..c5c233b76
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-1.c
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i;
+
+ #pragma omp parallel
+ {
+ #pragma omp parallel
+ {
+ #pragma omp parallel
+ {
+ i++;
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-2.c b/gcc/testsuite/gcc.dg/gomp/parallel-2.c
new file mode 100644
index 000000000..68e577766
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-2.c
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i;
+
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ #pragma omp parallel
+ {
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ i++; // { dg-error "not specified" }
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-3.c b/gcc/testsuite/gcc.dg/gomp/parallel-3.c
new file mode 100644
index 000000000..633d7ba59
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-3.c
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+extern int printf (const char *, ...);
+
+int main (void)
+{
+ double d = 6;
+ int i = 1;
+#pragma omp parallel shared(d) private(i) num_threads (4 + i)
+ {
+ i = 4;
+ printf ("%s %d %g\n", "Hello, World!", i, d);
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-4.c b/gcc/testsuite/gcc.dg/gomp/parallel-4.c
new file mode 100644
index 000000000..b8cd174a3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-4.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+extern void bar (void);
+
+int main (void)
+{
+ int i;
+#pragma omp parallel for nowait /* { dg-error "'nowait'" } */
+ for (i = 0; i < 10; i++)
+ bar ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr25874.c b/gcc/testsuite/gcc.dg/gomp/pr25874.c
new file mode 100644
index 000000000..2afd02ea3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr25874.c
@@ -0,0 +1,17 @@
+/* { dg-options "-O -fopenmp" } */
+
+void foo();
+
+inline void bar()
+{
+ int i;
+ for ( i=0; i<1; ++i )
+#pragma omp parallel
+ foo();
+}
+
+void baz()
+{
+#pragma omp parallel
+ bar();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr25989.c b/gcc/testsuite/gcc.dg/gomp/pr25989.c
new file mode 100644
index 000000000..39bd4b77c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr25989.c
@@ -0,0 +1,16 @@
+/* PR middle-end/25989 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+int
+main (void)
+{
+ int i, j;
+ float a, b = 1.0;
+
+#pragma omp parallel for schedule(guided,1) private(j)
+ for (i = 1; i <= 9; i++)
+ for (j = 1; j <= 9; j++)
+ a = b;
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr25990.c b/gcc/testsuite/gcc.dg/gomp/pr25990.c
new file mode 100644
index 000000000..e3c4562cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr25990.c
@@ -0,0 +1,261 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O2 -std=c99" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+typedef struct {
+ int _flags;
+} FILE;
+
+extern FILE *fopen (__const char *__restrict __filename,
+ __const char *__restrict __modes);
+extern size_t fread (void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream) ;
+extern int fclose (FILE *__stream);
+extern size_t fwrite (__const void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __s) ;
+
+extern void *malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ;
+
+extern size_t strlen (__const char *__s)
+ __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
+ __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern int __attribute__ ((__nothrow__)) atoi (__const char *__nptr);
+
+extern float cabsf (float _Complex __z) __attribute__ ((__nothrow__)); extern float __cabsf (float _Complex __z) __attribute__ ((__nothrow__));
+extern float sqrtf (float __x) __attribute__ ((__nothrow__)); extern float __sqrtf (float __x) __attribute__ ((__nothrow__));
+
+int main(int argc , char * argv[])
+{
+ int AA, BB, CC;
+ AA = 99;
+ BB = 99;
+ CC = (int)atoi(argv[3]);
+ int m,n,s;
+ int DD,EE,num_s;
+
+
+ float _Complex * restrict A;
+ A = malloc((AA) * (BB) * (CC) * sizeof(float _Complex));
+ int A_slice_stride;
+ A_slice_stride = (AA) * (BB) ;
+
+
+ float * restrict f;
+ f = malloc(CC * sizeof(float));
+
+
+
+ FILE *fp;
+
+ fp = fopen(argv[1],"rb");
+ fread(A,sizeof(float _Complex),AA * BB * CC,fp);
+ fclose(fp);
+
+ fp = fopen(argv[2],"rb");
+ fread(f,sizeof(float),CC,fp);
+ fclose(fp);
+
+
+ DD = (int)atoi(argv[4]);
+ EE = (int)atoi(argv[5]);
+
+ num_s = (EE - DD) + 1;
+
+
+
+ float * restrict INPUT;
+ INPUT = malloc(4 * 4 * sizeof(float));
+
+
+
+ int m_max = 99;
+ int n_max = 00;
+ float h = 0.1;
+ float FF = 10;
+
+ if ((__extension__ (__builtin_constant_p (5) && ((__builtin_constant_p (argv[6]) && strlen (argv[6]) < ((size_t) (5))) || (__builtin_constant_p ("plane") && strlen ("plane") < ((size_t) (5)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[6]) && __builtin_constant_p ("plane") && (__s1_len = strlen (argv[6]), __s2_len = strlen ("plane"), (!((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("plane") + 1) - (size_t)(const void *)("plane") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[6], "plane") : (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) && (__s1_len = strlen (argv[6]), __s1_len < 4) ? (__builtin_constant_p ("plane") && ((size_t)(const void *)(("plane") + 1) - (size_t)(const void *)("plane") == 1) ? __builtin_strcmp (argv[6], "plane") : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) ("plane"); register int __result = (((__const unsigned char *) (__const char *) (argv[6]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (argv[6]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("plane") && ((size_t)(const void *)(("plane") + 1) - (size_t)(const void *)("plane") == 1) && (__s2_len = strlen ("plane"), __s2_len < 4) ? (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) ? __builtin_strcmp (argv[6], "plane") : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (argv[6]); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) ("plane"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) ("plane"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) ("plane"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) ("plane"))[3]); } } __result; }))) : __builtin_strcmp (argv[6], "plane")))); }) : (__extension__ (__builtin_constant_p (5) && ((__builtin_constant_p (argv[6]) && strlen (argv[6]) < ((size_t) (5))) || (__builtin_constant_p ("plane") && strlen ("plane") < ((size_t) (5)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[6]) && __builtin_constant_p ("plane") && (__s1_len = strlen (argv[6]), __s2_len = strlen ("plane"), (!((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("plane") + 1) - (size_t)(const void *)("plane") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[6], "plane") : (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) && (__s1_len = strlen (argv[6]), __s1_len < 4) ? (__builtin_constant_p ("plane") && ((size_t)(const void *)(("plane") + 1) - (size_t)(const void *)("plane") == 1) ? __builtin_strcmp (argv[6], "plane") : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) ("plane"); register int __result = (((__const unsigned char *) (__const char *) (argv[6]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (argv[6]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("plane") && ((size_t)(const void *)(("plane") + 1) - (size_t)(const void *)("plane") == 1) && (__s2_len = strlen ("plane"), __s2_len < 4) ? (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) ? __builtin_strcmp (argv[6], "plane") : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (argv[6]); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) ("plane"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) ("plane"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) ("plane"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) ("plane"))[3]); } } __result; }))) : __builtin_strcmp (argv[6], "plane")))); }) : strncmp (argv[6], "plane", 5)))))==0) {
+ m_max = INPUT[ ( ((1)-1) + ( ((1)-1)*4 ))];
+ n_max = INPUT[ ( ((2)-1) + ( ((1)-1)*4 ))];
+ h = INPUT[ ( ((3)-1) + ( ((1)-1)*4 ))];
+ FF = INPUT[ ( ((4)-1) + ( ((1)-1)*4 ))];
+ }
+
+ if ((__extension__ (__builtin_constant_p (6) && ((__builtin_constant_p (argv[6]) && strlen (argv[6]) < ((size_t) (6))) || (__builtin_constant_p ("sphere") && strlen ("sphere") < ((size_t) (6)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[6]) && __builtin_constant_p ("sphere") && (__s1_len = strlen (argv[6]), __s2_len = strlen ("sphere"), (!((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("sphere") + 1) - (size_t)(const void *)("sphere") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[6], "sphere") : (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) && (__s1_len = strlen (argv[6]), __s1_len < 4) ? (__builtin_constant_p ("sphere") && ((size_t)(const void *)(("sphere") + 1) - (size_t)(const void *)("sphere") == 1) ? __builtin_strcmp (argv[6], "sphere") : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) ("sphere"); register int __result = (((__const unsigned char *) (__const char *) (argv[6]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (argv[6]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("sphere") && ((size_t)(const void *)(("sphere") + 1) - (size_t)(const void *)("sphere") == 1) && (__s2_len = strlen ("sphere"), __s2_len < 4) ? (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) ? __builtin_strcmp (argv[6], "sphere") : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (argv[6]); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) ("sphere"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) ("sphere"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) ("sphere"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) ("sphere"))[3]); } } __result; }))) : __builtin_strcmp (argv[6], "sphere")))); }) : (__extension__ (__builtin_constant_p (6) && ((__builtin_constant_p (argv[6]) && strlen (argv[6]) < ((size_t) (6))) || (__builtin_constant_p ("sphere") && strlen ("sphere") < ((size_t) (6)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[6]) && __builtin_constant_p ("sphere") && (__s1_len = strlen (argv[6]), __s2_len = strlen ("sphere"), (!((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("sphere") + 1) - (size_t)(const void *)("sphere") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[6], "sphere") : (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) && (__s1_len = strlen (argv[6]), __s1_len < 4) ? (__builtin_constant_p ("sphere") && ((size_t)(const void *)(("sphere") + 1) - (size_t)(const void *)("sphere") == 1) ? __builtin_strcmp (argv[6], "sphere") : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) ("sphere"); register int __result = (((__const unsigned char *) (__const char *) (argv[6]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[6]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (argv[6]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("sphere") && ((size_t)(const void *)(("sphere") + 1) - (size_t)(const void *)("sphere") == 1) && (__s2_len = strlen ("sphere"), __s2_len < 4) ? (__builtin_constant_p (argv[6]) && ((size_t)(const void *)((argv[6]) + 1) - (size_t)(const void *)(argv[6]) == 1) ? __builtin_strcmp (argv[6], "sphere") : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (argv[6]); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) ("sphere"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) ("sphere"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) ("sphere"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) ("sphere"))[3]); } } __result; }))) : __builtin_strcmp (argv[6], "sphere")))); }) : strncmp (argv[6], "sphere", 6)))))==0) {
+ m_max = 181;
+ n_max = 361;
+ h = INPUT[ ( ((3)-1) + ( ((1)-1)*4 ))];
+ FF = INPUT[ ( ((4)-1) + ( ((1)-1)*4 ))];
+ }
+
+
+
+
+
+ float * restrict X;
+ X = malloc(m_max * n_max * sizeof(float));
+
+
+ float * restrict Y;
+ Y = malloc(m_max * n_max * sizeof(float));
+
+
+ float * restrict Z;
+ Z = malloc(m_max * n_max * sizeof(float));
+
+
+
+
+
+
+ float _Complex * restrict P;
+ P = malloc(m_max * n_max * sizeof(float _Complex));
+
+
+ float _Complex * restrict Ps;
+ Ps = malloc((m_max) * (n_max) * (num_s) * sizeof(float _Complex));
+ int Ps_slice_stride;
+ Ps_slice_stride = (m_max) * (n_max) ;
+
+
+ float GG;
+ float HH;
+
+
+
+
+ for ( n = 1 ; n <= 99 ; n++ ) {
+ for ( m = 1 ; m <= 99 ; m++ ) {
+
+
+
+
+
+ X[ ( ((m)-1) + ( ((n)-1)*m_max ))] = FF ;
+ Y[ ( ((m)-1) + ( ((n)-1)*m_max ))] = FF ;
+ Z[ ( ((m)-1) + ( ((n)-1)*m_max ))] = FF ;
+ }
+ }
+ int KK = atoi(argv[8]);
+ int LL = 3 * KK;
+
+
+ float * restrict MM;
+ MM = malloc(4 * LL * sizeof(float));
+ for ( n = 1 ; n <= n_max ; n++) {
+ for ( m = 1 ; m <= m_max ; m++) {
+ for ( s = 1 ; s <= num_s ; s++) {
+ Ps[ ( ((m)-1) + (((n)-1)*(m_max)) + (((s)-1)*(Ps_slice_stride)) ) ] = 0.0 + 0.0 * (__extension__ 1.0iF);
+ }
+ }
+ }
+
+
+ int liter ;
+
+#pragma omp parallel for private(m,liter,s)
+ for ( n = 1 ; n <= n_max ; n++) {
+ for ( m = 1 ; m <= m_max ; m++) {
+ for ( liter = 1 ; liter <= KK ; liter++ ) {
+ for ( s = 1 ; s <= num_s ; s++) {
+
+
+ int LM_column;
+ float NN[4];
+ float OO[4];
+ float PP[4];
+ float QQ[4];
+ float k;
+ int s_index;
+ float RR;
+
+ s_index = s + (DD -1);
+ RR = f[ ( (s_index)-1) ];
+ k = 99.0;
+
+ NN[1 -1] = X[ ( ((m)-1) + ( ((n)-1)*m_max ))];
+ NN[2 -1] = Y[ ( ((m)-1) + ( ((n)-1)*m_max ))];
+ NN[3 -1] = Z[ ( ((m)-1) + ( ((n)-1)*m_max ))];
+ NN[4 -1] = 1.0;
+
+ LM_column = ((liter -1) * 3) + 1;
+ OO[1 -1] = MM[ ( ((1)-1) + ( ((LM_column)-1)*4 ))];
+ OO[2 -1] = MM[ ( ((2)-1) + ( ((LM_column)-1)*4 ))];
+ OO[3 -1] = MM[ ( ((3)-1) + ( ((LM_column)-1)*4 ))];
+ OO[4 -1] = MM[ ( ((4)-1) + ( ((LM_column)-1)*4 ))];
+
+ LM_column = ((liter -1) * 3) + 2;
+ PP[1 -1] = MM[ ( ((1)-1) + ( ((LM_column)-1)*4 ))];
+ PP[2 -1] = MM[ ( ((2)-1) + ( ((LM_column)-1)*4 ))];
+ PP[3 -1] = MM[ ( ((3)-1) + ( ((LM_column)-1)*4 ))];
+ PP[4 -1] = MM[ ( ((4)-1) + ( ((LM_column)-1)*4 ))];
+
+ LM_column = ((liter -1) * 3) + 3;
+ QQ[1 -1] = MM[ ( ((1)-1) + ( ((LM_column)-1)*4 ))];
+ QQ[2 -1] = MM[ ( ((2)-1) + ( ((LM_column)-1)*4 ))];
+ QQ[3 -1] = MM[ ( ((3)-1) + ( ((LM_column)-1)*4 ))];
+ QQ[4 -1] = MM[ ( ((4)-1) + ( ((LM_column)-1)*4 ))];
+
+ }
+ }
+ }
+ }
+
+
+#pragma omp parallel for private(m)
+ for ( n = 1 ; n <= n_max ; n++) {
+ for ( m = 1 ; m <= m_max ; m++) {
+
+
+
+ int s;
+ float SSS;
+ float f1,f2,p1,p2,TT,h,FFF;
+ SSS = 0.0;
+ for ( s = 2 ; s <= num_s ; s++) {
+ f1 = f[ ( ((s-1) + (DD - 1))-1) ];
+ f2 = f[ ( ((s) + (DD - 1))-1) ];
+ p1 = cabsf(Ps[ ( ((m)-1) + (((n)-1)*(m_max)) + ((((s-1))-1)*(Ps_slice_stride)) ) ]) ;
+ p2 = cabsf(Ps[ ( ((m)-1) + (((n)-1)*(m_max)) + (((s)-1)*(Ps_slice_stride)) ) ]) ;
+
+ h = f2 - f1;
+
+ FFF = (f1 + f2) / 2.0;
+
+
+ TT = (1.0 / sqrtf(2.0)) * (((h * p1) + (0.5 * h * (p2 - p1))) * (1.0 / FFF));
+
+ SSS += TT;
+
+ }
+
+ P[ ( ((m)-1) + ( ((n)-1)*m_max ))] = SSS + ((__extension__ 1.0iF) * 0.0);
+ }
+ }
+
+
+
+
+
+ fp = fopen(argv[10],"wb");
+ fwrite(X,sizeof(float),m_max * n_max,fp);
+ fclose(fp);
+
+ fp = fopen(argv[11],"wb");
+ fwrite(Y,sizeof(float),m_max * n_max,fp);
+ fclose(fp);
+
+ fp = fopen(argv[12],"wb");
+ fwrite(Z,sizeof(float),m_max * n_max,fp);
+ fclose(fp);
+
+ fp = fopen(argv[13],"wb");
+ fwrite(P,sizeof(float _Complex),m_max * n_max,fp);
+ fclose(fp);
+
+
+
+ return(0);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr25996.c b/gcc/testsuite/gcc.dg/gomp/pr25996.c
new file mode 100644
index 000000000..d58c9a1c3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr25996.c
@@ -0,0 +1,32 @@
+/* PR c/25996 */
+
+void
+test1 (void)
+{
+#pragma omp for
+ for (i = 0; i < 1; ++i); /* { dg-error "undeclared|for each function" } */
+}
+
+void
+test2 (void)
+{
+ int i;
+#pragma omp for
+ for (i = j; i < 1; ++i); /* { dg-error "undeclared" } */
+}
+
+void
+test3 (void)
+{
+ int i;
+#pragma omp for
+ for (i = 0; i < j; ++i); /* { dg-error "undeclared|invalid controlling predicate" } */
+}
+
+void
+test4 (void)
+{
+ int i;
+#pragma omp for
+ for (i = 0; i < 10; i += j); /* { dg-error "undeclared|invalid increment expression" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr26412.c b/gcc/testsuite/gcc.dg/gomp/pr26412.c
new file mode 100644
index 000000000..6baecfe68
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr26412.c
@@ -0,0 +1,18 @@
+/* PR middle-end/26412 */
+/* { dg-do compile } */
+
+extern double a[];
+extern int b;
+
+double
+test (void)
+{
+ int i;
+ double c = 0;
+
+#pragma omp parallel for private(i) reduction(+:c)
+ for (i = 0; i < 10000; i++)
+ c += a[b];
+
+ return c;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27328.c b/gcc/testsuite/gcc.dg/gomp/pr27328.c
new file mode 100644
index 000000000..afde738a7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27328.c
@@ -0,0 +1,19 @@
+/* PR middle-end/27328 */
+/* { dg-do compile } */
+
+extern void baz (void) __attribute__((noreturn));
+
+void
+foo (void)
+{
+#pragma omp parallel
+ for (;;)
+ ;
+}
+
+void
+bar (void)
+{
+#pragma omp parallel
+ baz ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27358.c b/gcc/testsuite/gcc.dg/gomp/pr27358.c
new file mode 100644
index 000000000..3451284e1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27358.c
@@ -0,0 +1,8 @@
+/* PR c/27358 */
+/* { dg-do compile } */
+
+void foo(error i) /* { dg-error "" } */
+{
+#pragma omp parallel
+ i = 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-1.c b/gcc/testsuite/gcc.dg/gomp/pr27388-1.c
new file mode 100644
index 000000000..f315b8bd3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27388-1.c
@@ -0,0 +1,23 @@
+/* PR middle-end/27388 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+int n, o;
+
+void
+foo (void)
+{
+#pragma omp parallel firstprivate (n)
+ {
+ int i;
+#pragma omp parallel for firstprivate (n)
+ for (i = 0; i < 10; i++)
+ ++n;
+#pragma omp atomic
+ o += n;
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "shared\\\(i\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "private\\\(i\\\)" 1 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-2.c b/gcc/testsuite/gcc.dg/gomp/pr27388-2.c
new file mode 100644
index 000000000..da8a48d7e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27388-2.c
@@ -0,0 +1,35 @@
+/* PR middle-end/27388 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void baz (int);
+
+void
+foo (void)
+{
+ int i;
+#pragma omp parallel for shared (i)
+ for (i = 0; i < 2; i++)
+ baz (i);
+}
+
+void
+bar (void)
+{
+ int j = 0;
+#pragma omp parallel shared (j)
+ {
+ j++;
+#pragma omp for
+ for (j = 0; j < 2; j++)
+ baz (j);
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "shared\\\(i\\\)\[^\\n\]*private\\\(i\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "private\\\(i\\\)\[^\\n\]*shared\\\(i\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private\\\(i\\\)" 1 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "shared\\\(j\\\)\[^\\n\]*private\\\(j\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "private\\\(j\\\)\[^\\n\]*shared\\\(j\\\)" 0 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private\\\(j\\\)" 1 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-3.c b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c
new file mode 100644
index 000000000..2cddb23c7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c
@@ -0,0 +1,23 @@
+/* PR middle-end/27388 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar (int);
+
+void
+foo (void)
+{
+ int i = 0, j = 0;
+#pragma omp parallel firstprivate (i) private (j)
+ {
+#pragma omp for
+ for (i = 0; i < 2; i++)
+ bar (i);
+#pragma omp for
+ for (j = 0; j < 2; j++)
+ bar (j);
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private" 2 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27415.c b/gcc/testsuite/gcc.dg/gomp/pr27415.c
new file mode 100644
index 000000000..010a6c3e4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27415.c
@@ -0,0 +1,50 @@
+/* PR middle-end/27415 */
+/* { dg-do compile } */
+
+void
+test1 (void)
+{
+ int i = 0;
+#pragma omp parallel
+#pragma omp for firstprivate (i) /* { dg-error "should not be firstprivate" } */
+ for (i = 0; i < 10; i++)
+ ;
+}
+
+void
+test2 (void)
+{
+ int i = 0;
+#pragma omp parallel for firstprivate (i) /* { dg-error "should not be firstprivate" } */
+ for (i = 0; i < 10; i++)
+ ;
+}
+
+void
+test3 (void)
+{
+ int i = 0;
+#pragma omp parallel
+#pragma omp for reduction (+:i) /* { dg-error "should not be reduction" } */
+ for (i = 0; i < 10; i++)
+ ;
+}
+
+void
+test4 (void)
+{
+ int i = 0;
+#pragma omp parallel for reduction (*:i) /* { dg-error "should not be reduction" } */
+ for (i = 0; i < 10; i++)
+ ;
+}
+
+void
+test5 (void)
+{
+ int i = 0;
+#pragma omp parallel firstprivate (i)
+#pragma omp for
+ for (i = 0; i < 10; i++)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27416.c b/gcc/testsuite/gcc.dg/gomp/pr27416.c
new file mode 100644
index 000000000..802402446
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27416.c
@@ -0,0 +1,31 @@
+/* PR middle-end/27416 */
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+ int i = 0, j = 0;
+#pragma omp for firstprivate (j) /* { dg-error "is private in outer context" } */
+ for (i = 0; i < 10; i++)
+ j++;
+}
+
+int
+bar (void)
+{
+ int i, j;
+#pragma omp for lastprivate (j) /* { dg-error "is private in outer context" } */
+ for (i = 0; i < 10; i++)
+ j = i;
+ return j;
+}
+
+int
+baz (void)
+{
+ int i, j = 0;
+#pragma omp for reduction (+:j) /* { dg-error "is private in outer context" } */
+ for (i = 0; i < 10; i++)
+ j++;
+ return j;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27499.c b/gcc/testsuite/gcc.dg/gomp/pr27499.c
new file mode 100644
index 000000000..0de2e0686
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27499.c
@@ -0,0 +1,13 @@
+/* PR c/27499 */
+/* { dg-do compile } */
+
+extern void bar (unsigned int);
+
+void
+foo (void)
+{
+ unsigned int i;
+#pragma omp parallel for
+ for (i = 0; i < 64; ++i)
+ bar (i);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr27573.c b/gcc/testsuite/gcc.dg/gomp/pr27573.c
new file mode 100644
index 000000000..d5b9a7157
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr27573.c
@@ -0,0 +1,18 @@
+/* PR middle-end/27573 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp -fprofile-generate" } */
+
+extern int puts (const char *);
+
+int
+main (void)
+{
+ int i, j = 8;
+#pragma omp parallel
+ {
+ puts ("foo");
+ for (i = 1; i < j - 1; i++)
+ ;
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29955.c b/gcc/testsuite/gcc.dg/gomp/pr29955.c
new file mode 100644
index 000000000..e49c11cae
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29955.c
@@ -0,0 +1,14 @@
+/* PR c/29955 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp -fexceptions" } */
+
+extern void bar (int);
+
+void
+foo (int n)
+{
+ int i;
+#pragma omp parallel for schedule(dynamic)
+ for (i = 0; i < n; i++)
+ bar (0);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29965-1.c b/gcc/testsuite/gcc.dg/gomp/pr29965-1.c
new file mode 100644
index 000000000..b587d81e7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29965-1.c
@@ -0,0 +1,45 @@
+/* PR middle-end/29965 */
+/* Test that OpenMP construct bodies which never return don't cause ICEs. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void baz (void) __attribute__ ((noreturn));
+
+static inline void
+foo (void)
+{
+#pragma omp parallel
+ for (;;)
+ ;
+}
+
+static inline void
+bar (void)
+{
+#pragma omp parallel
+ baz ();
+}
+
+void
+foo1 (void)
+{
+ foo ();
+}
+
+void
+foo2 (void)
+{
+ foo ();
+}
+
+void
+bar1 (void)
+{
+ bar ();
+}
+
+void
+bar2 (void)
+{
+ bar ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29965-2.c b/gcc/testsuite/gcc.dg/gomp/pr29965-2.c
new file mode 100644
index 000000000..1bee4859d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29965-2.c
@@ -0,0 +1,98 @@
+/* PR middle-end/29965 */
+/* Test that OpenMP construct bodies which never return don't cause ICEs. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void baz (void) __attribute__ ((noreturn));
+
+void
+foo1 (void)
+{
+#pragma omp sections
+ {
+ for (;;)
+ ;
+ }
+}
+
+void
+bar1 (void)
+{
+#pragma omp sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ baz ();
+ }
+}
+
+void
+foo2 (void)
+{
+#pragma omp sections
+ {
+ ;
+#pragma omp section
+ for (;;)
+ ;
+ }
+}
+
+void
+bar2 (void)
+{
+#pragma omp sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ ;
+ }
+}
+
+void
+foo3 (void)
+{
+#pragma omp parallel sections
+ {
+ for (;;)
+ ;
+ }
+}
+
+void
+bar3 (void)
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ baz ();
+ }
+}
+
+void
+foo4 (void)
+{
+#pragma omp parallel sections
+ {
+ ;
+#pragma omp section
+ for (;;)
+ ;
+ }
+}
+
+void
+bar4 (void)
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ baz ();
+#pragma omp section
+ ;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29965-3.c b/gcc/testsuite/gcc.dg/gomp/pr29965-3.c
new file mode 100644
index 000000000..5901f5f42
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29965-3.c
@@ -0,0 +1,62 @@
+/* PR middle-end/29965 */
+/* Test that OpenMP construct bodies which never return don't cause ICEs. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void baz (void) __attribute__ ((noreturn));
+
+void
+foo1 (void)
+{
+#pragma omp single
+ for (;;);
+}
+
+void
+bar1 (void)
+{
+#pragma omp single
+ baz ();
+}
+
+void
+foo2 (void)
+{
+#pragma omp master
+ for (;;);
+}
+
+void
+bar2 (void)
+{
+#pragma omp master
+ baz ();
+}
+
+void
+foo3 (void)
+{
+#pragma omp ordered
+ for (;;);
+}
+
+void
+bar3 (void)
+{
+#pragma omp ordered
+ baz ();
+}
+
+void
+foo4 (void)
+{
+#pragma omp critical
+ for (;;);
+}
+
+void
+bar4 (void)
+{
+#pragma omp critical
+ baz ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29965-4.c b/gcc/testsuite/gcc.dg/gomp/pr29965-4.c
new file mode 100644
index 000000000..7416d8ec6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29965-4.c
@@ -0,0 +1,44 @@
+/* PR middle-end/29965 */
+/* Test that OpenMP construct bodies which never return don't cause ICEs. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void baz (void) __attribute__ ((noreturn));
+
+void
+foo1 (void)
+{
+ int i;
+#pragma omp for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar1 (void)
+{
+ int i;
+#pragma omp for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
+
+void
+foo2 (void)
+{
+ int i;
+#pragma omp parallel for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar2 (void)
+{
+ int i;
+#pragma omp parallel for schedule (dynamic)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29965-5.c b/gcc/testsuite/gcc.dg/gomp/pr29965-5.c
new file mode 100644
index 000000000..a948ec9dc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29965-5.c
@@ -0,0 +1,44 @@
+/* PR middle-end/29965 */
+/* Test that OpenMP construct bodies which never return don't cause ICEs. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void baz (void) __attribute__ ((noreturn));
+
+void
+foo1 (void)
+{
+ int i;
+#pragma omp for schedule (static)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar1 (void)
+{
+ int i;
+#pragma omp for schedule (static)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
+
+void
+foo2 (void)
+{
+ int i;
+#pragma omp parallel for schedule (static)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar2 (void)
+{
+ int i;
+#pragma omp parallel for schedule (static)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr29965-6.c b/gcc/testsuite/gcc.dg/gomp/pr29965-6.c
new file mode 100644
index 000000000..6f6947836
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr29965-6.c
@@ -0,0 +1,44 @@
+/* PR middle-end/29965 */
+/* Test that OpenMP construct bodies which never return don't cause ICEs. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp" } */
+
+extern void baz (void) __attribute__ ((noreturn));
+
+void
+foo1 (void)
+{
+ int i;
+#pragma omp for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar1 (void)
+{
+ int i;
+#pragma omp for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
+
+void
+foo2 (void)
+{
+ int i;
+#pragma omp parallel for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ for (;;)
+ ;
+}
+
+void
+bar2 (void)
+{
+ int i;
+#pragma omp parallel for schedule (static, 16)
+ for (i = 0; i < 2834; i++)
+ baz ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr30421.c b/gcc/testsuite/gcc.dg/gomp/pr30421.c
new file mode 100644
index 000000000..901ba3c13
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr30421.c
@@ -0,0 +1,39 @@
+/* PR middle-end/30421 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp -Wall" } */
+
+int
+foo ()
+{
+ int a = 0, i;
+
+#pragma omp parallel for firstprivate(a) lastprivate(a)
+ for (i = 0; i < 10; i++)
+ a += i;
+
+ return a;
+}
+
+int
+bar ()
+{
+ int a = 0, i;
+
+#pragma omp parallel for firstprivate(a) lastprivate(a) schedule(static, 2)
+ for (i = 0; i < 10; i++)
+ a += i;
+
+ return a;
+}
+
+int
+baz ()
+{
+ int a = 0, i;
+
+#pragma omp parallel for firstprivate(a) lastprivate(a) schedule(dynamic)
+ for (i = 0; i < 10; i++)
+ a += i;
+
+ return a;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr30494.c b/gcc/testsuite/gcc.dg/gomp/pr30494.c
new file mode 100644
index 000000000..6a042ce69
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr30494.c
@@ -0,0 +1,30 @@
+/* PR middle-end/30494 */
+/* { dg-do compile } */
+
+int
+foo (int n)
+{
+ int i;
+#pragma omp for
+ for (i = 0; i < 6; i++)
+ {
+ int v[n], w[n * 3 + i];
+ v[0] = 1;
+ w[0] = 2;
+ }
+ return 0;
+}
+
+int
+bar (int n)
+{
+ int i;
+#pragma parallel omp for
+ for (i = 0; i < 6; i++)
+ {
+ int v[n], w[n * 3 + i];
+ v[0] = 1;
+ w[0] = 2;
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr32468-1.c b/gcc/testsuite/gcc.dg/gomp/pr32468-1.c
new file mode 100644
index 000000000..437241357
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr32468-1.c
@@ -0,0 +1,100 @@
+/* PR libgomp/32468 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp -fdump-tree-ompexp" } */
+
+extern int printf (const char *, ...);
+extern int omp_get_thread_num (void), omp_get_num_threads (void);
+extern int bar (void);
+extern int baz (const char *, ...);
+
+void
+f1 (void)
+{
+#pragma omp parallel
+ {
+ baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ #pragma omp sections
+ {
+ #pragma omp section
+ printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ #pragma omp section
+ printf ("section2 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+ }
+}
+
+void
+f2 (void)
+{
+#pragma omp parallel
+ {
+ #pragma omp sections
+ {
+ #pragma omp section
+ printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ #pragma omp section
+ printf ("section2 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+ baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+}
+
+void
+f3 (void)
+{
+#pragma omp parallel
+ {
+ int bb = bar ();
+ #pragma omp sections
+ {
+ #pragma omp section
+ printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ #pragma omp section
+ printf ("section2 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+ }
+}
+
+void
+f4 (void)
+{
+ int i;
+#pragma omp parallel
+ {
+ baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ #pragma omp for schedule (dynamic, 15)
+ for (i = 0; i < 10000; i++)
+ printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+}
+
+void
+f5 (void)
+{
+ int i;
+#pragma omp parallel
+ {
+ #pragma omp for schedule (dynamic, 15)
+ for (i = 0; i < 10000; i++)
+ printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+}
+
+void
+f6 (void)
+{
+ int i;
+#pragma omp parallel
+ {
+ int bb = bar ();
+ #pragma omp for schedule (runtime)
+ for (i = 0; i < 10000; i++)
+ printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
+ }
+}
+
+/* There should not be a GOMP_parallel_{loop,sections}* call. */
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop" 0 "ompexp"} } */
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_sections" 0 "ompexp"} } */
+/* { dg-final { cleanup-tree-dump "ompexp" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr34607.c b/gcc/testsuite/gcc.dg/gomp/pr34607.c
new file mode 100644
index 000000000..d64af282f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr34607.c
@@ -0,0 +1,17 @@
+/* PR c++/34607 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -std=gnu99" } */
+void
+foo ()
+{
+#pragma omp for
+ for (int i =; i < 2; ++i) /* { dg-error "expected expression before" } */
+ ;
+#pragma omp for
+ for (T i = 54; i < 56; i++) /* { dg-error "unknown type name" } */
+ ;
+ T j; /* { dg-error "unknown type name" } */
+#pragma omp for
+ for (j = 1; j < 3; j++)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr34610.c b/gcc/testsuite/gcc.dg/gomp/pr34610.c
new file mode 100644
index 000000000..85db164b5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr34610.c
@@ -0,0 +1,28 @@
+/* PR gcov-profile/34610 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fprofile-arcs -fopenmp" } */
+
+extern void bar (int);
+extern void baz (int) __attribute__((noreturn));
+
+void
+foo (int k)
+{
+ int i;
+#pragma omp for schedule(dynamic)
+ for (i = 0; i < 10; ++i)
+ bar (i);
+#pragma omp parallel for schedule(static)
+ for (i = 0; i < 10; ++i)
+ bar (i);
+#pragma omp parallel for schedule(static, 4)
+ for (i = 0; i < 10; ++i)
+ bar (i);
+ if (k)
+ #pragma omp for schedule(dynamic)
+ for (i = 0; i < 10; ++i)
+ baz (i);
+#pragma omp parallel
+ for (i = 0; i < 10; ++i)
+ bar (i);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr34692.c b/gcc/testsuite/gcc.dg/gomp/pr34692.c
new file mode 100644
index 000000000..cc93914b6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr34692.c
@@ -0,0 +1,28 @@
+/* PR preprocessor/34692 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+/* { dg-final { scan-tree-dump-times "#pragma omp parallel" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "#pragma omp for private" 1 "gimple" } } */
+
+void
+foo (void)
+{
+ int i;
+#define FOO(y, x) y #x
+#define BAR(x) x
+#define BAZ(x) x
+FOO (for (i = 0; i < 10; i++) { const char *vara =,
+a
+#define P parallel
+#pragma omp P
+#undef P
+#define P for
+b
+#pragma omp P
+#undef P
+#define parallel atomic
+cde f g h);
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr34694.c b/gcc/testsuite/gcc.dg/gomp/pr34694.c
new file mode 100644
index 000000000..35cbf3340
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr34694.c
@@ -0,0 +1,15 @@
+/* PR middle-end/34694 */
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -Wall" } */
+
+int i;
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ int j; /* { dg-message "note: 'j' was declared here" } */
+ i = j; /* { dg-warning "is used uninitialized" } */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr34964.c b/gcc/testsuite/gcc.dg/gomp/pr34964.c
new file mode 100644
index 000000000..7800be1d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr34964.c
@@ -0,0 +1,6 @@
+/* PR c++/34964 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+char x[] = 0; /* { dg-error "invalid initializer" } */
+#pragma omp threadprivate (x)
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35244.c b/gcc/testsuite/gcc.dg/gomp/pr35244.c
new file mode 100644
index 000000000..92d6a1c4f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35244.c
@@ -0,0 +1,20 @@
+/* PR c++/35244 */
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+/* { dg-options "-fopenmp" } */
+
+int v1;
+typedef struct A A;
+typedef int i;
+#pragma omp threadprivate (i) /* { dg-error "expected identifier before" } */
+#pragma omp threadprivate (A) /* { dg-error "expected identifier before" } */
+#pragma omp threadprivate (v1)
+
+void foo ()
+{
+ static int v4;
+ {
+ static int v5;
+#pragma omp threadprivate (v4, v5)
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35438.c b/gcc/testsuite/gcc.dg/gomp/pr35438.c
new file mode 100644
index 000000000..a3ae7de0b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35438.c
@@ -0,0 +1,6 @@
+/* PR c/35438 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void foo ();
+#pragma omp threadprivate(foo) /* { dg-error "is not a variable" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35439.c b/gcc/testsuite/gcc.dg/gomp/pr35439.c
new file mode 100644
index 000000000..1669a97a0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35439.c
@@ -0,0 +1,6 @@
+/* PR c/35439 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void x[1]; /* { dg-error "array of voids" } */
+#pragma omp threadprivate(x)
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35738.c b/gcc/testsuite/gcc.dg/gomp/pr35738.c
new file mode 100644
index 000000000..0b3866eae
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35738.c
@@ -0,0 +1,18 @@
+/* PR c/35738 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void foo (void);
+
+void
+bar (void *p)
+{
+ int i = 0;
+ char q[10];
+#pragma omp atomic
+ i += q; /* { dg-warning "makes integer from pointer without a cast" } */
+#pragma omp atomic
+ i += foo; /* { dg-warning "makes integer from pointer without a cast" } */
+#pragma omp atomic
+ i += p; /* { dg-warning "makes integer from pointer without a cast" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35751.c b/gcc/testsuite/gcc.dg/gomp/pr35751.c
new file mode 100644
index 000000000..f7777a5b7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35751.c
@@ -0,0 +1,34 @@
+/* PR c/35751 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (int i)
+{
+ extern int a[i]; /* { dg-error "must have no linkage|storage size of" } */
+ static int b[i]; /* { dg-error "storage size of" } */
+
+#pragma omp parallel
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+
+#pragma omp parallel shared (a, b)
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+
+#pragma omp parallel private (a, b)
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+
+#pragma omp parallel firstprivate (a, b)
+ {
+ a[0] = 0;
+ b[0] = 0;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr35818.c b/gcc/testsuite/gcc.dg/gomp/pr35818.c
new file mode 100644
index 000000000..b2165eb39
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr35818.c
@@ -0,0 +1,16 @@
+/* PR middle-end/35818 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+extern int a[];
+
+void
+foo (void)
+{
+#pragma omp parallel
+#pragma omp master
+ a[3] = 1;
+#pragma omp parallel shared(a)
+#pragma omp master
+ a[3] = 1;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr36790.c b/gcc/testsuite/gcc.dg/gomp/pr36790.c
new file mode 100644
index 000000000..b3379f156
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr36790.c
@@ -0,0 +1,23 @@
+/* PR middle-end/36790 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (char b)
+{
+}
+
+void
+bar (char b)
+{
+ foo (b);
+ #pragma omp task default (shared)
+ b = 0;
+}
+
+int
+main ()
+{
+ bar (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr38633.c b/gcc/testsuite/gcc.dg/gomp/pr38633.c
new file mode 100644
index 000000000..6c96bd1c1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr38633.c
@@ -0,0 +1,14 @@
+/* PR middle-end/38633 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo ()
+{
+#pragma omp parallel
+ {
+ struct A { int i; } j;
+ j.i = 6;
+ j.i++;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr38676.c b/gcc/testsuite/gcc.dg/gomp/pr38676.c
new file mode 100644
index 000000000..cd9312028
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr38676.c
@@ -0,0 +1,19 @@
+/* PR middle-end/38676 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+int
+main ()
+{
+ int bar, foo = 1;
+#pragma omp parallel for shared(foo)
+ for (bar = 0; bar < 3; bar++)
+ {
+ switch (foo)
+ {
+ case 1:
+ break;
+ }
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr39495-1.c b/gcc/testsuite/gcc.dg/gomp/pr39495-1.c
new file mode 100644
index 000000000..cc165ca52
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr39495-1.c
@@ -0,0 +1,95 @@
+/* PR c/39495 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#define INT_MIN (-__INT_MAX__ - 1)
+#define INT_MAX __INT_MAX__
+#define UINT_MAX (2U * __INT_MAX__ + 1)
+
+int
+foo (void)
+{
+ int i;
+ unsigned int u;
+
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN + 1; i--)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i >= INT_MIN + 1; i--)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN; i--)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX - 1; i++)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i <= INT_MAX - 1; i++)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX; i++)
+ ;
+#pragma omp for
+ for (u = 6; u > 1; u--)
+ ;
+#pragma omp for
+ for (u = 6; u >= 1; u--)
+ ;
+#pragma omp for
+ for (u = 6; u > 0; u--)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX - 1; u++)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u <= UINT_MAX - 1; u++)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX; u++)
+ ;
+}
+
+int
+bar (void)
+{
+ int i;
+ unsigned int u;
+
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN + 1; i -= 2)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i >= INT_MIN + 1; i -= 2)
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i > INT_MIN; i -= 2)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX - 1; i += 2)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i <= INT_MAX - 1; i += 2)
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i < INT_MAX; i += 2)
+ ;
+#pragma omp for
+ for (u = 6; u > 1; u -= 2)
+ ;
+#pragma omp for
+ for (u = 6; u >= 1; u -= 2)
+ ;
+#pragma omp for
+ for (u = 6; u > 0; u -= 2)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX - 1; u += 2)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u <= UINT_MAX - 1; u += 2)
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u < UINT_MAX; u += 2)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr39495-2.c b/gcc/testsuite/gcc.dg/gomp/pr39495-2.c
new file mode 100644
index 000000000..a276c24ed
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr39495-2.c
@@ -0,0 +1,39 @@
+/* PR c/39495 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#define INT_MIN (-__INT_MAX__ - 1)
+#define INT_MAX __INT_MAX__
+#define UINT_MAX (2U * __INT_MAX__ + 1)
+
+int
+foo (void)
+{
+ int i;
+ unsigned int u;
+
+#pragma omp for
+ for (i = INT_MIN + 6; i != INT_MIN; i--) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (i = INT_MIN + 6; i == INT_MIN; i--) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i != INT_MAX; i++) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (i = INT_MAX - 6; i == INT_MAX; i++) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (u = 6; u != 0; u--) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (u = 6; u == 0; u--) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u != UINT_MAX; u++) /* { dg-error "invalid controlling predicate" } */
+ ;
+#pragma omp for
+ for (u = UINT_MAX - 6; u == UINT_MAX; u++) /* { dg-error "invalid controlling predicate" } */
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr44085.c b/gcc/testsuite/gcc.dg/gomp/pr44085.c
new file mode 100644
index 000000000..55462abe5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr44085.c
@@ -0,0 +1,27 @@
+/* PR middle-end/44085 */
+/* { dg-do compile } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-options "-fopenmp" } */
+
+int thr1, thr2;
+#pragma omp threadprivate (thr1, thr2)
+
+void
+foo (void)
+{
+#pragma omp task untied /* { dg-error "enclosing task" } */
+ {
+ thr1++; /* { dg-error "used in untied task" } */
+ thr2 |= 4; /* { dg-error "used in untied task" } */
+ }
+}
+
+void
+bar (void)
+{
+#pragma omp task
+ {
+ thr1++;
+ thr2 |= 4;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr47963.c b/gcc/testsuite/gcc.dg/gomp/pr47963.c
new file mode 100644
index 000000000..636a9542c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr47963.c
@@ -0,0 +1,11 @@
+/* PR c/47963 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (float n)
+{
+ int A[n][n]; /* { dg-error "has non-integer type" } */
+#pragma omp parallel private(A)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr48591.c b/gcc/testsuite/gcc.dg/gomp/pr48591.c
new file mode 100644
index 000000000..e6cb106d8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr48591.c
@@ -0,0 +1,22 @@
+/* PR middle-end/48591 */
+/* { dg-do compile { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "-fopenmp" } */
+
+extern void abort (void);
+
+int
+main ()
+{
+ __float128 f = 0.0;
+ int i;
+ #pragma omp parallel for reduction(+:f)
+ for (i = 0; i < 128; i++)
+ f += 0.5Q;
+ if (f != 64.0Q)
+ abort ();
+ #pragma omp atomic
+ f += 8.5Q;
+ if (f != 72.5Q)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr48716.c b/gcc/testsuite/gcc.dg/gomp/pr48716.c
new file mode 100644
index 000000000..3496e2f02
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr48716.c
@@ -0,0 +1,24 @@
+/* PR c/48716 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+int
+main (void)
+{
+ #pragma omp parallel default(none)
+ {
+ static int s;
+ int t = 0;
+ #pragma omp atomic
+ s++;
+ t++;
+ }
+ #pragma omp task default(none)
+ {
+ static int s;
+ int t = 0;
+ #pragma omp atomic
+ s++;
+ t++;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr49640.c b/gcc/testsuite/gcc.dg/gomp/pr49640.c
new file mode 100644
index 000000000..6e0973864
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr49640.c
@@ -0,0 +1,29 @@
+/* PR middle-end/49640 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=gnu99 -fopenmp" } */
+
+void
+foo (int N, int M, int K, int P, int Q, int R, int i, int j, int k,
+ unsigned char x[P][Q][R], int y[N][M][K])
+{
+ int ii, jj, kk;
+
+#pragma omp parallel for private(ii,jj,kk)
+ for (ii = 0; ii < P; ++ii)
+ for (jj = 0; jj < Q; ++jj)
+ for (kk = 0; kk < R; ++kk)
+ y[i + ii][j + jj][k + kk] = x[ii][jj][kk];
+}
+
+void
+bar (int N, int M, int K, int P, int Q, int R, int i, int j, int k,
+ unsigned char x[P][Q][R], float y[N][M][K], float factor, float zero)
+{
+ int ii, jj, kk;
+
+#pragma omp parallel for private(ii,jj,kk)
+ for (ii = 0; ii < P; ++ii)
+ for (jj = 0; jj < Q; ++jj)
+ for (kk = 0; kk < R; ++kk)
+ y[i + ii][j + jj][k + kk] = factor * x[ii][jj][kk] + zero;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr51339.c b/gcc/testsuite/gcc.dg/gomp/pr51339.c
new file mode 100644
index 000000000..198e4c13e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr51339.c
@@ -0,0 +1,15 @@
+/* PR c/51339 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+char g[] = "g";
+
+void
+foo (void)
+{
+#pragma omp parallel sections firstprivate (g) lastprivate (g)
+ {
+ #pragma omp section
+ g[0] = 'h';
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr51360.c b/gcc/testsuite/gcc.dg/gomp/pr51360.c
new file mode 100644
index 000000000..cc03849a1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr51360.c
@@ -0,0 +1,21 @@
+/* PR c/51360 */
+/* { dg-do compile } */
+/* { dg-options "-Wunused -W -fopenmp" } */
+
+void
+foo (int a, int b, int c)
+{
+ int m, n, o, i;
+ m = 6;
+ n = 1;
+ o = 5;
+ a = 6;
+ b = 1;
+ c = 5;
+ #pragma omp parallel for num_threads (m) if (n) schedule (static, o)
+ for (i = 0; i < 10; i++)
+ ;
+ #pragma omp parallel for num_threads (a) if (b) schedule (static, c)
+ for (i = 0; i < 10; i++)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/preprocess-1.c b/gcc/testsuite/gcc.dg/gomp/preprocess-1.c
new file mode 100644
index 000000000..714c8404d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/preprocess-1.c
@@ -0,0 +1,16 @@
+/* { dg-do preprocess } */
+
+void foo (void)
+{
+ int i1, j1, k1;
+#define p parallel
+#define P(x) private (x##1)
+#define S(x) shared (x##1)
+#define F(x) firstprivate (x##1)
+#pragma omp p P(i) \
+ S(j) \
+ F(k)
+ ;
+}
+
+/* { dg-final { scan-file preprocess-1.i "(^|\n)#pragma omp parallel private \\(i1\\) shared \\(j1\\) firstprivate \\(k1\\)($|\n)" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-1.c b/gcc/testsuite/gcc.dg/gomp/sections-1.c
new file mode 100644
index 000000000..43704908e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-1.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void f1(void)
+{
+ #pragma omp sections nowait
+ {
+ bar (1);
+ #pragma omp section
+ bar (2);
+ #pragma omp section
+ bar (3);
+ #pragma omp section
+ bar (4);
+ #pragma omp section
+ bar (5);
+ }
+}
+
+void f2(void)
+{
+ #pragma omp sections
+ {
+ #pragma omp section
+ {
+ bar (1);
+ bar (1);
+ }
+ #pragma omp section
+ bar (2);
+ #pragma omp section
+ bar (3);
+ #pragma omp section
+ bar (4);
+ #pragma omp section
+ bar (5);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-2.c b/gcc/testsuite/gcc.dg/gomp/sections-2.c
new file mode 100644
index 000000000..aabdfaf80
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-2.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+void foo(void)
+{
+ #pragma omp sections
+ bar (0); // { dg-error "expected" }
+
+ #pragma omp sections
+ {
+ } // { dg-error "expected" }
+
+ #pragma omp sections
+ {
+ bar (1);
+ }
+
+ #pragma omp sections
+ {
+ #pragma omp section
+ bar(2);
+ bar(3); // { dg-error "expected" }
+ bar(4);
+ #pragma omp section
+ bar(5);
+ bar(6); // { dg-error "expected" }
+ bar(7);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-3.c b/gcc/testsuite/gcc.dg/gomp/sections-3.c
new file mode 100644
index 000000000..d8fb2a09d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-3.c
@@ -0,0 +1,15 @@
+
+// { dg-do compile }
+
+extern void bar (void);
+
+int main (void)
+{
+ #pragma omp parallel sections nowait /* { dg-error "'nowait'" } */
+ {
+ #pragma omp section
+ { bar(); }
+ #pragma omp section
+ { bar(); }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-4.c b/gcc/testsuite/gcc.dg/gomp/sections-4.c
new file mode 100644
index 000000000..62a2ecddf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-4.c
@@ -0,0 +1,13 @@
+/* PR c++/24613 */
+/* { dg-do compile } */
+
+#pragma omp section /* { dg-error "may only be used in" } */
+
+int i;
+
+void
+foo (void)
+{
+ #pragma omp section /* { dg-error "may only be used in" } */
+ i++;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sharing-1.c b/gcc/testsuite/gcc.dg/gomp/sharing-1.c
new file mode 100644
index 000000000..90d389b72
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sharing-1.c
@@ -0,0 +1,58 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#include <stdlib.h>
+
+int thrglobalvar;
+#pragma omp threadprivate (thrglobalvar)
+int globalvar;
+const int constvar = 8;
+
+int
+foo (int x)
+{
+ return x;
+}
+
+int
+bar (int *x)
+{
+ return *x;
+}
+
+int
+main (void)
+{
+ static int thrlocvar;
+#pragma omp threadprivate (thrlocvar)
+ static int locvar;
+ static int *p;
+ int i, j, s, l;
+
+ p = malloc (sizeof (int));
+ if (p == NULL)
+ return 0;
+ *p = 7;
+ s = 6;
+ l = 0;
+#pragma omp parallel for /* { dg-error "enclosing parallel" } */ \
+ default (none) private (p) shared (s)
+ for (i = 0; i < 64; i++)
+ {
+ int k = foo (0); /* Predetermined - private (automatic var declared */
+ k++; /* in scope of construct). */
+ thrglobalvar++; /* Predetermined - threadprivate. */
+ thrlocvar++; /* Predetermined - threadprivate. */
+ foo (i); /* Predetermined - private (omp for loop variable). */
+ foo (constvar); /* Predetermined - shared (const qualified type). */
+ foo (*p); /* *p predetermined - shared (heap allocated */
+ (*p)++; /* storage). */
+ bar (p); /* Explicitly determined - private. */
+ foo (s); /* Explicitly determined - shared. */
+ globalvar++; /* { dg-error "not specified in" } */
+ locvar++; /* { dg-error "not specified in" } */
+ l++; /* { dg-error "not specified in" } */
+ for (j = 0; j < 2; j++); /* { dg-error "not specified in" } */
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sharing-2.c b/gcc/testsuite/gcc.dg/gomp/sharing-2.c
new file mode 100644
index 000000000..33bbb3bad
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sharing-2.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+ int i;
+ int a[10];
+ #pragma omp parallel private (i) shared (a)
+ {
+ i = 1;
+ #pragma omp parallel shared (a, i)
+ {
+ #pragma omp master
+ i = 2;
+ #pragma omp parallel private (i) shared (a)
+ {
+ for (i = 0; i < 10; i++)
+ a[i] = i + 1;
+ }
+ #pragma omp master
+ i = 3;
+ }
+ i = 4;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sharing-3.c b/gcc/testsuite/gcc.dg/gomp/sharing-3.c
new file mode 100644
index 000000000..36f72e3ab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sharing-3.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+#define N 50
+#define CHUNKSIZE 5
+
+main ()
+{
+ int i, chunk;
+ float c[N];
+
+ chunk = CHUNKSIZE;
+#pragma omp parallel for shared (c, chunk) schedule (dynamic, chunk)
+ for (i = 0; i < N; i++)
+ c[i] = i;
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/static.c b/gcc/testsuite/gcc.dg/gomp/static.c
new file mode 100644
index 000000000..8996d818b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/static.c
@@ -0,0 +1,14 @@
+static int bork;
+
+void bar(void);
+
+void foobar (void)
+{
+#pragma omp parallel
+ {
+#pragma omp for lastprivate(bork)
+ for (bork = 0; bork < 100; bork++) {
+ bar();
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/tls-1.c b/gcc/testsuite/gcc.dg/gomp/tls-1.c
new file mode 100644
index 000000000..9dc102e7e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/tls-1.c
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+int tp1;
+static int tp2;
+extern int tp3;
+
+int tp4 = 1;
+static int tp5 = 1;
+
+#pragma omp threadprivate (tp1, tp2, tp3, tp4, tp5)
+
+#pragma omp threadprivate (undef) // { dg-error "undeclared" }
+
+int tp6;
+int foo(void) { return tp6; }
+
+#pragma omp threadprivate (tp6) // { dg-error "after first use" }
diff --git a/gcc/testsuite/gcc.dg/gomp/tls-2.c b/gcc/testsuite/gcc.dg/gomp/tls-2.c
new file mode 100644
index 000000000..80275f908
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/tls-2.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+extern char buf[];
+#pragma omp threadprivate (buf) /* { dg-error "has incomplete type" } */
+
+void
+foo (void)
+{
+ int i;
+#pragma omp threadprivate (i) /* { dg-error "automatic variable" } */
+ i = 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/uninit-1.c b/gcc/testsuite/gcc.dg/gomp/uninit-1.c
new file mode 100644
index 000000000..223e617b4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/uninit-1.c
@@ -0,0 +1,13 @@
+// PR 24612
+// { dg-do compile }
+// { dg-options "-O -Wuninitialized -fopenmp" }
+
+void foo()
+{
+ int i;
+#pragma omp parallel shared(i)
+ {
+ i = 0;
+ ++i;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-1.c b/gcc/testsuite/gcc.dg/gomp/vla-1.c
new file mode 100644
index 000000000..bb37f33e6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-1.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n)
+{
+ int A[n];
+
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ A[0] = 0; // { dg-error "'A' not specified" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-2.c b/gcc/testsuite/gcc.dg/gomp/vla-2.c
new file mode 100644
index 000000000..fc18ffc57
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-2.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel private(A)
+ {
+ A[i] = 0;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-3.c b/gcc/testsuite/gcc.dg/gomp/vla-3.c
new file mode 100644
index 000000000..b1677b833
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-3.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel shared(A)
+ {
+ A[i] = sizeof(A);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-4.c b/gcc/testsuite/gcc.dg/gomp/vla-4.c
new file mode 100644
index 000000000..2c3c0aa43
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-4.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel firstprivate(A)
+ {
+ A[i] = 1;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-5.c b/gcc/testsuite/gcc.dg/gomp/vla-5.c
new file mode 100644
index 000000000..6c6d5517a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-5.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel sections lastprivate(A)
+ {
+ A[i] = 1;
+ }
+}