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