Hi! This is the gcc/testsuite/ part of the gomp-5_0-branch merge to trunk I've just committed.
2018-11-08 Jakub Jelinek <ja...@redhat.com> * c-c++-common/gomp/atomic-17.c: New test. * c-c++-common/gomp/atomic-18.c: New test. * c-c++-common/gomp/atomic-19.c: New test. * c-c++-common/gomp/atomic-20.c: New test. * c-c++-common/gomp/atomic-21.c: New test. * c-c++-common/gomp/atomic-22.c: New test. * c-c++-common/gomp/clauses-1.c (r2): New variable. (foo): Add ntm argument and test if and nontemporal clauses on constructs with simd. (bar): Put taskloop simd inside of taskgroup with task_reduction, use in_reduction clause instead of reduction. Add another taskloop simd without nogroup clause, but with reduction clause and a new in_reduction. Add ntm and i3 arguments. Test if and nontemporal clauses on constructs with simd. Change if clauses on some constructs from specific to the particular constituents to one without a modifier. Add new tests for combined host teams and for new parallel master and {,parallel }master taskloop{, simd} combined constructs. (baz): New function with host teams tests. * gcc.dg/gomp/combined-1.c: Moved to ... * c-c++-common/gomp/combined-1.c: ... here. Adjust expected library call. * c-c++-common/gomp/combined-2.c: New test. * c-c++-common/gomp/combined-3.c: New test. * c-c++-common/gomp/critical-1.c: New test. * c-c++-common/gomp/critical-2.c: New test. * c-c++-common/gomp/default-1.c: New test. * c-c++-common/gomp/defaultmap-1.c: New test. * c-c++-common/gomp/defaultmap-2.c: New test. * c-c++-common/gomp/defaultmap-3.c: New test. * c-c++-common/gomp/depend-5.c: New test. * c-c++-common/gomp/depend-6.c: New test. * c-c++-common/gomp/depend-iterator-1.c: New test. * c-c++-common/gomp/depend-iterator-2.c: New test. * c-c++-common/gomp/depobj-1.c: New test. * c-c++-common/gomp/flush-1.c: New test. * c-c++-common/gomp/flush-2.c: New test. * c-c++-common/gomp/for-1.c: New test. * c-c++-common/gomp/for-2.c: New test. * c-c++-common/gomp/for-3.c: New test. * c-c++-common/gomp/for-4.c: New test. * c-c++-common/gomp/for-5.c: New test. * c-c++-common/gomp/for-6.c: New test. * c-c++-common/gomp/for-7.c: New test. * c-c++-common/gomp/if-1.c (foo): Add some further tests. * c-c++-common/gomp/if-2.c (foo): Likewise. Expect slightly different diagnostics wording in one case. * c-c++-common/gomp/if-3.c: New test. * c-c++-common/gomp/master-combined-1.c: New test. * c-c++-common/gomp/master-combined-2.c: New test. * c-c++-common/gomp/nontemporal-1.c: New test. * c-c++-common/gomp/nontemporal-2.c: New test. * c-c++-common/gomp/reduction-task-1.c: New test. * c-c++-common/gomp/reduction-task-2.c: New test. * c-c++-common/gomp/requires-1.c: New test. * c-c++-common/gomp/requires-2.c: New test. * c-c++-common/gomp/requires-3.c: New test. * c-c++-common/gomp/requires-4.c: New test. * c-c++-common/gomp/schedule-modifiers-1.c (bar): Don't expect diagnostics for nonmonotonic modifier with static, runtime or auto schedule kinds. * c-c++-common/gomp/simd7.c: New test. * c-c++-common/gomp/target-data-1.c: New test. * c-c++-common/gomp/taskloop-reduction-1.c: New test. * c-c++-common/gomp/taskwait-depend-1.c: New test. * c-c++-common/gomp/teams-1.c: New test. * c-c++-common/gomp/teams-2.c: New test. * gcc.dg/gomp/appendix-a/a.24.1.c: Update from OpenMP examples. Add shared(c) clause. * gcc.dg/gomp/atomic-5.c (f1): Add another expected error. * gcc.dg/gomp/clause-1.c: Adjust expected diagnostics for const qualified vars without mutable member no longer being predeterined shared. * gcc.dg/gomp/sharing-1.c: Likewise. * g++.dg/gomp/clause-3.C: Likewise. * g++.dg/gomp/member-2.C: Likewise. * g++.dg/gomp/predetermined-1.C: Likewise. * g++.dg/gomp/private-1.C: Likewise. * g++.dg/gomp/sharing-1.C: Likewise. * g++.dg/gomp/sharing-2.C: Likewise. Add a few tests with aggregate const static data member without mutable elements. * gcc.dg/gomp/for-4.c: Expected nonmonotonic functions in the dumps. * gcc.dg/gomp/for-5.c: Likewise. * gcc.dg/gomp/for-6.c: Change expected library call. * gcc.dg/gomp/pr39495-2.c (foo): Don't expect errors on !=. * gcc.dg/gomp/reduction-2.c: New test. * gcc.dg/gomp/simd-1.c: New test. * gcc.dg/gomp/teams-1.c: Adjust expected diagnostic lines. * g++.dg/gomp/atomic-18.C: New test. * g++.dg/gomp/atomic-19.C: New test. * g++.dg/gomp/atomic-5.C (f1): Adjust expected lines of read-only variable messages. Add another expected error. * g++.dg/gomp/critical-3.C: New test. * g++.dg/gomp/depend-iterator-1.C: New test. * g++.dg/gomp/depend-iterator-2.C: New test. * g++.dg/gomp/depobj-1.C: New test. * g++.dg/gomp/doacross-1.C: New test. * g++.dg/gomp/for-21.C: New test. * g++.dg/gomp/for-4.C: Expected nonmonotonic functions in the dumps. * g++.dg/gomp/for-5.C: Likewise. * g++.dg/gomp/for-6.C: Change expected library call. * g++.dg/gomp/loop-4.C: New test. * g++.dg/gomp/pr33372-1.C: Adjust location of the expected diagnostics. * g++.dg/gomp/pr33372-3.C: Likewise. * g++.dg/gomp/pr39495-2.C (foo): Don't expect errors on !=. * g++.dg/gomp/simd-2.C: New test. * g++.dg/gomp/tpl-atomic-2.C: Adjust expected diagnostic lines. --- gcc/testsuite/c-c++-common/gomp/atomic-17.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/atomic-17.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,29 @@ +int i, v; +float f; + +void +foo () +{ + #pragma omp atomic release, hint (0), update + i = i + 1; + #pragma omp atomic hint(0)seq_cst + i = i + 1; + #pragma omp atomic relaxed,update,hint (0) + i = i + 1; + #pragma omp atomic release + i = i + 1; + #pragma omp atomic relaxed + i = i + 1; + #pragma omp atomic acq_rel capture + v = i = i + 1; + #pragma omp atomic capture,acq_rel , hint (1) + v = i = i + 1; + #pragma omp atomic hint(0),acquire capture + v = i = i + 1; + #pragma omp atomic read acquire + v = i; + #pragma omp atomic release,write + i = v; + #pragma omp atomic hint(1),update,release + f = f + 2.0; +} --- gcc/testsuite/c-c++-common/gomp/atomic-18.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/atomic-18.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,35 @@ +int i, v; +float f; + +void +foo (int j) +{ + #pragma omp atomic update,update /* { dg-error "too many atomic clauses" } */ + i = i + 1; + #pragma omp atomic seq_cst release /* { dg-error "too many memory order clauses" } */ + i = i + 1; + #pragma omp atomic read,release /* { dg-error "incompatible with 'acq_rel' or 'release' clauses" } */ + v = i; + #pragma omp atomic acq_rel read /* { dg-error "incompatible with 'acq_rel' or 'release' clauses" } */ + v = i; + #pragma omp atomic write acq_rel /* { dg-error "incompatible with 'acq_rel' or 'acquire' clauses" } */ + i = v; + #pragma omp atomic acquire , write /* { dg-error "incompatible with 'acq_rel' or 'acquire' clauses" } */ + i = v; + #pragma omp atomic update ,acquire /* { dg-error "incompatible with 'acq_rel' or 'acquire' clauses" } */ + i = i + 1; + #pragma omp atomic acq_rel update /* { dg-error "incompatible with 'acq_rel' or 'acquire' clauses" } */ + i = i + 1; + #pragma omp atomic acq_rel,hint(0) /* { dg-error "incompatible with 'acq_rel' or 'acquire' clauses" } */ + i = i + 1; + #pragma omp atomic acquire /* { dg-error "incompatible with 'acq_rel' or 'acquire' clauses" } */ + i = i + 1; + #pragma omp atomic capture hint (0) capture /* { dg-error "too many atomic clauses" } */ + v = i = i + 1; + #pragma omp atomic hint(j + 2) /* { dg-error "constant integer expression" } */ + i = i + 1; + #pragma omp atomic hint(f) /* { dg-error "integ" } */ + i = i + 1; + #pragma omp atomic foobar /* { dg-error "expected 'read', 'write', 'update', 'capture', 'seq_cst', 'acq_rel', 'release', 'relaxed' or 'hint' clause" } */ + i = i + 1; /* { dg-error "expected end of line before" "" { target *-*-* } .-1 } */ +} --- gcc/testsuite/c-c++-common/gomp/atomic-19.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/atomic-19.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-original" } */ +/* { dg-final { scan-tree-dump-times "omp atomic release" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic relaxed" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic read relaxed" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic capture relaxed" 1 "original" } } */ + +int i, j, k, l, m, n; + +void +foo () +{ + int v; + #pragma omp atomic release + i = i + 1; + #pragma omp requires atomic_default_mem_order (relaxed) + #pragma omp atomic + j = j + 1; + #pragma omp atomic update + k = k + 1; + #pragma omp atomic read + v = l; + #pragma omp atomic write + m = v; + #pragma omp atomic capture + v = n = n + 1; +} --- gcc/testsuite/c-c++-common/gomp/atomic-20.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/atomic-20.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-original" } */ +/* { dg-final { scan-tree-dump-times "omp atomic release" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic seq_cst" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic read seq_cst" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic capture seq_cst" 1 "original" } } */ + +int i, j, k, l, m, n; + +void +foo () +{ + int v; + #pragma omp atomic release + i = i + 1; + #pragma omp requires atomic_default_mem_order (seq_cst) + #pragma omp atomic + j = j + 1; + #pragma omp atomic update + k = k + 1; + #pragma omp atomic read + v = l; + #pragma omp atomic write + m = v; + #pragma omp atomic capture + v = n = n + 1; +} --- gcc/testsuite/c-c++-common/gomp/atomic-21.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/atomic-21.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-original" } */ +/* { dg-final { scan-tree-dump-times "omp atomic release" 4 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic read acquire" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "omp atomic capture acq_rel" 1 "original" } } */ + +int i, j, k, l, m, n; + +void +foo () +{ + int v; + #pragma omp atomic release + i = i + 1; + #pragma omp requires atomic_default_mem_order (acq_rel) + #pragma omp atomic + j = j + 1; + #pragma omp atomic update + k = k + 1; + #pragma omp atomic read + v = l; + #pragma omp atomic write + m = v; + #pragma omp atomic capture + v = n = n + 1; +} --- gcc/testsuite/c-c++-common/gomp/atomic-22.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/atomic-22.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,12 @@ +int i, j; + +void +foo () +{ + int v; + #pragma omp atomic release + i = i + 1; + #pragma omp atomic read + v = j; + #pragma omp requires atomic_default_mem_order (acq_rel) /* { dg-error "'atomic_default_mem_order' clause used lexically after first 'atomic' construct without memory order clause" } */ +} --- gcc/testsuite/c-c++-common/gomp/clauses-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/c-c++-common/gomp/clauses-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -5,11 +5,11 @@ int t; #pragma omp threadprivate (t) #pragma omp declare target -int f, l, ll, r; +int f, l, ll, r, r2; void foo (int d, int m, int i1, int i2, int p, int *idp, int s, - int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q) + int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q, int ntm) { #pragma omp distribute parallel for \ private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \ @@ -19,26 +19,50 @@ foo (int d, int m, int i1, int i2, int p ll++; #pragma omp distribute parallel for simd \ private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \ - if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \ - lastprivate (l) schedule(static, 4) \ + if (parallel: i2) if(simd: i1) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \ + lastprivate (l) schedule(static, 4) nontemporal(ntm) \ safelen(8) simdlen(4) aligned(q: 32) for (int i = 0; i < 64; i++) ll++; #pragma omp distribute simd \ private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \ - safelen(8) simdlen(4) aligned(q: 32) reduction(+:r) + safelen(8) simdlen(4) aligned(q: 32) reduction(+:r) if(i1) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; } #pragma omp end declare target void -bar (int d, int m, int i1, int i2, int p, int *idp, int s, - int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q, int *dd) +baz (int d, int m, int i1, int i2, int p, int *idp, int s, + int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q, int ntm) +{ + #pragma omp distribute parallel for \ + private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \ + if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \ + lastprivate (l) schedule(static, 4) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp distribute parallel for simd \ + private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \ + if (parallel: i2) if(simd: i1) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \ + lastprivate (l) schedule(static, 4) nontemporal(ntm) \ + safelen(8) simdlen(4) aligned(q: 32) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp distribute simd \ + private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \ + safelen(8) simdlen(4) aligned(q: 32) reduction(+:r) if(i1) nontemporal(ntm) + for (int i = 0; i < 64; i++) + ll++; +} + +void +bar (int d, int m, int i1, int i2, int i3, int p, int *idp, int s, + int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q, int *dd, int ntm) { #pragma omp for simd \ private (p) firstprivate (f) lastprivate (l) linear (ll:1) reduction(+:r) schedule(static, 4) collapse(1) nowait \ - safelen(8) simdlen(4) aligned(q: 32) + safelen(8) simdlen(4) aligned(q: 32) nontemporal(ntm) if(i1) for (int i = 0; i < 64; i++) ll++; #pragma omp parallel for \ @@ -47,9 +71,9 @@ bar (int d, int m, int i1, int i2, int p for (int i = 0; i < 64; i++) ll++; #pragma omp parallel for simd \ - private (p) firstprivate (f) if (parallel: i2) default(shared) shared(s) copyin(t) reduction(+:r) num_threads (nth) proc_bind(spread) \ + private (p) firstprivate (f) if (i2) default(shared) shared(s) copyin(t) reduction(+:r) num_threads (nth) proc_bind(spread) \ lastprivate (l) linear (ll:1) schedule(static, 4) collapse(1) \ - safelen(8) simdlen(4) aligned(q: 32) + safelen(8) simdlen(4) aligned(q: 32) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; #pragma omp parallel sections \ @@ -76,7 +100,7 @@ bar (int d, int m, int i1, int i2, int p device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \ if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \ lastprivate (l) linear (ll:1) schedule(static, 4) collapse(1) \ - safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0]) + safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0]) nontemporal(ntm) if (simd: i3) for (int i = 0; i < 64; i++) ll++; #pragma omp target teams \ @@ -103,31 +127,38 @@ bar (int d, int m, int i1, int i2, int p collapse(1) dist_schedule(static, 16) \ if (parallel: i2) num_threads (nth) proc_bind(spread) \ lastprivate (l) schedule(static, 4) \ - safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0]) + safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0]) nontemporal(ntm) if (simd: i3) for (int i = 0; i < 64; i++) ll++; #pragma omp target teams distribute simd \ - device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \ + device(d) map (tofrom: m) if (i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \ shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \ collapse(1) dist_schedule(static, 16) \ - safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0]) + safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0]) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; #pragma omp target simd \ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \ safelen(8) simdlen(4) lastprivate (l) linear(ll: 1) aligned(q: 32) reduction(+:r) \ - nowait depend(inout: dd[0]) + nowait depend(inout: dd[0]) nontemporal(ntm) if(simd:i3) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp taskgroup task_reduction(+:r2) + #pragma omp taskloop simd \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(taskloop: i1) if(simd: i2) final(fi) mergeable priority (pp) \ + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(default, +:r) in_reduction(+:r2) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; + #pragma omp taskgroup task_reduction(+:r) #pragma omp taskloop simd \ - private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(taskloop: i1) final(fi) mergeable nogroup priority (pp) \ - safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(+:r) + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(i1) final(fi) mergeable nogroup priority (pp) \ + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) in_reduction(+:r) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; #pragma omp taskwait #pragma omp taskloop simd \ private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) num_tasks (nta) collapse(1) if(taskloop: i1) final(fi) priority (pp) \ - safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(+:r) + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(+:r) if (simd: i3) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; #pragma omp target nowait depend(inout: dd[0]) @@ -150,14 +181,83 @@ bar (int d, int m, int i1, int i2, int p collapse(1) dist_schedule(static, 16) \ if (parallel: i2) num_threads (nth) proc_bind(spread) \ lastprivate (l) schedule(static, 4) \ - safelen(8) simdlen(4) aligned(q: 32) + safelen(8) simdlen(4) aligned(q: 32) if (simd: i3) nontemporal(ntm) for (int i = 0; i < 64; i++) ll++; #pragma omp target #pragma omp teams distribute simd \ private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \ collapse(1) dist_schedule(static, 16) \ - safelen(8) simdlen(4) aligned(q: 32) + safelen(8) simdlen(4) aligned(q: 32) if(i3) nontemporal(ntm) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp teams distribute parallel for \ + private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \ + collapse(1) dist_schedule(static, 16) \ + if (parallel: i2) num_threads (nth) proc_bind(spread) \ + lastprivate (l) schedule(static, 4) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp teams distribute parallel for simd \ + private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \ + collapse(1) dist_schedule(static, 16) \ + if (parallel: i2) num_threads (nth) proc_bind(spread) \ + lastprivate (l) schedule(static, 4) \ + safelen(8) simdlen(4) aligned(q: 32) if (simd: i3) nontemporal(ntm) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp teams distribute simd \ + private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \ + collapse(1) dist_schedule(static, 16) \ + safelen(8) simdlen(4) aligned(q: 32) if(i3) nontemporal(ntm) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp parallel master \ + private (p) firstprivate (f) if (parallel: i2) default(shared) shared(s) reduction(+:r) \ + num_threads (nth) proc_bind(spread) copyin(t) + ; + #pragma omp taskgroup task_reduction (+:r2) + #pragma omp master taskloop \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(taskloop: i1) final(fi) mergeable priority (pp) \ + reduction(default, +:r) in_reduction(+:r2) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp taskgroup task_reduction (+:r2) + #pragma omp master taskloop simd \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(taskloop: i1) if(simd: i2) final(fi) mergeable priority (pp) \ + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(default, +:r) in_reduction(+:r2) nontemporal(ntm) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp parallel master taskloop \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(taskloop: i1) final(fi) mergeable priority (pp) \ + reduction(default, +:r) if (parallel: i2) num_threads (nth) proc_bind(spread) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp parallel master taskloop simd \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) grainsize (g) collapse(1) untied if(taskloop: i1) if(simd: i2) final(fi) mergeable priority (pp) \ + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(default, +:r) nontemporal(ntm) if (parallel: i2) num_threads (nth) proc_bind(spread) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp taskgroup task_reduction (+:r2) + #pragma omp master taskloop \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) num_tasks (nta) collapse(1) untied if(i1) final(fi) mergeable priority (pp) \ + reduction(default, +:r) in_reduction(+:r2) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp taskgroup task_reduction (+:r2) + #pragma omp master taskloop simd \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) num_tasks (nta) collapse(1) untied if(i1) final(fi) mergeable priority (pp) \ + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(default, +:r) in_reduction(+:r2) nontemporal(ntm) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp parallel master taskloop \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) num_tasks (nta) collapse(1) untied if(i1) final(fi) mergeable priority (pp) \ + reduction(default, +:r) num_threads (nth) proc_bind(spread) copyin(t) + for (int i = 0; i < 64; i++) + ll++; + #pragma omp parallel master taskloop simd \ + private (p) firstprivate (f) lastprivate (l) shared (s) default(shared) num_tasks (nta) collapse(1) untied if(i1) final(fi) mergeable priority (pp) \ + safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(default, +:r) nontemporal(ntm) num_threads (nth) proc_bind(spread) copyin(t) for (int i = 0; i < 64; i++) ll++; } --- gcc/testsuite/c-c++-common/gomp/combined-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/combined-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fopenmp -fdump-tree-optimized" } */ + +int a[10]; +void 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_maybe_nonmonotonic_runtime" 3 "optimized" } } */ --- gcc/testsuite/c-c++-common/gomp/combined-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/combined-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fopenmp -fdump-tree-optimized" } */ + +int a[10]; +void foo (void) +{ + int i; +#pragma omp parallel for schedule(monotonic:runtime) + for (i = 0; i < 10; i++) + a[i] = i; +#pragma omp parallel +#pragma omp for schedule(monotonic :runtime) + for (i = 0; i < 10; i++) + a[i] = 10 - i; +#pragma omp parallel + { +#pragma omp for schedule(monotonic: runtime) + for (i = 0; i < 10; i++) + a[i] = i; + } +} + +/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_runtime" 3 "optimized" } } */ --- gcc/testsuite/c-c++-common/gomp/combined-3.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/combined-3.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fopenmp -fdump-tree-optimized" } */ + +int a[10]; +void foo (void) +{ + int i; +#pragma omp parallel for schedule(nonmonotonic:runtime) + for (i = 0; i < 10; i++) + a[i] = i; +#pragma omp parallel +#pragma omp for schedule(nonmonotonic :runtime) + for (i = 0; i < 10; i++) + a[i] = 10 - i; +#pragma omp parallel + { +#pragma omp for schedule(nonmonotonic: runtime) + for (i = 0; i < 10; i++) + a[i] = i; + } +} + +/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_nonmonotonic_runtime" 3 "optimized" } } */ --- gcc/testsuite/c-c++-common/gomp/critical-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/critical-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,14 @@ +int i; + +void +foo (void) +{ + #pragma omp critical + i = i + 1; + #pragma omp critical (foo) + i = i + 1; + #pragma omp critical (foo) hint (0) + i = i + 1; + #pragma omp critical (foo),hint(1) + i = i + 1; +} --- gcc/testsuite/c-c++-common/gomp/critical-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/critical-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,10 @@ +int i; + +void +foo (int j) +{ + #pragma omp critical (foo) hint (j + 1) /* { dg-error "constant integer expression" } */ + i = i + 1; + #pragma omp critical (foo),hint(j) /* { dg-error "constant integer expression" } */ + i = i + 1; +} --- gcc/testsuite/c-c++-common/gomp/default-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/default-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,22 @@ +void +foo (void) +{ + int x = 0, i; + #pragma omp task default(none) /* { dg-error "enclosing 'task'" } */ + { + x++; /* { dg-error "'x' not specified in enclosing 'task'" } */ + } + #pragma omp taskloop default(none) /* { dg-error "enclosing 'taskloop'" } */ + for (i = 0; i < 64; i++) + { + x++; /* { dg-error "'x' not specified in enclosing 'taskloop'" } */ + } + #pragma omp teams default(none) /* { dg-error "enclosing 'teams'" } */ + { + x++; /* { dg-error "'x' not specified in enclosing 'teams'" } */ + } + #pragma omp parallel default(none) /* { dg-error "enclosing 'parallel'" } */ + { + x++; /* { dg-error "'x' not specified in enclosing 'parallel'" } */ + } +} --- gcc/testsuite/c-c++-common/gomp/defaultmap-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/defaultmap-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,30 @@ +void +foo (void) +{ + #pragma omp target defaultmap(alloc) defaultmap(alloc) /* { dg-error "too many 'defaultmap' clauses with unspecified category" } */ + ; + #pragma omp target defaultmap(to) defaultmap(from) /* { dg-error "too many 'defaultmap' clauses with unspecified category" } */ + ; + #pragma omp target defaultmap(tofrom) defaultmap(firstprivate:scalar) /* { dg-error "too many 'defaultmap' clauses with 'scalar' category" } */ + ; + #pragma omp target defaultmap(none:aggregate) defaultmap(alloc:scalar) defaultmap(none:scalar) /* { dg-error "too many 'defaultmap' clauses with 'scalar' category" } */ + ; + #pragma omp target defaultmap(none : pointer) defaultmap ( none ) /* { dg-error "too many 'defaultmap' clauses with 'pointer' category" } */ + ; + #pragma omp target defaultmap() /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(for) /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(blah) /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(tofrom:) /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(tofrom scalar) /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(tofrom,scalar) /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(default ;) /* { dg-error "expected" } */ + ; + #pragma omp target defaultmap(default : qux) /* { dg-error "expected" } */ + ; +} --- gcc/testsuite/c-c++-common/gomp/defaultmap-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/defaultmap-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,131 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-gimple" } */ + +struct S { int s; }; +void foo (char *); +void bar (int, char *, struct S, int *); +#pragma omp declare target to (bar) +#define N 16 + +void +f1 (int sc1, struct S ag1, int *pt1) +{ + char ar1[N]; + foo (ar1); + #pragma omp target + bar (sc1, ar1, ag1, pt1); +/* { dg-final { scan-tree-dump "firstprivate\\(sc1\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:ar1" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:ag1" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(firstprivate:pt1 .pointer assign" "gimple" } } */ +} + +void +f2 (int sc2, struct S ag2, int *pt2) +{ + char ar2[N]; + foo (ar2); + #pragma omp target firstprivate (sc2, ar2, ag2, pt2) defaultmap (none) + bar (sc2, ar2, ag2, pt2); +/* { dg-final { scan-tree-dump "firstprivate\\(sc2\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(ar2\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(ag2\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(pt2\\)" "gimple" } } */ +} + +void +f3 (int sc3, struct S ag3, int *pt3) +{ + char ar3[N]; + foo (ar3); + #pragma omp target defaultmap(none:scalar) defaultmap(none:aggregate) \ + map (sc3, ar3, ag3, pt3) defaultmap(none:pointer) + bar (sc3, ar3, ag3, pt3); +/* { dg-final { scan-tree-dump "map\\(tofrom:sc3" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:ar3" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:ag3" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:pt3" "gimple" } } */ +} + +void +f4 (int sc4, struct S ag4, int *pt4) +{ + char ar4[N]; + foo (ar4); + #pragma omp target defaultmap(tofrom:scalar) + bar (sc4, ar4, ag4, pt4); +/* { dg-final { scan-tree-dump "map\\(tofrom:sc4" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:ar4" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:ag4" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(firstprivate:pt4 .pointer assign" "gimple" } } */ +} + +void +f5 (int sc5, struct S ag5, int *pt5) +{ + char ar5[N]; + foo (ar5); + #pragma omp target defaultmap(to) + bar (sc5, ar5, ag5, pt5); +/* { dg-final { scan-tree-dump "map\\(to:sc5" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(to:ar5" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(to:ag5" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(to:pt5" "gimple" } } */ +} + +void +f6 (int sc6, struct S ag6, int *pt6) +{ + char ar6[N]; + foo (ar6); + #pragma omp target defaultmap(firstprivate) + bar (sc6, ar6, ag6, pt6); +/* { dg-final { scan-tree-dump "firstprivate\\(sc6\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(ar6\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(ag6\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(pt6\\)" "gimple" } } */ +} + +void +f7 (int sc7, struct S ag7, int *pt7) +{ + char ar7[N]; + foo (ar7); + #pragma omp target defaultmap(alloc: scalar) defaultmap(from: aggregate) defaultmap(default: pointer) + { + int *q = &sc7; + *q = 6; + ag7.s = 5; + int i; + for (i = 0; i < N; ++i) + ar7[i] = 7; + bar (sc7, ar7, ag7, pt7); + } +/* { dg-final { scan-tree-dump "map\\(alloc:sc7" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(from:ar7" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(from:ag7" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(firstprivate:pt7 .pointer assign" "gimple" } } */ +} + +void +f8 (int sc8, struct S ag8, int *pt8) +{ + char ar8[N]; + foo (ar8); + #pragma omp target defaultmap(firstprivate:aggregate) defaultmap(none:scalar) \ + defaultmap(tofrom:pointer) map(to: sc8) + bar (sc8, ar8, ag8, pt8); +/* { dg-final { scan-tree-dump "map\\(to:sc8" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(ar8\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "firstprivate\\(ag8\\)" "gimple" } } */ +/* { dg-final { scan-tree-dump "map\\(tofrom:pt8" "gimple" } } */ +} + +void +f9 (int sc9, struct S ag9) +{ + char ar9[sc9 + 2]; + foo (ar9); + #pragma omp target defaultmap(none) map(to: ar9, ag9) firstprivate (sc9) + bar (sc9, ar9, ag9, &sc9); +} --- gcc/testsuite/c-c++-common/gomp/defaultmap-3.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/defaultmap-3.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,34 @@ +/* { dg-do compile } */ + +struct S { int s; }; +void foo (char *); +void bar (int, char *, struct S, int *); +#pragma omp declare target to (bar) +#define N 16 + +void +f1 (int sc1, struct S ag1, int *pt1) +{ + char ar1[N]; + foo (ar1); + #pragma omp target defaultmap(default:scalar) defaultmap(to:aggregate) defaultmap(none:pointer) /* { dg-error "enclosing 'target'" } */ + bar (sc1, ar1, ag1, pt1); /* { dg-error "'pt1' not specified in enclosing 'target'" } */ +} + +void +f2 (int sc2, struct S ag2, int *pt2) +{ + char ar2[N]; + foo (ar2); + #pragma omp target defaultmap(none:scalar) defaultmap(from:aggregate) defaultmap(default:pointer) /* { dg-error "enclosing 'target'" } */ + bar (sc2, ar2, ag2, pt2); /* { dg-error "'sc2' not specified in enclosing 'target'" } */ +} + +void +f3 (int sc3, struct S ag3, int *pt3) +{ + char ar3[N]; + foo (ar3); + #pragma omp target defaultmap(firstprivate:scalar) defaultmap(none:aggregate) defaultmap(to:pointer) /* { dg-error "enclosing 'target'" } */ + bar (sc3, ar3, ag3, pt3); /* { dg-error "'ar3' not specified in enclosing 'target'" } */ +} /* { dg-error "'ag3' not specified in enclosing 'target'" "" { target *-*-* } .-1 } */ --- gcc/testsuite/c-c++-common/gomp/depend-5.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/depend-5.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,48 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct T { int c[3]; }; +struct S { int a; struct T *b; struct T g; }; +struct S d[10]; +struct S *e[10]; +struct S *f; +struct S h; + +void +foo (void) +{ + #pragma omp task depend(inout: d) + ; + #pragma omp task depend(out: d[2]) + ; + #pragma omp task depend(in: d[:]) + ; + #pragma omp task depend(in: d[2:2]) + ; + #pragma omp task depend(in: d[:2]) + ; + #pragma omp task depend(inout: d[1].b->c[2]) + ; + #pragma omp task depend(out: d[0].a) + ; + #pragma omp task depend(in: e[3]->a) + ; + #pragma omp task depend(inout: e[2]->b->c) + ; + #pragma omp task depend(in: e[1]->b->c[2]) + ; + #pragma omp task depend(out: (*f).a) + ; + #pragma omp task depend(inout: f->b->c[0]) + ; + #pragma omp task depend(in: f) + ; + #pragma omp task depend(out: *f) + ; + #pragma omp task depend(inout: f[0]) + ; + #pragma omp task depend(in: f[0].a) + ; + #pragma omp task depend(inout: h.g.c[2]) + ; +} --- gcc/testsuite/c-c++-common/gomp/depend-6.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/depend-6.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct T { int c[3]; }; +struct S { int a; struct T *b; struct T g; }; +struct U { int a : 5; }; +struct S d[10]; +struct S *e[10]; +struct S *f; +struct S h; +struct U i; + +void +foo (void) +{ + #pragma omp task depend(in: d[:2].b->c[2]) /* { dg-error "expected" } */ + ; + #pragma omp task depend(inout: d[1:].b->c[2]) /* { dg-error "expected" } */ + ; + #pragma omp task depend(out: d[0:1].a) /* { dg-error "expected" } */ + ; + #pragma omp task depend(in: e[3:2]->a) /* { dg-error "expected" } */ + ; + #pragma omp task depend(inout: e[2:2]->b->c) /* { dg-error "expected" } */ + ; + #pragma omp task depend(in: e[1]->b->c[2:1]) /* { dg-error "expected" } */ + ; + #pragma omp task depend(out: f + 0) /* { dg-error "not lvalue expression" } */ + ; + #pragma omp task depend(inout: f[0:1].a) /* { dg-error "expected" } */ + ; + #pragma omp task depend(inout: h.g.c[2:1]) /* { dg-error "expected" } */ + ; + #pragma omp task depend(in: i.a) /* { dg-error "bit-field '\[^\n\r]*' in 'depend' clause" } */ + ; +} --- gcc/testsuite/c-c++-common/gomp/depend-iterator-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/depend-iterator-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,75 @@ +int arr[64], arr2[64]; +struct S { int a[4]; } k; +short arr4[4]; +volatile int v; +#define TEST_EQ(x,y) ({ int o[x == y ? 1 : -1]; 0; }) + +void +foo (unsigned char i, signed char j) +{ + #pragma omp task depend (iterator (j=6:2:-2) , out : \ + arr[TEST_EQ (sizeof (j), sizeof (int)), \ + TEST_EQ (sizeof (i), sizeof (unsigned char)), \ + TEST_EQ (sizeof (k), sizeof (struct S)), j], \ + arr2[TEST_EQ (((__typeof (j)) -1) < 0, 1), \ + TEST_EQ (((__typeof (i)) -1) < 0, 0), \ + TEST_EQ (((__typeof (k.a[0])) -1) < 0, 1), j]) \ + depend(out: arr[0]) \ + depend (iterator (long long i=__LONG_LONG_MAX__ - 4:__LONG_LONG_MAX__ - 2:2, \ + unsigned short j=~0U-16:~0U-8:3, \ + short *k=&arr4[1]:&arr4[2]:1) , in : \ + arr[TEST_EQ (sizeof (i), sizeof (long long)), \ + TEST_EQ (sizeof (j), sizeof (unsigned short)), \ + TEST_EQ (sizeof (k), sizeof (short *)), \ + TEST_EQ (sizeof (*k), sizeof (short)), i - __LONG_LONG_MAX__ + 4], \ + arr2[TEST_EQ (((__typeof (i)) -1) < 0, 1), \ + TEST_EQ (((__typeof (j)) -1) < 0, 0), \ + TEST_EQ (((__typeof (*k)) -1) < 0, 1), j - (~0U-16)], \ + arr2[k - &arr4[0]]) \ + depend(in : k) + v++; +} + +void +bar (unsigned char i, signed char j) +{ + int m = j; + int n = j + 2; + #pragma omp task depend (iterator (j=6:2:m) , out : \ + arr[TEST_EQ (sizeof (j), sizeof (int)), \ + TEST_EQ (sizeof (i), sizeof (unsigned char)), \ + TEST_EQ (sizeof (k), sizeof (struct S)), j], \ + arr2[TEST_EQ (((__typeof (j)) -1) < 0, 1), \ + TEST_EQ (((__typeof (i)) -1) < 0, 0), \ + TEST_EQ (((__typeof (k.a[0])) -1) < 0, 1), j]) \ + depend(out: arr[0]) \ + depend (iterator (long long i=__LONG_LONG_MAX__ - 4 - n:__LONG_LONG_MAX__ - 2:2, \ + unsigned short j=~0U-16:~0U-8-n:3, \ + short *k=&arr4[1]:&arr4[n + 2]:1) , in : \ + arr[TEST_EQ (sizeof (i), sizeof (long long)), \ + TEST_EQ (sizeof (j), sizeof (unsigned short)), \ + TEST_EQ (sizeof (k), sizeof (short *)), \ + TEST_EQ (sizeof (*k), sizeof (short)), i - __LONG_LONG_MAX__ + 4], \ + arr2[TEST_EQ (((__typeof (i)) -1) < 0, 1), \ + TEST_EQ (((__typeof (j)) -1) < 0, 0), \ + TEST_EQ (((__typeof (*k)) -1) < 0, 1), j - (~0U-16)], \ + arr2[k - &arr4[0]:10]) \ + depend(in : k) + v++; +} + +void +baz (void) +{ + #pragma omp parallel + #pragma omp master + { + #pragma omp task depend(iterator(unsigned long int k = 0 : 2) , inout : \ + arr[TEST_EQ (sizeof (k), sizeof (unsigned long)), \ + TEST_EQ (((__typeof (k)) -1) < 0, 0), k]) \ + depend(iterator(signed char s = -3 : -12 : -1) , out : \ + arr[TEST_EQ (sizeof (s), sizeof (signed char)), \ + TEST_EQ (((__typeof (s)) -1) < 0, 1), s + 12]) + v++; + } +} --- gcc/testsuite/c-c++-common/gomp/depend-iterator-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/depend-iterator-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,97 @@ +int a, b[64]; +struct S { int c; } *d, *e; +struct T; +struct T *f, *g; +int *h; + +void +f1 (void) +{ + #pragma omp task depend (iterator , in : a) /* { dg-error "expected" } */ + ; + #pragma omp task depend (iterator (for = 0 : 2) , in : a) /* { dg-error "expected" } */ + ; + #pragma omp task depend (iterator (5 = 0 : 2) , in : a) /* { dg-error "expected" } */ + ; + #pragma omp task depend (iterator (i : 0 : 2) , in : a) /* { dg-error "expected '='|name a type|expected" } */ + ; + #pragma omp task depend (iterator (i = 0, 1 : 2) , in : a) /* { dg-error "expected" } */ + ; + #pragma omp task depend (iterator (i = (0, 1) : 2) , in : a) + ; + #pragma omp task depend (iterator (i = 0 : 1 : 2 : 3) , in : a) /* { dg-error "expected '.'" } */ + ; + #pragma omp task depend (iterator (i = 0 : 2, 3) , in : a) /* { dg-error "expected" } */ + ; + #pragma omp task depend (iterator (i = 0 : 10 : 2, 3) , in : a) /* { dg-error "expected" } */ + ; + #pragma omp task depend (iterator (i = 0:1), iterator (j = 0:1) , in : a) /* { dg-error "invalid depend kind" } */ + ; + #pragma omp task depend (iterator (i = 0:32) , in : b[i*2:2]) + ; + #pragma omp task depend (iterator (struct S i = 0:1), in : a) /* { dg-error "iterator 'i' has neither integral nor pointer type" } */ + ; + #pragma omp task depend (iterator (void i = 0:1) , in : a) /* { dg-error "iterator 'i' has neither integral nor pointer type" } */ + ; + #pragma omp task depend (iterator (float f = 0.2:0.4) , in : a) /* { dg-error "iterator 'f' has neither integral nor pointer type" } */ + ; + #pragma omp task depend (iterator (struct S *p = d:e:2) , in : a) + ; + #pragma omp task depend (iterator (struct T *p = f:g) , in : a) /* { dg-error "invalid use of" } */ + ; + #pragma omp task depend (iterator (int i = 0:4, \ + struct U { int (*p)[i + 2]; } *p = 0:2) , in : a) /* { dg-error "type of iterator 'p' refers to outer iterator 'i'" "" { target c } } */ + ; /* { dg-error "types may not be defined in iterator type|not an integer constant" "" { target c++ } .-1 } */ + #pragma omp task depend (iterator (i = 0:4, j = i:16) , in : a) /* { dg-error "begin expression refers to outer iterator 'i'" } */ + ; + #pragma omp task depend (iterator (i = 0:4, j = 2:i:1) , in : a) /* { dg-error "end expression refers to outer iterator 'i'" } */ + ; + #pragma omp task depend (iterator (i = 0:4, j = 2:8:i) , in : a) /* { dg-error "step expression refers to outer iterator 'i'" } */ + ; + #pragma omp task depend (iterator (i = *d:2) , in : a) /* { dg-error "aggregate value used where an integer was expected" "" { target c } } */ + ; /* { dg-error "invalid cast from type 'S' to type 'int'" "" { target c++ } .-1 } */ + #pragma omp task depend (iterator (i = 2:*d:2) , in : a) /* { dg-error "aggregate value used where an integer was expected" "" { target c } } */ + ; /* { dg-error "invalid cast from type 'S' to type 'int'" "" { target c++ } .-1 } */ + #pragma omp task depend (iterator (i = 2:4:*d) , in : a) /* { dg-error "iterator step with non-integral type" } */ + ; + #pragma omp task depend (iterator (i = 1.25:2.5:3) , in : a) + ; + #pragma omp task depend (iterator (i = 1:2:3.5) , in : a) /* { dg-error "iterator step with non-integral type" } */ + ; + #pragma omp task depend (iterator (int *p = 23 : h) , in : a) + ; + #pragma omp task depend (iterator (short i=1:3:0) , in : a) /* { dg-error "iterator 'i' has zero step" } */ + ; + #pragma omp task depend (iterator (i = 1 : 3 : 3 - 3) , in : a) /* { dg-error "iterator 'i' has zero step" } */ + ; + #pragma omp task depend (iterator (int *p = &b[6]:&b[9]:4 - 4) , in : a) /* { dg-error "iterator 'p' has zero step" } */ + ; + #pragma omp task depend (iterator (const int i = 0 : 2) , in : a) /* { dg-error "const qualified" } */ + ; + #pragma omp task depend (iterator (const long long unsigned i = 0 : 2) , in : a) /* { dg-error "const qualified" } */ + ; +#if !defined (__cplusplus) && __STDC_VERSION__ >= 201112L + #pragma omp task depend (iterator (_Atomic unsigned i = 0 : 2) , in : a) /* { dg-error "_Atomic" "" { target c } } */ + ; +#endif +} + +void +f2 (void) +{ + int i, j; + #pragma omp for ordered(2) + for (i = 0; i < 64; i++) + for (j = 0; j < 64; j++) + { + #pragma omp ordered depend (iterator (k=0:1) , sink: i - 1, j - 1) /* { dg-error "'iterator' modifier incompatible with 'sink'" } */ + #pragma omp ordered depend (iterator (int l = 0:2:3) , source) /* { dg-error "'iterator' modifier incompatible with 'source'" } */ + } +} + +void +f3 (void) +{ + #pragma omp task depend (iterator (i = 0:1), iterator (j = 0:1) , in : a) /* { dg-error "invalid depend kind" } */ + ; +} --- gcc/testsuite/c-c++-common/gomp/depobj-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/depobj-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,63 @@ +typedef struct __attribute__((__aligned__ (sizeof (void *)))) omp_depend_t { + char __omp_depend_t__[2 * sizeof (void *)]; +} omp_depend_t; + +omp_depend_t bar (void); +extern const omp_depend_t cdepobj; +extern omp_depend_t depobj; +extern omp_depend_t depobja[4]; +extern omp_depend_t *pdepobj; +int a, b, i, j; + +void +f1 (void) +{ + #pragma omp depobj(depobj) depend(in : a) + #pragma omp depobj(depobj) update(inout) + #pragma omp task depend (depobj: depobj) + ; + #pragma omp depobj(depobj) destroy + #pragma omp task depend (iterator (i=1:3) , depobj: *(depobja + i)) + ; + #pragma omp depobj(pdepobj[0]) depend(mutexinoutset:a) + #pragma omp depobj(*pdepobj) destroy +} + +void +f2 (void) +{ + omp_depend_t depobjb[4]; + #pragma omp depobj /* { dg-error "expected" } */ + #pragma omp depobj destroy /* { dg-error "expected" } */ + #pragma omp depobj (depobj) /* { dg-error "expected 'depend', 'destroy' or 'update' clause" } */ + #pragma omp depobj (depobj) foobar /* { dg-error "expected 'depend', 'destroy' or 'update' clause" } */ + #pragma omp depobj(bar ()) update(inout) /* { dg-error "'depobj' expression is not lvalue expression" } */ + #pragma omp depobj (cdepobj) update(in) /* { dg-error "'const' qualified 'depobj' expression" } */ + #pragma omp depobj (depobjb) depend(in: a) /* { dg-error "type of 'depobj' expression is not 'omp_depend_t'" } */ + #pragma omp depobj (pdepobj) depend(in: a) /* { dg-error "type of 'depobj' expression is not 'omp_depend_t'" } */ + #pragma omp depobj (a) destroy /* { dg-error "type of 'depobj' expression is not 'omp_depend_t'" } */ + #pragma omp depobj (depobj) depend(depobj:a) /* { dg-error "does not have 'omp_depend_t' type in 'depend' clause with 'depobj' dependence type" } */ + #pragma omp depobj (depobj) depend(depobj:*depobjb) /* { dg-error "'depobj' dependence type specified in 'depend' clause on 'depobj' construct" } */ + #pragma omp depobj (depobj) update(foobar) /* { dg-error "expected 'in', 'out', 'inout' or 'mutexinoutset'" } */ + #pragma omp depobj (depobj) depend(in: *depobja) /* { dg-error "should not have 'omp_depend_t' type in 'depend' clause with dependence type" } */ + #pragma omp depobj (depobj) depend(in: a) depend(in: b) /* { dg-error "expected" } */ + #pragma omp depobj (depobj) depend(in: a) update(out) /* { dg-error "expected" } */ + #pragma omp depobj (depobj) depend(in: a, b) /* { dg-error "more than one locator in 'depend' clause on 'depobj' construct" } */ + #pragma omp depobj (depobj) depend(source) /* { dg-error "'depend\\(source\\)' is only allowed in 'omp ordered'" } */ + #pragma omp depobj (depobj) depend(sink: i + 1, j - 1) /* { dg-error "'depend\\(sink\\)' is only allowed in 'omp ordered'" } */ + #pragma omp depobj (depobj) depend(iterator (i = 0:2) , in : a) /* { dg-error "'iterator' modifier may not be specified on 'depobj' construct" } */ + if (0) + #pragma omp depobj (depobj) destroy /* { dg-error "'#pragma omp depobj' may only be used in compound statements" } */ + ; +} + +void +f3 (void) +{ + #pragma omp task depend (depobj: depobja[1:2]) /* { dg-error "'depend' clause with 'depobj' dependence type on array section" } */ + ; + #pragma omp task depend (depobj: a) /* { dg-error "'a' does not have 'omp_depend_t' type in 'depend' clause with 'depobj' dependence type" } */ + ; + #pragma omp task depend (in: depobj) /* { dg-error "'depobj' should not have 'omp_depend_t' type in 'depend' clause with dependence type" } */ + ; +} --- gcc/testsuite/c-c++-common/gomp/flush-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/flush-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,39 @@ +/* { dg-additional-options "-fdump-tree-gimple" } */ +/* { dg-final { scan-tree-dump "foo \\(4\\);\[\n\r]* __atomic_thread_fence \\(4\\);\[\n\r]* foo \\(4\\);" "gimple" } } */ +/* { dg-final { scan-tree-dump "foo \\(3\\);\[\n\r]* __atomic_thread_fence \\(3\\);\[\n\r]* foo \\(3\\);" "gimple" } } */ +/* { dg-final { scan-tree-dump "foo \\(2\\);\[\n\r]* __atomic_thread_fence \\(2\\);\[\n\r]* foo \\(2\\);" "gimple" } } */ +/* { dg-final { scan-tree-dump "foo \\(5\\);\[\n\r]* __sync_synchronize \\(\\);\[\n\r]* foo \\(5\\);" "gimple" } } */ + +void foo (int); + +void +f1 (void) +{ + foo (4); + #pragma omp flush acq_rel + foo (4); +} + +void +f2 (void) +{ + foo (3); + #pragma omp flush release + foo (3); +} + +void +f3 (void) +{ + foo (2); + #pragma omp flush acquire + foo (2); +} + +void +f4 (void) +{ + foo (5); + #pragma omp flush + foo (5); +} --- gcc/testsuite/c-c++-common/gomp/flush-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/flush-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,17 @@ +int a, b; + +void +foo (void) +{ + #pragma omp flush + #pragma omp flush (a, b) + #pragma omp flush acquire + #pragma omp flush release + #pragma omp flush acq_rel + #pragma omp flush relaxed /* { dg-error "expected 'acq_rel', 'release' or 'acquire'" } */ + #pragma omp flush seq_cst /* { dg-error "expected 'acq_rel', 'release' or 'acquire'" } */ + #pragma omp flush foobar /* { dg-error "expected 'acq_rel', 'release' or 'acquire'" } */ + #pragma omp flush acquire (a, b) /* { dg-error "'flush' list specified together with memory order clause" } */ + #pragma omp flush release (a, b) /* { dg-error "'flush' list specified together with memory order clause" } */ + #pragma omp flush acq_rel (a, b) /* { dg-error "'flush' list specified together with memory order clause" } */ +} --- gcc/testsuite/c-c++-common/gomp/for-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,60 @@ +void bar (int); + +int a[256]; + +void +foo (void) +{ + int i; + #pragma omp for + for (i = 0; i != 64; i++) + bar (i); + #pragma omp for + for (i = 128; i != 64; i--) + bar (i); + #pragma omp for + for (i = 0; i != 64; i = i + 1) + bar (i); + #pragma omp for + for (i = 128; i != 64; i = i - 1) + bar (i); + #pragma omp for + for (i = 0; i != 64; i = 1 + i) + bar (i); + #pragma omp for + for (i = 128; i != 64; i = -1 + i) + bar (i); + #pragma omp for + for (i = 0; i != 64; i += 1) + bar (i); + #pragma omp for + for (i = 128; i != 64; i -= 1) + bar (i); + #pragma omp single + { + #pragma omp simd + for (i = 0; i != 64; i++) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i--) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 0; i != 64; i = i + 1) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i = i - 1) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 0; i != 64; i = 1 + i) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i = -1 + i) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 0; i != 64; i += 1) + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i -= 1) + a[i] = a[i] + 1; + } +} --- gcc/testsuite/c-c++-common/gomp/for-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,31 @@ +void bar (short *); + +void +foo (short *q, short *r, short *s) +{ + short *p; + #pragma omp for + for (p = q; p != r; p++) + bar (p); + #pragma omp for + for (p = s; p != r; p--) + bar (p); + #pragma omp for + for (p = q; p != r; p = p + 1) + bar (p); + #pragma omp for + for (p = s; p != r; p = p - 1) + bar (p); + #pragma omp for + for (p = q; p != r; p = 1 + p) + bar (p); + #pragma omp for + for (p = s; p != r; p = -1 + p) + bar (p); + #pragma omp for + for (p = q; p != r; p += 1) + bar (p); + #pragma omp for + for (p = s; p != r; p -= 1) + bar (p); +} --- gcc/testsuite/c-c++-common/gomp/for-3.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-3.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,48 @@ +void bar (int); + +int a[256]; + +void +foo (int j) +{ + int i; + #pragma omp for + for (i = 0; i != 64; i = i + 4) /* { dg-error "increment is not constant 1 or -1" } */ + bar (i); + #pragma omp for + for (i = 128; i != 64; i = i - 4) /* { dg-error "increment is not constant 1 or -1" } */ + bar (i); + #pragma omp for + for (i = 0; i != 64; i = j + i) /* { dg-error "increment is not constant 1 or -1" } */ + bar (i); + #pragma omp for + for (i = 128; i != 64; i = -16 + i) /* { dg-error "increment is not constant 1 or -1" } */ + bar (i); + #pragma omp for + for (i = 0; i != 64; i += j) /* { dg-error "increment is not constant 1 or -1" } */ + bar (i); + #pragma omp for + for (i = 128; i != 64; i -= 8) /* { dg-error "increment is not constant 1 or -1" } */ + bar (i); + #pragma omp single + { + #pragma omp simd + for (i = 0; i != 64; i = i + 16) /* { dg-error "increment is not constant 1 or -1" } */ + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i = i - 2) /* { dg-error "increment is not constant 1 or -1" } */ + a[i] = a[i] + 1; + #pragma omp simd + for (i = 0; i != 64; i = j + i) /* { dg-error "increment is not constant 1 or -1" } */ + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i = -j + i) /* { dg-error "increment is not constant 1 or -1" } */ + a[i] = a[i] + 1; + #pragma omp simd + for (i = 0; i != 64; i += 8) /* { dg-error "increment is not constant 1 or -1" } */ + a[i] = a[i] + 1; + #pragma omp simd + for (i = 128; i != 64; i -= j) /* { dg-error "increment is not constant 1 or -1" } */ + a[i] = a[i] + 1; + } +} --- gcc/testsuite/c-c++-common/gomp/for-4.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-4.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,25 @@ +void bar (short *); + +void +foo (short *q, short *r, short *s, long t) +{ + short *p; + #pragma omp for + for (p = q; p != r; p = p + 5) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p = p - 2) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p = t + p) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p = -t + p) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p += t) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p -= 7) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); +} --- gcc/testsuite/c-c++-common/gomp/for-5.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-5.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,50 @@ +// { dg-options "-fopenmp" } + +void bar (void *); + +__attribute__((noinline, noclone)) void +foo (void *qx, void *rx, void *sx, int n) +{ + unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n]; + q = (typeof (q)) qx; + r = (typeof (r)) rx; + s = (typeof (s)) sx; + int t = 1; + int o = -1; + #pragma omp for + for (p = q; p != r; p += t) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p += o) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p = p + t) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p = p + o) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p = t + p) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p = o + p) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p += 2) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p -= 2) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p = p + 3) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p = p - 3) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = q; p != r; p = 4 + p) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); + #pragma omp for + for (p = s; p != r; p = -5 + p) /* { dg-error "increment is not constant 1 or -1" } */ + bar (p); +} --- gcc/testsuite/c-c++-common/gomp/for-6.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-6.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(monotonic: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" } } */ --- gcc/testsuite/c-c++-common/gomp/for-7.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/for-7.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(nonmonotonic:runtime) + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_nonmonotonic_runtime_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_nonmonotonic_runtime_next" 1 "ompexp" } } */ --- gcc/testsuite/c-c++-common/gomp/if-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/c-c++-common/gomp/if-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -14,6 +14,12 @@ foo (int a, int b, int *p, int *q) #pragma omp parallel for simd if (parallel : a) for (i = 0; i < 16; i++) ; + #pragma omp parallel for simd if (simd : a) + for (i = 0; i < 16; i++) + ; + #pragma omp parallel for simd if (simd : a) if (parallel:b) + for (i = 0; i < 16; i++) + ; #pragma omp task if (a) ; #pragma omp task if (task: a) @@ -24,16 +30,37 @@ foo (int a, int b, int *p, int *q) #pragma omp taskloop if (taskloop : a) for (i = 0; i < 16; i++) ; + #pragma omp taskloop simd if (a) + for (i = 0; i < 16; i++) + ; + #pragma omp taskloop simd if (taskloop : a) + for (i = 0; i < 16; i++) + ; + #pragma omp taskloop simd if (simd : a) + for (i = 0; i < 16; i++) + ; + #pragma omp taskloop simd if (taskloop:b) if (simd : a) + for (i = 0; i < 16; i++) + ; #pragma omp target if (a) ; #pragma omp target if (target: a) ; + #pragma omp target simd if (a) + for (i = 0; i < 16; i++) + ; + #pragma omp target simd if (simd : a) if (target: b) + for (i = 0; i < 16; i++) + ; #pragma omp target teams distribute parallel for simd if (a) for (i = 0; i < 16; i++) ; #pragma omp target teams distribute parallel for simd if (parallel : a) if (target: b) for (i = 0; i < 16; i++) ; + #pragma omp target teams distribute parallel for simd if (simd : a) if (target: b) + for (i = 0; i < 16; i++) + ; #pragma omp target data if (a) map (p[0:2]) ; #pragma omp target data if (target data: a) map (p[0:2]) @@ -44,4 +71,47 @@ foo (int a, int b, int *p, int *q) #pragma omp target exit data if (target exit data: a) map (from: p[0:2]) #pragma omp target update if (a) to (q[0:3]) #pragma omp target update if (target update:a) to (q[0:3]) + #pragma omp parallel + { + #pragma omp cancel parallel if (a) + } + #pragma omp parallel + { + #pragma omp cancel parallel if (cancel:a) + } + #pragma omp for + for (i = 0; i < 16; i++) + { + #pragma omp cancel for if (a) + } + #pragma omp for + for (i = 0; i < 16; i++) + { + #pragma omp cancel for if (cancel: a) + } + #pragma omp sections + { + #pragma omp section + { + #pragma omp cancel sections if (a) + } + } + #pragma omp sections + { + #pragma omp section + { + #pragma omp cancel sections if (cancel: a) + } + } + #pragma omp taskgroup + { + #pragma omp task + { + #pragma omp cancel taskgroup if (a) + } + #pragma omp task + { + #pragma omp cancel taskgroup if (cancel: a) + } + } } --- gcc/testsuite/c-c++-common/gomp/if-2.c (.../trunk) (revision 265884) +++ gcc/testsuite/c-c++-common/gomp/if-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -18,6 +18,8 @@ foo (int a, int b, int *p, int *q, int t ; #pragma omp parallel if (target update:a) /* { dg-error "expected .parallel. .if. clause modifier rather than .target update." } */ ; + #pragma omp parallel if (cancel:a) /* { dg-error "expected .parallel. .if. clause modifier rather than .cancel." } */ + ; #pragma omp parallel for simd if (target update: a) /* { dg-error "expected .parallel. .if. clause modifier rather than .target update." } */ for (i = 0; i < 16; i++) ; @@ -27,12 +29,15 @@ foo (int a, int b, int *p, int *q, int t ; #pragma omp task if (parallel: a) /* { dg-error "expected .task. .if. clause modifier rather than .parallel." } */ ; + #pragma omp simd if (cancel: a) /* { dg-error "expected .simd. .if. clause modifier rather than .cancel." } */ + for (i = 0; i < 16; i++) + ; #pragma omp taskloop if (task : a) /* { dg-error "expected .taskloop. .if. clause modifier rather than .task." } */ for (i = 0; i < 16; i++) ; #pragma omp target if (taskloop: a) /* { dg-error "expected .target. .if. clause modifier rather than .taskloop." } */ ; - #pragma omp target teams distribute parallel for simd if (target exit data : a) /* { dg-error "expected .parallel. or .target. .if. clause modifier" } */ + #pragma omp target teams distribute parallel for simd if (target exit data : a) /* { dg-error "expected .target. .if. clause modifier" } */ for (i = 0; i < 16; i++) ; #pragma omp target data if (target: a) map (p[0:2]) /* { dg-error "expected .target data. .if. clause modifier rather than .target." } */ @@ -40,4 +45,9 @@ foo (int a, int b, int *p, int *q, int t #pragma omp target enter data if (target data: a) map (to: p[0:2]) /* { dg-error "expected .target enter data. .if. clause modifier rather than .target data." } */ #pragma omp target exit data if (target enter data: a) map (from: p[0:2]) /* { dg-error "expected .target exit data. .if. clause modifier rather than .target enter data." } */ #pragma omp target update if (target exit data:a) to (q[0:3]) /* { dg-error "expected .target update. .if. clause modifier rather than .target exit data." } */ + #pragma omp for + for (i = 0; i < 16; i++) + { + #pragma omp cancel for if (target exit data:a) /* { dg-error "expected .cancel. .if. clause modifier" } */ + } } --- gcc/testsuite/c-c++-common/gomp/if-3.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/if-3.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O2" } */ + +#define N 1024 + +void +foo (int *x, int *y, int *z, int a) +{ + int i; + #pragma omp simd if (simd: a > 2) aligned (x, y, z : 16) + for (i = 0; i < N; i++) + x[i] = y[i] + z[i]; +} --- gcc/testsuite/c-c++-common/gomp/master-combined-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/master-combined-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,32 @@ +void bar (int *); + +void +foo (int *a) +{ + int i, j, k, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0; + #pragma omp parallel master default(none) private (k) + bar (&k); + #pragma omp parallel default(none) firstprivate(a) shared(x, y, z) + { + #pragma omp master taskloop reduction (+:x) default(none) firstprivate(a) + for (i = 0; i < 64; i++) + x += a[i]; + #pragma omp master taskloop simd reduction (+:y) default(none) firstprivate(a) private (i) + for (i = 0; i < 64; i++) + y += a[i]; + #pragma omp master taskloop simd collapse(2) reduction (+:z) default(none) firstprivate(a) private (i, j) + for (j = 0; j < 1; j++) + for (i = 0; i < 64; ++i) + z += a[i]; + } + #pragma omp parallel master taskloop reduction (+:u) default(none) firstprivate(a) + for (i = 0; i < 64; i++) + u += a[i]; + #pragma omp parallel master taskloop simd reduction (+:v) default(none) firstprivate(a) + for (i = 0; i < 64; i++) + v += a[i]; + #pragma omp parallel master taskloop simd collapse(2) reduction (+:w) default(none) firstprivate(a) + for (j = 0; j < 1; j++) + for (i = 0; i < 64; ++i) + w += a[i]; +} --- gcc/testsuite/c-c++-common/gomp/master-combined-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/master-combined-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,13 @@ +void +foo (int *a) +{ + int i, r = 0, s = 0; + #pragma omp taskgroup task_reduction(+:r) + #pragma omp parallel master taskloop in_reduction(+:r) /* { dg-error "'in_reduction' is not valid for '#pragma omp parallel master taskloop'" } */ + for (i = 0; i < 64; i++) + r += a[i]; + #pragma omp taskgroup task_reduction(+:s) + #pragma omp parallel master taskloop simd in_reduction(+:s) /* { dg-error "'in_reduction' is not valid for '#pragma omp parallel master taskloop simd'" } */ + for (i = 0; i < 64; i++) + s += a[i]; +} --- gcc/testsuite/c-c++-common/gomp/nontemporal-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/nontemporal-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O2" } */ + +#define N 1024 +int a[N], b[N], c[N], d[N]; + +void +foo (void) +{ + int i; + #pragma omp simd nontemporal (a, b) + for (i = 0; i < N; ++i) + a[i] = b[i] + c[i]; + #pragma omp simd nontemporal (d) + for (i = 0; i < N; ++i) + d[i] = 2 * c[i]; +} --- gcc/testsuite/c-c++-common/gomp/nontemporal-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/nontemporal-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +#define N 1024 +extern int a[N], b[N], c[N], d[N]; + +void +foo (void) +{ + int i; + #pragma omp simd nontemporal (a, b) aligned (a, b, c) + for (i = 0; i < N; ++i) + a[i] = b[i] + c[i]; + #pragma omp simd nontemporal (d) nontemporal (d) /* { dg-error "'d' appears more than once in 'nontemporal' clauses" } */ + for (i = 0; i < N; ++i) + d[i] = 2 * c[i]; + #pragma omp simd nontemporal (a, b, b) /* { dg-error "'b' appears more than once in 'nontemporal' clauses" } */ + for (i = 0; i < N; ++i) + a[i] += b[i] + c[i]; +} --- gcc/testsuite/c-c++-common/gomp/reduction-task-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/reduction-task-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,86 @@ +int v; +extern void foo (int); + +void +bar (void) +{ + int i; + #pragma omp for reduction (task, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp sections reduction (task, +: v) + { + foo (-2); + #pragma omp section + foo (-3); + } + #pragma omp parallel reduction (task, +: v) + foo (-1); + #pragma omp parallel for reduction (task, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp parallel sections reduction (task, +: v) + { + foo (-2); + #pragma omp section + foo (-3); + } + #pragma omp teams distribute parallel for reduction (task, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp for reduction (default, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp sections reduction (default, +: v) + { + foo (-2); + #pragma omp section + foo (-3); + } + #pragma omp parallel reduction (default, +: v) + foo (-1); + #pragma omp parallel for reduction (default, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp parallel sections reduction (default, +: v) + { + foo (-2); + #pragma omp section + foo (-3); + } + #pragma omp teams distribute parallel for reduction (default, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp for reduction (default, +: v) nowait + for (i = 0; i < 64; i++) + foo (i); + #pragma omp sections nowait reduction (default, +: v) + { + foo (-2); + #pragma omp section + foo (-3); + } + #pragma omp simd reduction (default, +: v) + for (i = 0; i < 64; i++) + v++; + #pragma omp for simd reduction (default, +: v) + for (i = 0; i < 64; i++) + v++; + #pragma omp parallel for simd reduction (default, +: v) + for (i = 0; i < 64; i++) + v++; + #pragma omp teams distribute parallel for simd reduction (default, +: v) + for (i = 0; i < 64; i++) + v++; + #pragma omp taskloop reduction (default, +: v) + for (i = 0; i < 64; i++) + foo (i); + #pragma omp taskloop simd reduction (default, +: v) + for (i = 0; i < 64; i++) + v++; + #pragma omp teams reduction (default, +: v) + foo (i); + #pragma omp teams distribute reduction (default, +: v) + for (i = 0; i < 64; i++) + foo (i); +} --- gcc/testsuite/c-c++-common/gomp/reduction-task-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/reduction-task-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,40 @@ +int v; +extern void foo (int); + +void +bar (void) +{ + int i; + #pragma omp for reduction (task, +: v) nowait /* { dg-error "'task' reduction modifier on a construct with a 'nowait' clause" } */ + for (i = 0; i < 64; i++) + foo (i); + #pragma omp sections nowait reduction (task, +: v) /* { dg-error "'task' reduction modifier on a construct with a 'nowait' clause" } */ + { + foo (-2); + #pragma omp section + foo (-3); + } + #pragma omp simd reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct other than 'parallel', 'for' or 'sections'" } */ + for (i = 0; i < 64; i++) + v++; + #pragma omp for simd reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct combined with 'simd'" } */ + for (i = 0; i < 64; i++) + v++; + #pragma omp parallel for simd reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct combined with 'simd'" } */ + for (i = 0; i < 64; i++) + v++; + #pragma omp teams distribute parallel for simd reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct combined with 'simd'" } */ + for (i = 0; i < 64; i++) + v++; + #pragma omp taskloop reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct other than 'parallel', 'for' or 'sections'" } */ + for (i = 0; i < 64; i++) + foo (i); + #pragma omp taskloop simd reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct combined with 'simd'" } */ + for (i = 0; i < 64; i++) + v++; + #pragma omp teams reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct other than 'parallel', 'for' or 'sections'" } */ + foo (i); + #pragma omp teams distribute reduction (task, +: v) /* { dg-error "invalid 'task' reduction modifier on construct not combined with 'parallel', 'for' or 'sections'" } */ + for (i = 0; i < 64; i++) + foo (i); +} --- gcc/testsuite/c-c++-common/gomp/requires-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/requires-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,15 @@ +#pragma omp requires unified_address +#pragma omp requires unified_shared_memory +#pragma omp requires unified_shared_memory unified_address +#pragma omp requires dynamic_allocators,reverse_offload + +int i; + +void +foo () +{ + if (0) + #pragma omp requires unified_shared_memory unified_address + i++; + #pragma omp requries atomic_default_mem_order(seq_cst) +} --- gcc/testsuite/c-c++-common/gomp/requires-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/requires-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,18 @@ +#pragma omp requires /* { dg-error "requires at least one clause" } */ +#pragma omp requires unified_shared_memory,unified_shared_memory /* { dg-error "too many 'unified_shared_memory' clauses" } */ +#pragma omp requires unified_address unified_address /* { dg-error "too many 'unified_address' clauses" } */ +#pragma omp requires reverse_offload reverse_offload /* { dg-error "too many 'reverse_offload' clauses" } */ +#pragma omp requires foobarbaz /* { dg-error "expected 'unified_address', 'unified_shared_memory', 'dynamic_allocators', 'reverse_offload' or 'atomic_default_mem_order' clause" } */ + +int i; + +void +foo () +{ + #pragma omp requires dynamic_allocators , dynamic_allocators /* { dg-error "too many 'dynamic_allocators' clauses" } */ + if (0) + #pragma omp requires atomic_default_mem_order(seq_cst) atomic_default_mem_order(seq_cst) /* { dg-error "too many 'atomic_default_mem_order' clauses" } */ + i++; +} + +#pragma omp requires atomic_default_mem_order (seq_cst) /* { dg-error "more than one 'atomic_default_mem_order' clause in a single compilation unit" } */ --- gcc/testsuite/c-c++-common/gomp/requires-3.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/requires-3.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,3 @@ +#pragma omp requires atomic_default_mem_order(acquire) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ +#pragma omp requires atomic_default_mem_order(release) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ +#pragma omp requires atomic_default_mem_order(foobar) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ --- gcc/testsuite/c-c++-common/gomp/requires-4.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/requires-4.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,11 @@ +#pragma omp requires unified_shared_memory,unified_address,reverse_offload +void +foo (void) +{ + #pragma omp target + ; + #pragma omp requires unified_shared_memory /* { dg-error "'unified_shared_memory' clause used lexically after first target construct or offloading API" } */ +} + +#pragma omp requires unified_address /* { dg-error "'unified_address' clause used lexically after first target construct or offloading API" } */ +#pragma omp requires reverse_offload /* { dg-error "'reverse_offload' clause used lexically after first target construct or offloading API" } */ --- gcc/testsuite/c-c++-common/gomp/schedule-modifiers-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/c-c++-common/gomp/schedule-modifiers-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -68,18 +68,26 @@ void bar (void) { int i; - #pragma omp for schedule (nonmonotonic: static, 2) /* { dg-error ".nonmonotonic. modifier specified for .static. schedule kind" } */ + #pragma omp for schedule (nonmonotonic: static, 2) for (i = 0; i < 64; i++) ; - #pragma omp for schedule (nonmonotonic : static) /* { dg-error ".nonmonotonic. modifier specified for .static. schedule kind" } */ + #pragma omp for schedule (nonmonotonic : static) for (i = 0; i < 64; i++) ; - #pragma omp for schedule (nonmonotonic : runtime) /* { dg-error ".nonmonotonic. modifier specified for .runtime. schedule kind" } */ + #pragma omp for schedule (nonmonotonic : runtime) for (i = 0; i < 64; i++) ; - #pragma omp for schedule (nonmonotonic : auto) /* { dg-error ".nonmonotonic. modifier specified for .auto. schedule kind" } */ + #pragma omp for schedule (nonmonotonic : auto) for (i = 0; i < 64; i++) ; + #pragma omp for schedule (nonmonotonic : static) ordered /* { dg-error ".nonmonotonic. schedule modifier specified together with .ordered. clause" } */ + for (i = 0; i < 64; i++) + #pragma omp ordered + ; + #pragma omp for ordered schedule (nonmonotonic: static, 4) /* { dg-error ".nonmonotonic. schedule modifier specified together with .ordered. clause" } */ + for (i = 0; i < 64; i++) + #pragma omp ordered + ; #pragma omp for schedule (nonmonotonic : dynamic) ordered /* { dg-error ".nonmonotonic. schedule modifier specified together with .ordered. clause" } */ for (i = 0; i < 64; i++) #pragma omp ordered @@ -98,6 +106,12 @@ bar (void) for (i = 0; i < 64; i++) { #pragma omp ordered depend(source) + #pragma omp ordered depend(sink: i - 1) + } + #pragma omp for schedule(nonmonotonic : runtime) ordered(1) /* { dg-error ".nonmonotonic. schedule modifier specified together with .ordered. clause" } */ + for (i = 0; i < 64; i++) + { + #pragma omp ordered depend(source) #pragma omp ordered depend(sink: i - 1) } #pragma omp for schedule (nonmonotonic , monotonic : dynamic) /* { dg-error "both .monotonic. and .nonmonotonic. modifiers specified" } */ --- gcc/testsuite/c-c++-common/gomp/simd7.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/simd7.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,21 @@ +int a[64]; + +#pragma omp declare simd linear(x) +int +bar (int x, int y) +{ + int v; + #pragma omp atomic capture + v = a[x] += y; + return v; +} + +void +foo (void) +{ + int i; + #pragma omp simd + for (i = 0; i < 64; i++) + #pragma omp atomic + a[i] += 1; +} --- gcc/testsuite/c-c++-common/gomp/target-data-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/target-data-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +void +foo (void) +{ + int a[4] = { 1, 2, 3, 4 }; + #pragma omp target data map(to:a) + #pragma omp target data use_device_ptr(a) + #pragma omp target is_device_ptr(a) + { + a[0]++; + } + #pragma omp target data /* { dg-error "must contain at least one" } */ + a[0]++; + #pragma omp target data map(to:a) + #pragma omp target data use_device_ptr(a) use_device_ptr(a) /* { dg-error "appears more than once in data clauses" } */ + a[0]++; +} --- gcc/testsuite/c-c++-common/gomp/taskloop-reduction-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/taskloop-reduction-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,10 @@ +int +foo (int *a) +{ + int x = 0; + #pragma omp taskloop reduction (+:x) nogroup /* { dg-error "'nogroup' clause must not be used together with 'reduction' clause" } */ + for (int i = 0; i < 64; i++) + x += a[i]; + #pragma omp taskwait + return x; +} --- gcc/testsuite/c-c++-common/gomp/taskwait-depend-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/taskwait-depend-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,11 @@ +void +foo (int *p) +{ + #pragma omp taskwait depend(iterator(i = 0:16) , in : p[i]) depend(out : p[32]) +} + +void +bar (int *p) +{ + #pragma omp taskwait depend(mutexinoutset : p[0]) /* { dg-error "'mutexinoutset' kind in 'depend' clause on a 'taskwait' construct" } */ +} --- gcc/testsuite/c-c++-common/gomp/teams-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/teams-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,64 @@ +#ifdef __cplusplus +extern "C" { +#endif + +int omp_get_num_teams (void); +int omp_get_team_num (void); + +#ifdef __cplusplus +} +#endif + +void bar (int *, int *, int *, int, int, int, int); + +void +foo (void) +{ + int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6; + #pragma omp teams num_teams (4) shared (b) firstprivate (c, d) private (e, f) + { + f = 7; + bar (&a, &c, &e, b, d, f, 0); + } + bar (&a, (int *) 0, (int *) 0, b, 0, 0, 1); +} + +void +baz (void) +{ + #pragma omp teams + { + #pragma omp distribute + for (int i = 0; i < 64; i++) + ; + #pragma omp distribute simd + for (int i = 0; i < 64; i++) + ; + #pragma omp distribute parallel for + for (int i = 0; i < 64; i++) + ; + #pragma omp distribute parallel for + for (int i = 0; i < 64; i++) + ; + #pragma omp distribute parallel for simd + for (int i = 0; i < 64; i++) + ; + #pragma omp parallel + ; + #pragma omp parallel for + for (int i = 0; i < 64; i++) + ; + #pragma omp parallel for simd + for (int i = 0; i < 64; i++) + ; + int a, b; + #pragma omp parallel sections + { + a = 5; + #pragma omp section + b = 6; + } + int c = omp_get_num_teams (); + int d = omp_get_team_num (); + } +} --- gcc/testsuite/c-c++-common/gomp/teams-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/c-c++-common/gomp/teams-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,119 @@ +void +foo (void) +{ + int i; + + #pragma omp parallel + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + #pragma omp teams + { + #pragma omp teams /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + } + #pragma omp target + { + #pragma omp parallel + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + } + #pragma omp for + for (i = 0; i < 4; i++) + if (i == 0) + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + #pragma omp single + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + #pragma omp master + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + #pragma omp critical + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + #pragma omp sections + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + #pragma omp section + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + } + #pragma omp target data map (to: i) + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + #pragma omp task + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } + #pragma omp taskgroup + { + #pragma omp teams /* { dg-error "'teams' construct must be closely nested inside of 'target' construct or not nested in any OpenMP construct" } */ + ; + } +} + +void +bar (void) +{ + #pragma omp teams + { + int x, y, v = 4; + #pragma omp target /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp target data map (to: v) /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp for /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + for (int i = 0; i < 64; ++i) + ; + #pragma omp simd /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + for (int i = 0; i < 64; ++i) + ; + #pragma omp for simd /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + for (int i = 0; i < 64; ++i) + ; + #pragma omp single /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp master /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp sections /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + { + x = 1; + #pragma omp section + y = 2; + } + #pragma omp critical /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp target enter data map (to: v) /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + #pragma omp target exit data map (from: v) /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + #pragma omp cancel parallel /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + #pragma omp cancellation point parallel /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + #pragma omp barrier /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + #pragma omp ordered /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp task /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp taskloop /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + for (int i = 0; i < 64; ++i) + ; + #pragma omp atomic /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + v++; + #pragma omp taskgroup /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + ; + #pragma omp taskwait /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + #pragma omp taskyield /* { dg-error "only 'distribute' or 'parallel' regions are allowed to be strictly nested inside 'teams' region" } */ + } +} --- gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -10,14 +10,15 @@ a24 (int a) const int c = 1; int i = 0; int l = 0; -#pragma omp parallel default(none) private(a) shared(z) /* { dg-line omp_parallel } */ +#pragma omp parallel default(none) private(a) shared(z, c) /* { dg-line omp_parallel } */ { 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 */ + /* O.K. - j is declared within parallel region */ + a = z[j]; /* 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 */ + /* - c has const-qualified type and + is listed in shared clause */ z[i] = y; /* { dg-error "'i' not specified" "" { target *-*-* } .-1 } */ /* { dg-error "enclosing 'parallel'" "" { target *-*-* } omp_parallel } */ --- gcc/testsuite/gcc.dg/gomp/atomic-5.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/atomic-5.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -27,7 +27,7 @@ void f1(void) #pragma omp atomic bar() += 1; /* { dg-error "lvalue required" } */ #pragma omp atomic a /* { dg-error "expected end of line" } */ - x++; + x++; /* { dg-error "expected 'read', 'write', 'update', 'capture', 'seq_cst', 'acq_rel', 'release', 'relaxed' or 'hint' clause" "" { target *-*-* } .-1 } */ #pragma omp atomic ; /* { dg-error "expected expression" } */ #pragma omp atomic --- gcc/testsuite/gcc.dg/gomp/clause-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/clause-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -86,18 +86,18 @@ foo (int x) #pragma omp p for linear (t) /* { dg-error "predetermined 'threadprivate" } */ for (i = 0; i < 10; i++) ; -#pragma omp p shared (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p shared (c) ; -#pragma omp p private (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p private (c) /* { dg-error "'const' qualified 'c' may appear only in 'shared' or 'firstprivate' clauses" } */ ; #pragma omp p firstprivate (c) ; -#pragma omp p for lastprivate (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p for lastprivate (c) /* { dg-error "'const' qualified 'c' may appear only in 'shared' or 'firstprivate' clauses" } */ for (i = 0; i < 10; i++) ; -#pragma omp p reduction (*:c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p reduction (*:c) /* { dg-error "'const' qualified 'c' may appear only in 'shared' or 'firstprivate' clauses" } */ ; -#pragma omp p for linear (c) /* { dg-error "predetermined 'shared'" } */ +#pragma omp p for linear (c) /* { dg-error "'const' qualified 'c' may appear only in 'shared' or 'firstprivate' clauses" } */ for (i = 0; i < 10; i++) ; } --- gcc/testsuite/gcc.dg/gomp/combined-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/combined-1.c (.../branches/gomp-5_0-branch) (nonexistent) @@ -1,23 +0,0 @@ -/* { 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" 3 "optimized" } } */ --- gcc/testsuite/gcc.dg/gomp/for-4.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/for-4.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,5 +12,5 @@ void foo (int n) 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 { scan-tree-dump-times "GOMP_loop_nonmonotonic_dynamic_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_nonmonotonic_dynamic_next" 1 "ompexp" } } */ --- gcc/testsuite/gcc.dg/gomp/for-5.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/for-5.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,5 +12,5 @@ void foo (int n) 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 { scan-tree-dump-times "GOMP_loop_nonmonotonic_guided_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_nonmonotonic_guided_next" 1 "ompexp" } } */ --- gcc/testsuite/gcc.dg/gomp/for-6.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/for-6.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,5 +12,5 @@ void foo (int n) 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 { scan-tree-dump-times "GOMP_loop_maybe_nonmonotonic_runtime_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_maybe_nonmonotonic_runtime_next" 1 "ompexp" } } */ --- gcc/testsuite/gcc.dg/gomp/pr39495-2.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/pr39495-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -13,25 +13,25 @@ foo (void) unsigned int u; #pragma omp for - for (i = INT_MIN + 6; i != INT_MIN; i--) /* { dg-error "invalid controlling predicate" } */ + for (i = INT_MIN + 6; i != INT_MIN; i--) ; #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" } */ + for (i = INT_MAX - 6; i != INT_MAX; i++) ; #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" } */ + for (u = 6; u != 0; u--) ; #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" } */ + for (u = UINT_MAX - 6; u != UINT_MAX; u++) ; #pragma omp for for (u = UINT_MAX - 6; u == UINT_MAX; u++) /* { dg-error "invalid controlling predicate" } */ --- gcc/testsuite/gcc.dg/gomp/reduction-2.c (.../trunk) (nonexistent) +++ gcc/testsuite/gcc.dg/gomp/reduction-2.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct S {}; +void foo (void *, void *); +void bar (void *, void *); +void baz (void *); +#pragma omp declare reduction(+:struct S:foo (&omp_out, &omp_in))initializer(bar(&omp_priv, &omp_orig)) + +void +test1 (void) +{ + struct S s; + int i; + #pragma omp parallel reduction(+:s) + baz (&s); + #pragma omp parallel reduction(task, +:s) /* { dg-error "zero sized type 'struct S' in 'reduction' clause" } */ + baz (&s); + #pragma omp taskloop reduction(+:s) /* { dg-error "zero sized type 'struct S' in 'reduction' clause" } */ + for (i = 0; i < 1; i++) + baz (&s); + #pragma omp taskloop simd reduction(+:s) /* { dg-error "zero sized type 'struct S' in 'reduction' clause" } */ + for (i = 0; i < 1; i++) + baz (&s); + #pragma omp taskgroup task_reduction(+:s) /* { dg-error "zero sized type 'struct S' in 'task_reduction' clause" } */ + { + #pragma omp task in_reduction(+:s) /* { dg-error "zero sized type 'struct S' in 'in_reduction' clause" } */ + baz (&s); + } +} --- gcc/testsuite/gcc.dg/gomp/sharing-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/sharing-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -44,7 +44,7 @@ main (void) thrglobalvar++; /* Predetermined - threadprivate. */ thrlocvar++; /* Predetermined - threadprivate. */ foo (i); /* Predetermined - private (omp for loop variable). */ - foo (constvar); /* Predetermined - shared (const qualified type). */ + foo (constvar); /* { dg-error "not specified in" } */ foo (*p); /* *p predetermined - shared (heap allocated */ (*p)++; /* storage). */ bar (p); /* Explicitly determined - private. */ --- gcc/testsuite/gcc.dg/gomp/simd-1.c (.../trunk) (nonexistent) +++ gcc/testsuite/gcc.dg/gomp/simd-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,21 @@ +int a[32], b[32]; + +void +foo (void) +{ + int i, j; + #pragma omp simd linear(i, j) collapse(2) /* { dg-error "iteration variable 'i' should not be linear" } */ + for (i = 0; i < 32; ++i) /* { dg-error "iteration variable 'j' should not be linear" "" { target *-*-* } .-1 } */ + for (j = 0; j < 32; ++j) + a[i] += b[j]; +} + +void +bar (void) +{ + static int i, j; + #pragma omp for simd linear(i, j) collapse(2) /* { dg-error "iteration variable 'i' should not be linear" } */ + for (i = 0; i < 32; ++i) /* { dg-error "iteration variable 'j' should not be linear" "" { target *-*-* } .-1 } */ + for (j = 0; j < 32; ++j) + a[i] += b[j]; +} --- gcc/testsuite/gcc.dg/gomp/teams-1.c (.../trunk) (revision 265884) +++ gcc/testsuite/gcc.dg/gomp/teams-1.c (.../branches/gomp-5_0-branch) (revision 265887) @@ -23,8 +23,8 @@ foo (int x) switch (x) // { dg-error "invalid entry to OpenMP structured block" } { - #pragma omp target teams - { case 0:; } // { dg-warning "statement will never be executed" } + #pragma omp target teams // { dg-warning "statement will never be executed" } + { case 0:; } } } --- gcc/testsuite/g++.dg/gomp/atomic-18.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/atomic-18.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,50 @@ +// { dg-do compile } +// { dg-additional-options "-fdump-tree-original" } +// { dg-final { scan-tree-dump-times "omp atomic release" 5 "original" } } +// { dg-final { scan-tree-dump-times "omp atomic seq_cst" 1 "original" } } +// { dg-final { scan-tree-dump-times "omp atomic relaxed" 2 "original" } } +// { dg-final { scan-tree-dump-times "omp atomic capture acq_rel" 3 "original" } } +// { dg-final { scan-tree-dump-times "omp atomic capture acquire" 1 "original" } } +// { dg-final { scan-tree-dump-times "omp atomic read acquire" 1 "original" } } + +int i, v; +float f; + +template <int N, int M, typename T> +void +foo (T *p) +{ + #pragma omp atomic release, hint (N), update + i = i + 1; + #pragma omp atomic hint(0)seq_cst + i = i + 1; + #pragma omp atomic relaxed,update,hint (N) + i = i + 1; + #pragma omp atomic release + i = i + 1; + #pragma omp atomic relaxed + i = i + 1; + #pragma omp atomic acq_rel capture + v = i = i + 1; + #pragma omp atomic capture,acq_rel , hint (M) + v = i = i + 1; + #pragma omp atomic hint(N),acquire capture + v = i = i + 1; + #pragma omp atomic read acquire + v = i; + #pragma omp atomic release,write + i = v; + #pragma omp atomic hint(1),update,release + f = f + 2.0; + #pragma omp requires atomic_default_mem_order (acq_rel) + #pragma omp atomic hint (M - 1) update + *p += 1; + #pragma omp atomic capture, hint (M) + v = *p = *p + 1; +} + +void +bar () +{ + foo <0, 1, int> (&i); +} --- gcc/testsuite/g++.dg/gomp/atomic-19.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/atomic-19.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,17 @@ +int i; + +template <int N, typename T> +void +foo (T x) +{ + #pragma omp atomic hint (x) // { dg-error "must be integral" } + i = i + 1; + #pragma omp atomic hint (N + i) // { dg-error "constant integer expression" } + i = i + 1; +} + +void +bar () +{ + foo <0, float> (1.0f); +} --- gcc/testsuite/g++.dg/gomp/atomic-5.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/atomic-5.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,18 +12,18 @@ void f1(void) x = x + 1; #pragma omp atomic x = 1; /* { dg-error "invalid form" } */ - #pragma omp atomic + #pragma omp atomic /* { dg-error "read-only variable" } */ ++y; /* { dg-error "read-only variable" } */ - #pragma omp atomic + #pragma omp atomic /* { dg-error "read-only variable" } */ y--; /* { dg-error "read-only variable" } */ - #pragma omp atomic - y += 1; /* { dg-error "read-only variable" } */ + #pragma omp atomic /* { dg-error "read-only variable" } */ + y += 1; #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++; + x++; /* { dg-error "expected 'read', 'write', 'update', 'capture', 'seq_cst', 'acq_rel', 'release', 'relaxed' or 'hint' clause" "" { target *-*-* } .-1 } */ #pragma omp atomic ; /* { dg-error "expected primary-expression" } */ #pragma omp atomic --- gcc/testsuite/g++.dg/gomp/clause-3.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/clause-3.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -86,18 +86,18 @@ foo (int x) #pragma omp p for linear (t) // { dg-error "predetermined 'threadprivate'" } for (i = 0; i < 10; i++) ; -#pragma omp p shared (c) // { dg-error "predetermined 'shared'" } +#pragma omp p shared (c) ; -#pragma omp p private (c) // { dg-error "predetermined 'shared'" } +#pragma omp p private (c) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } ; #pragma omp p firstprivate (c) ; -#pragma omp p for lastprivate (c) // { dg-error "predetermined 'shared'" } +#pragma omp p for lastprivate (c) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } for (i = 0; i < 10; i++) ; -#pragma omp p reduction (*:c) // { dg-error "predetermined 'shared'" } +#pragma omp p reduction (*:c) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } ; -#pragma omp p for linear (c:2) // { dg-error "predetermined 'shared'" } +#pragma omp p for linear (c:2) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } for (i = 0; i < 10; i++) ; } --- gcc/testsuite/g++.dg/gomp/critical-3.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/critical-3.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,33 @@ +int i; + +template <int N> +void +foo (void) +{ + #pragma omp critical (foo), hint (N + 1) + i++; +} + +template <int N> +void +bar (void) +{ + #pragma omp critical (bar), hint (N + i) // { dg-error "constant integer expression" } + i++; +} + +template <typename T> +void +baz (T x) +{ + #pragma omp critical (baz) hint (x) // { dg-error "expression must be integral" } + i++; +} + +void +test () +{ + foo <0> (); + bar <0> (); + baz (0.0); +} --- gcc/testsuite/g++.dg/gomp/depend-iterator-1.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/depend-iterator-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,86 @@ +int arr[64], arr2[64]; +struct S { int a[4]; } k; +short arr4[4]; +volatile int v; +#define TEST_EQ(x,y) ({ int o[x == y ? 1 : -1]; 0; }) + +template <typename T, typename U, typename V, typename W, int N> +void +foo (unsigned char i, signed char j) +{ + #pragma omp task depend (iterator (T j=6:N:-2) , out : \ + arr[TEST_EQ (sizeof (j), sizeof (int)), \ + TEST_EQ (sizeof (i), sizeof (unsigned char)), \ + TEST_EQ (sizeof (k), sizeof (struct S)), j], \ + arr2[TEST_EQ (((__typeof (j)) -1) < 0, 1), \ + TEST_EQ (((__typeof (i)) -1) < 0, 0), \ + TEST_EQ (((__typeof (k.a[0])) -1) < 0, 1), j]) \ + depend(out: arr[0]) \ + depend (iterator (U i=__LONG_LONG_MAX__ - 4:__LONG_LONG_MAX__ - N:N, \ + V j=~0U-16:~0U-8:3, \ + W *k=&arr4[1]:&arr4[2]:1) , in : \ + arr[TEST_EQ (sizeof (i), sizeof (long long)), \ + TEST_EQ (sizeof (j), sizeof (unsigned short)), \ + TEST_EQ (sizeof (k), sizeof (short *)), \ + TEST_EQ (sizeof (*k), sizeof (short)), i - __LONG_LONG_MAX__ + 4], \ + arr2[TEST_EQ (((__typeof (i)) -1) < 0, 1), \ + TEST_EQ (((__typeof (j)) -1) < 0, 0), \ + TEST_EQ (((__typeof (*k)) -1) < 0, 1), j - (~0U-16)], \ + arr2[k - &arr4[0]]) \ + depend(in : k) + v++; +} + +template <typename U, typename W, int N> +void +bar (unsigned char i, signed char j) +{ + int m = j; + int n = j + 2; + #pragma omp task depend (iterator (j=N:2:m) , out : \ + arr[TEST_EQ (sizeof (j), sizeof (int)), \ + TEST_EQ (sizeof (i), sizeof (unsigned char)), \ + TEST_EQ (sizeof (k), sizeof (struct S)), j], \ + arr2[TEST_EQ (((__typeof (j)) -1) < 0, 1), \ + TEST_EQ (((__typeof (i)) -1) < 0, 0), \ + TEST_EQ (((__typeof (k.a[0])) -1) < 0, 1), j]) \ + depend(out: arr[0]) \ + depend (iterator (U i=__LONG_LONG_MAX__ - 4 - n:__LONG_LONG_MAX__ - 2:2, \ + unsigned short j=~0U-16:~0U-8-n:3, \ + W k=&arr4[N-5]:&arr4[n + 2]:1) , in : \ + arr[TEST_EQ (sizeof (i), sizeof (long long)), \ + TEST_EQ (sizeof (j), sizeof (unsigned short)), \ + TEST_EQ (sizeof (k), sizeof (short *)), \ + TEST_EQ (sizeof (*k), sizeof (short)), i - __LONG_LONG_MAX__ + 4], \ + arr2[TEST_EQ (((__typeof (i)) -1) < 0, 1), \ + TEST_EQ (((__typeof (j)) -1) < 0, 0), \ + TEST_EQ (((__typeof (*k)) -1) < 0, 1), j - (~0U-16)], \ + arr2[k - &arr4[0]:10]) \ + depend(in : k) + v++; +} + +template <typename T, typename U, int N> +void +baz (void) +{ + #pragma omp parallel + #pragma omp master + { + #pragma omp task depend(iterator(T k = N : 2) , inout : \ + arr[TEST_EQ (sizeof (k), sizeof (unsigned long)), \ + TEST_EQ (((__typeof (k)) -1) < N, 0), k]) \ + depend(iterator(U s = -3 : -12 : -1 + N) , out : \ + arr[TEST_EQ (sizeof (s), sizeof (signed char)), \ + TEST_EQ (((__typeof (s)) -1) < 0, 1), s + 12]) + v++; + } +} + +void +test (void) +{ + foo <int, long long, unsigned short, short, 2> (0, 0); + bar <long long, short *, 6> (0, -2); + baz <unsigned long int, signed char, 0> (); +} --- gcc/testsuite/g++.dg/gomp/depend-iterator-2.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/depend-iterator-2.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,121 @@ +int a, b[64]; +struct S { int c; } *d, *e; +struct T; +struct T *f, *g; +int *h; + +template <typename U, typename V, typename W, W N> +void +f1 () +{ + #pragma omp task depend (iterator , in : a) // { dg-error "expected" } + ; + #pragma omp task depend (iterator (for = 0 : 2) , in : a) // { dg-error "expected" } + ; + #pragma omp task depend (iterator (5 = 0 : 2) , in : a) // { dg-error "expected" } + ; + #pragma omp task depend (iterator (i : N : 2) , in : a) // { dg-error "expected '='|name a type|expected" } + ; + #pragma omp task depend (iterator (i = 0, 1 : 2) , in : a) // { dg-error "expected" } + ; + #pragma omp task depend (iterator (i = (0, 1) : 2) , in : a) + ; + #pragma omp task depend (iterator (i = 0 : 1 : 2 : 3) , in : a) // { dg-error "expected '.'" } + ; + #pragma omp task depend (iterator (i = 0 : 2, 3) , in : a) // { dg-error "expected" } + ; + #pragma omp task depend (iterator (i = N : 10 : 2, 3) , in : a) // { dg-error "expected" } + ; + #pragma omp task depend (iterator (i = 0:1), iterator (j = 0:1) , in : a) // { dg-error "invalid depend kind" } + ; + #pragma omp task depend (iterator (i = N:32) , in : b[i*2:2]) + ; + #pragma omp task depend (iterator (void i = 0:1) , in : a) // { dg-error "iterator 'i' has neither integral nor pointer type" } + ; + #pragma omp task depend (iterator (U *p = d:e:2) , in : a) + ; + #pragma omp task depend (iterator (W i = N:4, \ + struct U2 { W *p; } *p = 0:2) , in : a) // { dg-error "types may not be defined in iterator type" } + ; + #pragma omp task depend (iterator (i = 0:4, j = i:16) , in : a) // { dg-error "begin expression refers to outer iterator 'i'" } + ; + #pragma omp task depend (iterator (i = N:4, j = 2:i:1) , in : a) // { dg-error "end expression refers to outer iterator 'i'" } + ; + #pragma omp task depend (iterator (i = 0:4, j = 2:8:i) , in : a) // { dg-error "step expression refers to outer iterator 'i'" } + ; + #pragma omp task depend (iterator (i = 1.25:2.5:3) , in : a) + ; + #pragma omp task depend (iterator (i = 1:2:3.5) , in : a) // { dg-error "iterator step with non-integral type" } + ; + #pragma omp task depend (iterator (W *p = 23 : h) , in : a) + ; + #pragma omp task depend (iterator (const int i = N : 2) , in : a) // { dg-error "const qualified" } + ; + #pragma omp task depend (iterator (const long long unsigned i = 0 : 2) , in : a) // { dg-error "const qualified" } + ; +} + +template <typename W, int N> +void +f2 () +{ + int i, j; + #pragma omp for ordered(2) + for (i = 0; i < 64; i++) + for (j = 0; j < 64; j++) + { + #pragma omp ordered depend (iterator (k=0:N) , sink: i - 1, j - 1) // { dg-error "'iterator' modifier incompatible with 'sink'" } + #pragma omp ordered depend (iterator (W l = 0:2:3) , source) // { dg-error "'iterator' modifier incompatible with 'source'" } + } +} + +template <typename U, typename V, typename W, W N, typename X, typename Y> +void +f3 () +{ + #pragma omp task depend (iterator (U i = 0:1), in : a) // { dg-error "iterator 'i' has neither integral nor pointer type" } + ; + #pragma omp task depend (iterator (V f = 0.2:0.4) , in : a) // { dg-error "iterator 'f' has neither integral nor pointer type" } + ; + #pragma omp task depend (iterator (struct T *p = f:g) , in : a) // { dg-error "invalid use of" } + ; + #pragma omp task depend (iterator (i = *d:2) , in : a) // { dg-error "invalid cast from type 'S' to type 'int'" } + ; + #pragma omp task depend (iterator (i = 2:*d:2) , in : a) // { dg-error "invalid cast from type 'S' to type 'int'" } + ; + #pragma omp task depend (iterator (i = 2:4:*d) , in : a) // { dg-error "iterator step with non-integral type" } + ; + #pragma omp task depend (iterator (i = 1.25:2.5:3) , in : a) + ; + #pragma omp task depend (iterator (i = 1:2:3.5) , in : a) // { dg-error "iterator step with non-integral type" } + ; + #pragma omp task depend (iterator (W *p = 23 : h) , in : a) + ; + #pragma omp task depend (iterator (short i=1:3:N) , in : a) // { dg-error "iterator 'i' has zero step" } + ; + #pragma omp task depend (iterator (i = 1 : 3 : N + 3 - 3) , in : a) // { dg-error "iterator 'i' has zero step" } + ; + #pragma omp task depend (iterator (int *p = &b[6]:&b[9]:4 - 4) , in : a) // { dg-error "iterator 'p' has zero step" } + ; + #pragma omp task depend (iterator (X i = N : 2) , in : a) // { dg-error "const qualified" } + ; + #pragma omp task depend (iterator (Y i = 0 : 2) , in : a) // { dg-error "const qualified" } + ; +} + +template <int N> +void +f4 () +{ + #pragma omp task depend (iterator (i = 0:1), iterator (j = 0:1) , in : a) // { dg-error "invalid depend kind" } + ; +} + +void +f5 () +{ + f1 <struct S, float, int, 0> (); + f2 <int, 1> (); + f3 <struct S, float, int, 0, const int, const long long unsigned> (); + f4 <0> (); +} --- gcc/testsuite/g++.dg/gomp/depobj-1.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/depobj-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,118 @@ +typedef struct __attribute__((__aligned__ (sizeof (void *)))) omp_depend_t { + char __omp_depend_t__[2 * sizeof (void *)]; +} omp_depend_t; + +omp_depend_t bar (void); +extern const omp_depend_t cdepobj; +extern omp_depend_t depobj, depobj4; +extern omp_depend_t depobja[4]; +extern omp_depend_t *pdepobj; +int a, b, i, j; + +template <int N> +void +f1 (bool x) +{ + #pragma omp depobj(x ? depobj : depobj4) depend(in : x ? a : b) + #pragma omp depobj(x ? depobj : depobj4) update(inout) + #pragma omp task depend (depobj:depobj) + ; + #pragma omp depobj(depobj) destroy + #pragma omp task depend (iterator (i=1:3) , depobj: *(depobja + i)) + ; + #pragma omp depobj(pdepobj[0]) depend(mutexinoutset:a) + #pragma omp depobj(*pdepobj) destroy +} + +template <typename T, typename T2> +void +f2 (T &depobj2, T2 depobj3, T *pdepobj) +{ + T depobj1; + T depobja[4]; + #pragma omp depobj(depobj1) depend(in : --a) + #pragma omp depobj(depobj1) update(inout) + #pragma omp task depend (depobj: depobj1) + ; + #pragma omp depobj(depobj1) destroy + #pragma omp depobj(depobj2) depend(in : a) + #pragma omp depobj(depobj2) update(inout) + #pragma omp task depend (depobj :depobj2) + ; + #pragma omp depobj(depobj2) destroy + #pragma omp depobj(depobj3) depend(in : a) + #pragma omp depobj(depobj3) update(inout) + #pragma omp task depend (depobj : depobj3) + ; + #pragma omp depobj(depobj3) destroy + for (int q = 1; q < 3; q++) + { + #pragma omp depobj(depobja[q]) depend (in:a) + } + #pragma omp task depend (iterator (i=1:3) , depobj : *(depobja + i)) + ; + for (int q = 1; q < 3; q++) + { + #pragma omp depobj(depobja[q]) destroy + } + #pragma omp depobj(pdepobj[0]) depend(mutexinoutset:a) + #pragma omp depobj(*pdepobj) destroy +} + +void +f3 (bool x) +{ + omp_depend_t depobjx, depobjy; + f1 <0> (x); + f2 <omp_depend_t, omp_depend_t &> (depobjx, depobjy, pdepobj); +} + +template <int N> +void +f4 (void) +{ + omp_depend_t depobjb[4]; + #pragma omp depobj // { dg-error "expected" } + #pragma omp depobj destroy // { dg-error "expected" } + #pragma omp depobj (depobj) // { dg-error "expected 'depend', 'destroy' or 'update' clause" } + #pragma omp depobj (depobj) foobar // { dg-error "expected 'depend', 'destroy' or 'update' clause" } + #pragma omp depobj(bar ()) update(inout) // { dg-error "'depobj' expression is not lvalue expression" } + #pragma omp depobj (cdepobj) update(in) // { dg-error "'const' qualified 'depobj' expression" } + #pragma omp depobj (depobjb) depend(in: a) // { dg-error "type of 'depobj' expression is not 'omp_depend_t'" } + #pragma omp depobj (pdepobj) depend(in: a) // { dg-error "type of 'depobj' expression is not 'omp_depend_t'" } + #pragma omp depobj (a) destroy // { dg-error "type of 'depobj' expression is not 'omp_depend_t'" } + #pragma omp depobj (depobj) depend(depobj:a) // { dg-error "does not have 'omp_depend_t' type in 'depend' clause with 'depobj' dependence type" } + #pragma omp depobj (depobj) depend(depobj:*depobjb) // { dg-error "'depobj' dependence type specified in 'depend' clause on 'depobj' construct" } + #pragma omp depobj (depobj) update(foobar) // { dg-error "expected 'in', 'out', 'inout' or 'mutexinoutset'" } + #pragma omp depobj (depobj) depend(in: *depobja) // { dg-error "should not have 'omp_depend_t' type in 'depend' clause with dependence type" } + #pragma omp depobj (depobj) depend(in: a) depend(in: b) // { dg-error "expected" } + #pragma omp depobj (depobj) depend(in: a) update(out) // { dg-error "expected" } + #pragma omp depobj (depobj) depend(in: a, b) // { dg-error "more than one locator in 'depend' clause on 'depobj' construct" } + #pragma omp depobj (depobj) depend(source) // { dg-error "'depend\\(source\\)' is only allowed in 'omp ordered'" } + #pragma omp depobj (depobj) depend(sink: i + 1, j - 1) // { dg-error "'depend\\(sink\\)' is only allowed in 'omp ordered'" } + #pragma omp depobj (depobj) depend(iterator (i = 0:2) , in : a) // { dg-error "'iterator' modifier may not be specified on 'depobj' construct" } + if (0) + #pragma omp depobj (depobj) destroy // { dg-error "'#pragma omp depobj' may only be used in compound statements" } + ; +} + +template <int N> +void +f5 (void) +{ + #pragma omp task depend (depobj:depobja[1:2]) // { dg-error "'depend' clause with 'depobj' dependence type on array section" } + ; + #pragma omp task depend (depobj : a) // { dg-error "'a' does not have 'omp_depend_t' type in 'depend' clause with 'depobj' dependence type" } + ; + #pragma omp task depend (in: depobj) // { dg-error "'depobj' should not have 'omp_depend_t' type in 'depend' clause with dependence type" } + ; +} + +void +f6 (omp_depend_t &x) +{ + f4 <0> (); + f5 <0> (); + #pragma omp depobj (x) depend(in: a) + #pragma omp depobj (depobj) depend(in: x) // { dg-error "should not have 'omp_depend_t' type in 'depend' clause with dependence type" } +} --- gcc/testsuite/g++.dg/gomp/doacross-1.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/doacross-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-fopenmp" } + +int a[42]; + +void +foo () +{ + #pragma omp for ordered (1) // { dg-error "'ordered' clause with parameter on range-based 'for' loop" } + for (auto x : a) + ; +} + +void +bar () +{ + #pragma omp for ordered (2) // { dg-error "'ordered' clause with parameter on range-based 'for' loop" } + for (int i = 0; i < 1; i++) + for (auto x : a) + ; +} --- gcc/testsuite/g++.dg/gomp/for-21.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/for-21.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,104 @@ +// { dg-do compile { target c++17 } } + +void +f1 (int a[10][10]) +{ + #pragma omp for collapse (2) + for (int i = 0; i < 10; ++i) + for (auto j : a[i]) // { dg-error "initializer expression refers to iteration variable 'i'" } + ; +} + +void +f2 (int (&a)[10]) +{ + #pragma omp for collapse (2) + for (auto i : a) + for (int j = i * 2; j < i * 4; j++) // { dg-error "initializer expression refers to iteration variable 'i'" } + ; +} + +struct S { int a, b, c; }; + +void +f3 (S (&a)[10]) +{ + #pragma omp for collapse (2) + for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .+1 } + for (int l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" } + ; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-1 } +} + +template <int N> +void +f4 (int a[10][10]) +{ + #pragma omp for collapse (2) + for (int i = 0; i < 10; ++i) // { dg-error "initializer expression refers to iteration variable 'i'" } + for (auto j : a[i]) + ; +} + +template <int N> +void +f5 (int (&a)[10]) +{ + #pragma omp for collapse (2) + for (auto i : a) + for (int j = i * 2; j < i * 4; j++) // { dg-error "initializer expression refers to iteration variable 'i'" } + ; +} + +template <int N> +void +f6 (S (&a)[10]) +{ + #pragma omp for collapse (2) + for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .-1 } + for (int l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" } + ; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-3 } +} + +template <typename T> +void +f7 (T a[10][10]) +{ + #pragma omp for collapse (2) + for (T i = 0; i < 10; ++i) + for (auto j : a[i]) // { dg-error "initializer expression refers to iteration variable 'i'" } + ; +} + +template <typename T> +void +f8 (T (&a)[10]) +{ + #pragma omp for collapse (2) + for (auto i : a) + for (T j = i * 2; j < i * 4; j++) // { dg-error "initializer expression refers to iteration variable 'i'" } + ; +} + +template <typename T, typename U> +void +f9 (U (&a)[10]) +{ + #pragma omp for collapse (2) + for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .-1 } + for (T l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" } + ; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-3 } +} + +void +test () +{ + int a[10][10] {}; + int b[10] {}; + S c[10] {}; + f4 <0> (a); + f5 <0> (b); + f6 <0> (c); + f7 (a); + f8 (b); + f9 <int, S> (c); +} --- gcc/testsuite/g++.dg/gomp/for-4.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/for-4.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,5 +12,5 @@ void foo (int n) 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 { scan-tree-dump-times "GOMP_loop_nonmonotonic_dynamic_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_nonmonotonic_dynamic_next" 1 "ompexp" } } */ --- gcc/testsuite/g++.dg/gomp/for-5.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/for-5.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,5 +12,5 @@ void foo (int n) 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 { scan-tree-dump-times "GOMP_loop_nonmonotonic_guided_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_nonmonotonic_guided_next" 1 "ompexp" } } */ --- gcc/testsuite/g++.dg/gomp/for-6.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/for-6.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -12,5 +12,5 @@ void foo (int n) 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 { scan-tree-dump-times "GOMP_loop_maybe_nonmonotonic_runtime_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_maybe_nonmonotonic_runtime_next" 1 "ompexp" } } */ --- gcc/testsuite/g++.dg/gomp/loop-4.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/loop-4.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,227 @@ +typedef __PTRDIFF_TYPE__ ptrdiff_t; + +template <typename T> +class I +{ +public: + typedef ptrdiff_t difference_type; + I (); + ~I (); + I (T *); + I (const I &); + T &operator * (); + T *operator -> (); + T &operator [] (const difference_type &) const; + I &operator = (const I &); + I &operator ++ (); + I operator ++ (int); + I &operator -- (); + I operator -- (int); + I &operator += (const difference_type &); + I &operator -= (const difference_type &); + I operator + (const difference_type &) const; + I operator - (const difference_type &) const; + template <typename S> friend bool operator == (I<S> &, I<S> &); + template <typename S> friend bool operator == (const I<S> &, const I<S> &); + template <typename S> friend bool operator < (I<S> &, I<S> &); + template <typename S> friend bool operator < (const I<S> &, const I<S> &); + template <typename S> friend bool operator <= (I<S> &, I<S> &); + template <typename S> friend bool operator <= (const I<S> &, const I<S> &); + template <typename S> friend bool operator > (I<S> &, I<S> &); + template <typename S> friend bool operator > (const I<S> &, const I<S> &); + template <typename S> friend bool operator >= (I<S> &, I<S> &); + template <typename S> friend bool operator >= (const I<S> &, const I<S> &); + template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &); + template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &); + template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &); +private: + T *p; +}; + +template <typename T> bool operator == (I<T> &, I<T> &); +template <typename T> bool operator == (const I<T> &, const I<T> &); +template <typename T> bool operator != (I<T> &, I<T> &); +template <typename T> bool operator != (const I<T> &, const I<T> &); +template <typename T> bool operator < (I<T> &, I<T> &); +template <typename T> bool operator < (const I<T> &, const I<T> &); +template <typename T> bool operator <= (I<T> &, I<T> &); +template <typename T> bool operator <= (const I<T> &, const I<T> &); +template <typename T> bool operator > (I<T> &, I<T> &); +template <typename T> bool operator > (const I<T> &, const I<T> &); +template <typename T> bool operator >= (I<T> &, I<T> &); +template <typename T> bool operator >= (const I<T> &, const I<T> &); +template <typename T> typename I<T>::difference_type operator - (I<T> &, I<T> &); +template <typename T> typename I<T>::difference_type operator - (const I<T> &, const I<T> &); +template <typename T> I<T> operator + (typename I<T>::difference_type, const I<T> &); + +ptrdiff_t foo (I<int> &); +I<int> &bar (I<int> &); +I<int> &baz (I<int> *); + +void +f0 () +{ + int i; + const int j = 1; + const int k = -1; + const int m = 2; + const int n = -7; + int o = 1; + int p = -1; + #pragma omp for + for (i = 0; i != 64; i += j) + ; + #pragma omp for + for (i = 64; i != 0; i -= j) + ; + #pragma omp for + for (i = 0; i != 64; i -= k) + ; + #pragma omp for + for (i = 64; i != 0; i += k) + ; + #pragma omp for + for (i = 0; i != 64; i += m) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 64; i != 0; i -= m) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 0; i != 64; i -= n) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 64; i != 0; i += n) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 0; i != 64; i += o) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 64; i != 0; i -= o) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 0; i != 64; i -= p) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = 64; i != 0; i += p) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; +} + +void +f1 (I<int> &x, I<int> &y, I<int> &u, I<int> &v) +{ + I<int> i, j; + const int k = 1; + const int l = -1; + const int m = 2; + const int n = -7; + int o = 1; + int p = -1; + #pragma omp for + for (i = x; i != y; i++) + ; + #pragma omp for + for (i = x; y != i; ++i) + ; + #pragma omp for + for (i = x; i != y; i = i + 1) + ; + #pragma omp for + for (i = x; i != y; i = 1 + i) + ; + #pragma omp for + for (i = y; i != x; i--) + ; + #pragma omp for + for (i = y; x != i; --i) + ; + #pragma omp for + for (i = y; i != x; i = i - 1) + ; + #pragma omp for + for (i = y; i != x; i = -1 + i) + ; + #pragma omp for + for (i = x; i != y; i = i + k) + ; + #pragma omp for + for (i = x; i != y; i = k + i) + ; + #pragma omp for + for (i = y; i != x; i = i - k) + ; + #pragma omp for + for (i = y; i != x; i = -k + i) + ; + #pragma omp for + for (i = x; i != y; i = i - l) + ; + #pragma omp for + for (i = x; i != y; i = -l + i) + ; + #pragma omp for + for (i = y; i != x; i = i + l) + ; + #pragma omp for + for (i = y; i != x; i = l + i) + ; + #pragma omp for + for (i = x; i != y; i = i + 2) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = 7 + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = i - 2) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = -7 + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = i + m) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = m + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = i - m) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = -m + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = i - n) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = -n + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = i + n) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = n + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = i + o) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = o + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = i - o) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = -o + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = i - p) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = x; i != y; i = -p + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = i + p) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; + #pragma omp for + for (i = y; i != x; i = p + i) // { dg-error "increment is not constant 1 or -1 for != condition" } + ; +} --- gcc/testsuite/g++.dg/gomp/member-2.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/member-2.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -60,17 +60,17 @@ B::m1 () int B::m2 () { - #pragma omp parallel private (h) // { dg-error "is predetermined .shared. for .private." } + #pragma omp parallel private (h) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } ; #pragma omp parallel firstprivate (h) ; - #pragma omp parallel for lastprivate (h) // { dg-error "is predetermined .shared. for .lastprivate." } + #pragma omp parallel for lastprivate (h) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp simd linear (h : 1) // { dg-error "is predetermined .shared. for .linear." } + #pragma omp simd linear (h : 1) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp parallel for reduction (+:h) // { dg-error "is predetermined .shared. for .reduction." } + #pragma omp parallel for reduction (+:h) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; #pragma omp parallel for reduction (+:g) // { dg-error "has const type for .reduction." } @@ -88,7 +88,7 @@ B::m2 () ; #pragma omp parallel shared (g) ; - #pragma omp parallel shared (h) // { dg-error "is predetermined .shared. for .shared." } + #pragma omp parallel shared (h) ; return 0; } @@ -118,30 +118,30 @@ B::m3 () const int B::m4 () const { - #pragma omp parallel private (a) // { dg-error "is predetermined .shared. for .private." } + #pragma omp parallel private (a) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } ; #pragma omp parallel firstprivate (a) ; - #pragma omp parallel for lastprivate (a) // { dg-error "is predetermined .shared. for .lastprivate." } + #pragma omp parallel for lastprivate (a) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp simd linear (a : 1) // { dg-error "is predetermined .shared. for .linear." } + #pragma omp simd linear (a : 1) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp parallel for reduction (+:a) // { dg-error "is predetermined .shared. for .reduction." } + #pragma omp parallel for reduction (+:a) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp parallel private (h) // { dg-error "is predetermined .shared. for .private." } + #pragma omp parallel private (h) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } ; #pragma omp parallel firstprivate (h) ; - #pragma omp parallel for lastprivate (h) // { dg-error "is predetermined .shared. for .lastprivate." } + #pragma omp parallel for lastprivate (h) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp simd linear (h : 1) // { dg-error "is predetermined .shared. for .linear." } + #pragma omp simd linear (h : 1) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; - #pragma omp parallel for reduction (+:h) // { dg-error "is predetermined .shared. for .reduction." } + #pragma omp parallel for reduction (+:h) // { dg-error "may appear only in .shared. or .firstprivate. clauses" } for (int i = 0; i < 10; i++) ; #pragma omp parallel for reduction (+:e) // { dg-error "has const type for .reduction." } @@ -150,7 +150,7 @@ B::m4 () const #pragma omp parallel for reduction (+:g) // { dg-error "has const type for .reduction." } for (int i = 0; i < 10; i++) ; - #pragma omp parallel shared (a) // { dg-error "is predetermined .shared. for .shared." } + #pragma omp parallel shared (a) ; #pragma omp parallel shared (b) ; @@ -162,7 +162,7 @@ B::m4 () const ; #pragma omp parallel shared (g) ; - #pragma omp parallel shared (h) // { dg-error "is predetermined .shared. for .shared." } + #pragma omp parallel shared (h) ; return 0; } --- gcc/testsuite/g++.dg/gomp/pr33372-1.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/pr33372-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -8,8 +8,8 @@ void f () extern T n (); #pragma omp parallel num_threads(n) // { dg-error "'num_threads' expression must be integral" } ; -#pragma omp parallel for schedule(static, n) - for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" } +#pragma omp parallel for schedule(static, n) // { dg-error "chunk size expression must be integral" } + for (int i = 0; i < 10; i++) ; } --- gcc/testsuite/g++.dg/gomp/pr33372-3.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/pr33372-3.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -8,8 +8,8 @@ void f () T n = 6; #pragma omp parallel num_threads(n) // { dg-error "'num_threads' expression must be integral" } ; -#pragma omp parallel for schedule(static, n) - for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" } +#pragma omp parallel for schedule(static, n) // { dg-error "chunk size expression must be integral" } + for (int i = 0; i < 10; i++) ; } --- gcc/testsuite/g++.dg/gomp/pr39495-2.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/pr39495-2.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -13,25 +13,25 @@ foo (void) unsigned int u; #pragma omp for - for (i = INT_MIN + 6; i != INT_MIN; i--) // { dg-error "invalid controlling predicate" } + for (i = INT_MIN + 6; i != INT_MIN; i--) ; #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" } + for (i = INT_MAX - 6; i != INT_MAX; i++) ; #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" } + for (u = 6; u != 0; u--) ; #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" } + for (u = UINT_MAX - 6; u != UINT_MAX; u++) ; #pragma omp for for (u = UINT_MAX - 6; u == UINT_MAX; u++) // { dg-error "invalid controlling predicate" } --- gcc/testsuite/g++.dg/gomp/predetermined-1.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/predetermined-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -15,18 +15,18 @@ const A foo (const A d, const C e) const A f; const B b = { 4 }; A g; - #pragma omp parallel default (none) - bar (&a); - #pragma omp parallel default (none) - bar (&b); + #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } + bar (&a); // { dg-error "not specified" } + #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } + bar (&b); // { dg-error "not specified" } #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } bar (&c); // { dg-error "not specified" } - #pragma omp parallel default (none) - bar (&d); + #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } + bar (&d); // { dg-error "not specified" } #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } bar (&e); // { dg-error "not specified" } - #pragma omp parallel default (none) - bar (&f); + #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } + bar (&f); // { dg-error "not specified" } #pragma omp parallel default (none) // { dg-error "enclosing 'parallel'" } bar (&g); // { dg-error "not specified" } return f; --- gcc/testsuite/g++.dg/gomp/private-1.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/private-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -15,17 +15,17 @@ const A foo (const A d, const C e) const A f; const B b = { 4 }; A g; - #pragma omp parallel private (a) // { dg-error "predetermined" } + #pragma omp parallel private (a) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } bar (&a); - #pragma omp parallel private (b) // { dg-error "predetermined" } + #pragma omp parallel private (b) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } bar (&b); #pragma omp parallel private (c) bar (&c); - #pragma omp parallel private (d) // { dg-error "predetermined" } + #pragma omp parallel private (d) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } bar (&d); #pragma omp parallel private (e) bar (&e); - #pragma omp parallel private (f) // { dg-error "predetermined" } + #pragma omp parallel private (f) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } bar (&f); #pragma omp parallel private (g) bar (&g); --- gcc/testsuite/g++.dg/gomp/sharing-1.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/sharing-1.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -61,7 +61,7 @@ main (void) thrglobalvar++; /* Predetermined - threadprivate. */ thrlocvar++; /* Predetermined - threadprivate. */ foo (i); /* Predetermined - private (omp for loop variable). */ - foo (constvar.x); /* Predetermined - shared (const qualified type). */ + foo (constvar.x); /* { dg-error "not specified in" } */ foo (T::t.i); /* Predetermined - shared (static data member). */ foo (*p); /* *p predetermined - shared (heap allocated */ (*p)++; /* storage). */ --- gcc/testsuite/g++.dg/gomp/sharing-2.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/sharing-2.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -5,15 +5,21 @@ struct T int i; mutable int j; }; +struct U +{ + int i, j; +}; struct S { const static int d = 1; const static T e; + const static U f; void foo (int, T); }; const int S::d; const T S::e = { 2, 3 }; +const U S::f = { 4, 5 }; void bar (const int &); @@ -28,15 +34,19 @@ S::foo (const int x, const T y) bar (y.i); #pragma omp parallel firstprivate (e) // { dg-error "is predetermined" } bar (e.i); - #pragma omp parallel shared (x) // { dg-error "is predetermined" } + #pragma omp parallel firstprivate (f) + bar (f.i); + #pragma omp parallel shared (x) bar (x); #pragma omp parallel shared (d) // { dg-error "is predetermined" } bar (d); #pragma omp parallel shared (e) // { dg-error "is predetermined" } bar (e.i); + #pragma omp parallel shared (f) // { dg-error "is predetermined" } + bar (f.i); #pragma omp parallel shared (y) bar (y.i); - #pragma omp parallel private (x) // { dg-error "is predetermined" } + #pragma omp parallel private (x) // { dg-error "may appear only in 'shared' or 'firstprivate' clauses" } bar (x); #pragma omp parallel private (d) // { dg-error "is predetermined" } bar (d); @@ -44,4 +54,6 @@ S::foo (const int x, const T y) bar (y.i); #pragma omp parallel private (e) // { dg-error "is predetermined" } bar (e.i); + #pragma omp parallel private (f) // { dg-error "is predetermined" } + bar (f.i); } --- gcc/testsuite/g++.dg/gomp/simd-2.C (.../trunk) (nonexistent) +++ gcc/testsuite/g++.dg/gomp/simd-2.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -0,0 +1,21 @@ +int a[32], b[32]; + +void +foo (void) +{ + int i, j; + #pragma omp simd linear(i, j) collapse(2) // { dg-error "iteration variable 'i' should not be linear" } + for (i = 0; i < 32; ++i) // { dg-error "iteration variable 'j' should not be linear" "" { target *-*-* } .-1 } + for (j = 0; j < 32; ++j) + a[i] += b[j]; +} + +void +bar (void) +{ + static int i, j; + #pragma omp for simd linear(i, j) collapse(2) // { dg-error "iteration variable 'i' should not be linear" "" { target *-*-* } .+1 } + for (i = 0; i < 32; ++i) // { dg-error "iteration variable 'j' should not be linear" } + for (j = 0; j < 32; ++j) + a[i] += b[j]; +} --- gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C (.../trunk) (revision 265884) +++ gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C (.../branches/gomp-5_0-branch) (revision 265887) @@ -6,21 +6,21 @@ struct S { int x; } s; // even when the templates are never instantiated. template<typename T> void f1() { - #pragma omp atomic - s += 1; // { dg-error "invalid" } + #pragma omp atomic // { dg-error "invalid" } + s += 1; } template<typename T> void f2(float *f) { - #pragma omp atomic - *f |= 1; // { dg-error "invalid|evaluation" } + #pragma omp atomic // { dg-error "invalid" } + *f |= 1; // { dg-error "evaluation" } } // Here the rhs is dependent, but not type dependent. template<typename T> void f3(float *f) { - #pragma omp atomic - *f |= sizeof (T); // { dg-error "invalid|evaluation" } + #pragma omp atomic // { dg-error "invalid" } + *f |= sizeof (T); // { dg-error "evaluation" } } // And the converse, no error here because we're never fed a T. @@ -35,6 +35,6 @@ template<typename T> void f4(T *t) // of the semantic analysis concurrent with that. template<typename T> void f5(float *f) { - #pragma omp atomic - *f |= (T)sizeof(T); // { dg-error "invalid|evaluation" "" { xfail *-*-* } } + #pragma omp atomic // { dg-error "invalid" "" { xfail *-*-* } } + *f |= (T)sizeof(T); // { dg-error "evaluation" "" { xfail *-*-* } } } Jakub