1*f82ec553SMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -verify -fopenmp \
2*f82ec553SMike Rice // RUN: -fopenmp-version=51 -Wuninitialized %s
3*f82ec553SMike Rice
foo()4*f82ec553SMike Rice void foo()
5*f82ec553SMike Rice {
6*f82ec553SMike Rice int i,j,k;
7*f82ec553SMike Rice int z;
8*f82ec553SMike Rice
9*f82ec553SMike Rice // expected-error@+2 {{statement after '#pragma omp target parallel loop' must be a for loop}}
10*f82ec553SMike Rice #pragma omp target parallel loop bind(thread)
11*f82ec553SMike Rice i = 0;
12*f82ec553SMike Rice
13*f82ec553SMike Rice // OpenMP 5.1 [2.22 Nesting of regions]
14*f82ec553SMike Rice //
15*f82ec553SMike Rice // A barrier region may not be closely nested inside a worksharing, loop,
16*f82ec553SMike Rice // task, taskloop, critical, ordered, atomic, or masked region.
17*f82ec553SMike Rice
18*f82ec553SMike Rice // expected-error@+3 {{region cannot be closely nested inside 'target parallel loop' region}}
19*f82ec553SMike Rice #pragma omp target parallel loop bind(thread)
20*f82ec553SMike Rice for (i=0; i<1000; ++i) {
21*f82ec553SMike Rice #pragma omp barrier
22*f82ec553SMike Rice }
23*f82ec553SMike Rice
24*f82ec553SMike Rice // A masked region may not be closely nested inside a worksharing, loop,
25*f82ec553SMike Rice // atomic, task, or taskloop region.
26*f82ec553SMike Rice
27*f82ec553SMike Rice // expected-error@+3 {{region cannot be closely nested inside 'target parallel loop' region}}
28*f82ec553SMike Rice #pragma omp target parallel loop bind(thread)
29*f82ec553SMike Rice for (i=0; i<1000; ++i) {
30*f82ec553SMike Rice #pragma omp masked filter(2)
31*f82ec553SMike Rice { }
32*f82ec553SMike Rice }
33*f82ec553SMike Rice
34*f82ec553SMike Rice // An ordered region that corresponds to an ordered construct without any
35*f82ec553SMike Rice // clause or with the threads or depend clause may not be closely nested
36*f82ec553SMike Rice // inside a critical, ordered, loop, atomic, task, or taskloop region.
37*f82ec553SMike Rice
38*f82ec553SMike Rice // expected-error@+3 {{region cannot be closely nested inside 'target parallel loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
39*f82ec553SMike Rice #pragma omp target parallel loop bind(thread)
40*f82ec553SMike Rice for (i=0; i<1000; ++i) {
41*f82ec553SMike Rice #pragma omp ordered
42*f82ec553SMike Rice { }
43*f82ec553SMike Rice }
44*f82ec553SMike Rice
45*f82ec553SMike Rice // expected-error@+3 {{region cannot be closely nested inside 'target parallel loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
46*f82ec553SMike Rice #pragma omp target parallel loop bind(thread)
47*f82ec553SMike Rice for (i=0; i<1000; ++i) {
48*f82ec553SMike Rice #pragma omp ordered threads
49*f82ec553SMike Rice { }
50*f82ec553SMike Rice }
51*f82ec553SMike Rice
52*f82ec553SMike Rice // expected-error@+3 {{region cannot be closely nested inside 'target parallel loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
53*f82ec553SMike Rice #pragma omp target parallel loop bind(thread)
54*f82ec553SMike Rice for (i=0; i<1000; ++i) {
55*f82ec553SMike Rice #pragma omp ordered depend(source)
56*f82ec553SMike Rice }
57*f82ec553SMike Rice
58*f82ec553SMike Rice // bind clause
59*f82ec553SMike Rice
60*f82ec553SMike Rice // expected-error@+1 {{directive '#pragma omp target parallel loop' cannot contain more than one 'bind' clause}}
61*f82ec553SMike Rice #pragma omp target parallel loop bind(thread) bind(thread)
62*f82ec553SMike Rice for (i=0; i<1000; ++i) {
63*f82ec553SMike Rice }
64*f82ec553SMike Rice
65*f82ec553SMike Rice // expected-error@+1 {{expected 'teams', 'parallel' or 'thread' in OpenMP clause 'bind'}}
66*f82ec553SMike Rice #pragma omp target parallel loop bind(other)
67*f82ec553SMike Rice for (i=0; i<1000; ++i) {
68*f82ec553SMike Rice }
69*f82ec553SMike Rice
70*f82ec553SMike Rice // collapse clause
71*f82ec553SMike Rice
72*f82ec553SMike Rice // expected-error@+4 {{expected 2 for loops after '#pragma omp target parallel loop', but found only 1}}
73*f82ec553SMike Rice // expected-note@+1 {{as specified in 'collapse' clause}}
74*f82ec553SMike Rice #pragma omp target parallel loop collapse(2) bind(thread)
75*f82ec553SMike Rice for (i=0; i<1000; ++i)
76*f82ec553SMike Rice z = i+11;
77*f82ec553SMike Rice
78*f82ec553SMike Rice // expected-error@+1 {{directive '#pragma omp target parallel loop' cannot contain more than one 'collapse' clause}}
79*f82ec553SMike Rice #pragma omp target parallel loop collapse(2) collapse(2) bind(thread)
80*f82ec553SMike Rice for (i=0; i<1000; ++i)
81*f82ec553SMike Rice for (j=0; j<1000; ++j)
82*f82ec553SMike Rice z = i+j+11;
83*f82ec553SMike Rice
84*f82ec553SMike Rice // order clause
85*f82ec553SMike Rice
86*f82ec553SMike Rice // expected-error@+1 {{expected 'concurrent' in OpenMP clause 'order'}}
87*f82ec553SMike Rice #pragma omp target parallel loop order(foo) bind(thread)
88*f82ec553SMike Rice for (i=0; i<1000; ++i)
89*f82ec553SMike Rice z = i+11;
90*f82ec553SMike Rice
91*f82ec553SMike Rice // private clause
92*f82ec553SMike Rice
93*f82ec553SMike Rice // expected-error@+1 {{use of undeclared identifier 'undef_var'}}
94*f82ec553SMike Rice #pragma omp target parallel loop private(undef_var) bind(thread)
95*f82ec553SMike Rice for (i=0; i<1000; ++i)
96*f82ec553SMike Rice z = i+11;
97*f82ec553SMike Rice
98*f82ec553SMike Rice // lastprivate
99*f82ec553SMike Rice
100*f82ec553SMike Rice // A list item may not appear in a lastprivate clause unless it is the loop
101*f82ec553SMike Rice // iteration variable of a loop that is associated with the construct.
102*f82ec553SMike Rice
103*f82ec553SMike Rice // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp target parallel loop' directives}}
104*f82ec553SMike Rice #pragma omp target parallel loop lastprivate(z) bind(thread)
105*f82ec553SMike Rice for (i=0; i<1000; ++i) {
106*f82ec553SMike Rice z = i+11;
107*f82ec553SMike Rice }
108*f82ec553SMike Rice
109*f82ec553SMike Rice // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp target parallel loop' directives}}
110*f82ec553SMike Rice #pragma omp target parallel loop lastprivate(k) collapse(2) bind(thread)
111*f82ec553SMike Rice for (i=0; i<1000; ++i)
112*f82ec553SMike Rice for (j=0; j<1000; ++j)
113*f82ec553SMike Rice for (k=0; k<1000; ++k)
114*f82ec553SMike Rice z = i+j+k+11;
115*f82ec553SMike Rice
116*f82ec553SMike Rice // reduction
117*f82ec553SMike Rice
118*f82ec553SMike Rice // expected-error@+1 {{use of undeclared identifier 'undef_var'}}
119*f82ec553SMike Rice #pragma omp target parallel loop reduction(+:undef_var) bind(thread)
120*f82ec553SMike Rice for (i=0; i<1000; ++i)
121*f82ec553SMike Rice z = i+11;
122*f82ec553SMike Rice
123*f82ec553SMike Rice // nowait
124*f82ec553SMike Rice
125*f82ec553SMike Rice // expected-error@+1 {{directive '#pragma omp target parallel loop' cannot contain more than one 'nowait' clause}}
126*f82ec553SMike Rice #pragma omp target parallel loop nowait nowait
127*f82ec553SMike Rice for (i=0; i<1000; ++i)
128*f82ec553SMike Rice z = i+11;
129*f82ec553SMike Rice
130*f82ec553SMike Rice // num_threads
131*f82ec553SMike Rice
132*f82ec553SMike Rice // expected-error@+1 {{directive '#pragma omp target parallel loop' cannot contain more than one 'num_threads' clause}}
133*f82ec553SMike Rice #pragma omp target parallel loop num_threads(4) num_threads(4)
134*f82ec553SMike Rice for (i=0; i<1000; ++i)
135*f82ec553SMike Rice z = i+11;
136*f82ec553SMike Rice
137*f82ec553SMike Rice // proc_bind
138*f82ec553SMike Rice
139*f82ec553SMike Rice // expected-error@+1 {{directive '#pragma omp target parallel loop' cannot contain more than one 'proc_bind' clause}}
140*f82ec553SMike Rice #pragma omp target parallel loop proc_bind(close) proc_bind(primary)
141*f82ec553SMike Rice for (i=0; i<1000; ++i)
142*f82ec553SMike Rice z = i+11;
143*f82ec553SMike Rice }
144*f82ec553SMike Rice
145*f82ec553SMike Rice template <typename T, int C>
templ_test(T t)146*f82ec553SMike Rice void templ_test(T t) {
147*f82ec553SMike Rice T i,z;
148*f82ec553SMike Rice
149*f82ec553SMike Rice // expected-error@+4 {{expected 2 for loops after '#pragma omp target parallel loop', but found only 1}}
150*f82ec553SMike Rice // expected-note@+1 {{as specified in 'collapse' clause}}
151*f82ec553SMike Rice #pragma omp target parallel loop collapse(C) bind(thread)
152*f82ec553SMike Rice for (i=0; i<1000; ++i)
153*f82ec553SMike Rice z = i+11;
154*f82ec553SMike Rice
155*f82ec553SMike Rice // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp target parallel loop' directives}}
156*f82ec553SMike Rice #pragma omp target parallel loop lastprivate(z) bind(thread)
157*f82ec553SMike Rice for (i=0; i<1000; ++i) {
158*f82ec553SMike Rice z = i+11;
159*f82ec553SMike Rice }
160*f82ec553SMike Rice }
161*f82ec553SMike Rice
bar()162*f82ec553SMike Rice void bar()
163*f82ec553SMike Rice {
164*f82ec553SMike Rice templ_test<int, 2>(16); // expected-note {{in instantiation of function template specialization 'templ_test<int, 2>' requested here}}
165*f82ec553SMike Rice }
166