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