1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s
2 
3 int foo();
4 
5 template <class T>
6 T foo() {
7   #pragma omp for ordered
8   for (int i = 0; i < 10; ++i) {
9     L1:
10       foo();
11     #pragma omp ordered
12     {
13       foo();
14       goto L1; // expected-error {{use of undeclared label 'L1'}}
15     }
16   }
17   #pragma omp for ordered
18   for (int i = 0; i < 10; ++i) {
19     foo();
20     goto L2; // expected-error {{use of undeclared label 'L2'}}
21     #pragma omp ordered
22     {
23       L2:
24       foo();
25     }
26   }
27   #pragma omp for ordered
28   for (int i = 0; i < 10; ++i) {
29     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
30     {
31       foo();
32     }
33   }
34   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
35   for (int i = 0; i < 10; ++i) {
36     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
37     {
38       foo();
39     }
40   }
41   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
42   for (int i = 0; i < 10; ++i) {
43     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
44     {
45       foo();
46     }
47   }
48   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
49   {
50     foo();
51   }
52   #pragma omp simd
53   for (int i = 0; i < 10; ++i) {
54     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
55     {
56       foo();
57     }
58   }
59   #pragma omp simd
60   for (int i = 0; i < 10; ++i) {
61     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
62     {
63       foo();
64     }
65   }
66   #pragma omp for simd
67   for (int i = 0; i < 10; ++i) {
68     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
69     {
70       foo();
71     }
72   }
73   #pragma omp for simd
74   for (int i = 0; i < 10; ++i) {
75     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
76     {
77       foo();
78     }
79   }
80   #pragma omp parallel for simd
81   for (int i = 0; i < 10; ++i) {
82     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
83     {
84       foo();
85     }
86   }
87   #pragma omp parallel for simd
88   for (int i = 0; i < 10; ++i) {
89     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
90     {
91       foo();
92     }
93   }
94 
95   return T();
96 }
97 
98 int foo() {
99   #pragma omp for ordered
100   for (int i = 0; i < 10; ++i) {
101     L1:
102       foo();
103     #pragma omp ordered
104     {
105       foo();
106       goto L1; // expected-error {{use of undeclared label 'L1'}}
107     }
108   }
109   #pragma omp for ordered
110   for (int i = 0; i < 10; ++i) {
111     foo();
112     goto L2; // expected-error {{use of undeclared label 'L2'}}
113     #pragma omp ordered
114     {
115       L2:
116       foo();
117     }
118   }
119   #pragma omp for ordered
120   for (int i = 0; i < 10; ++i) {
121     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
122     {
123       foo();
124     }
125   }
126   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
127   for (int i = 0; i < 10; ++i) {
128     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
129     {
130       foo();
131     }
132   }
133   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
134   for (int i = 0; i < 10; ++i) {
135     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
136     {
137       foo();
138     }
139   }
140   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
141   {
142     foo();
143   }
144   #pragma omp simd
145   for (int i = 0; i < 10; ++i) {
146     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
147     {
148       foo();
149     }
150   }
151   #pragma omp simd
152   for (int i = 0; i < 10; ++i) {
153     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
154     {
155       foo();
156     }
157   }
158   #pragma omp for simd
159   for (int i = 0; i < 10; ++i) {
160     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
161     {
162       foo();
163     }
164   }
165   #pragma omp for simd
166   for (int i = 0; i < 10; ++i) {
167     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
168     {
169       foo();
170     }
171   }
172   #pragma omp parallel for simd
173   for (int i = 0; i < 10; ++i) {
174     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
175     {
176       foo();
177     }
178   }
179   #pragma omp parallel for simd
180   for (int i = 0; i < 10; ++i) {
181     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
182     {
183       foo();
184     }
185   }
186 
187   return foo<int>();
188 }
189