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