xref: /llvm-project/clang/test/OpenMP/interchange_messages.cpp (revision 5b03efb85d63d1f4033ed649a56a177dd4ed62b4)
15c93a94fSMichael Kruse // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=60 -fsyntax-only -Wuninitialized -verify %s
25c93a94fSMichael Kruse 
35c93a94fSMichael Kruse void func() {
45c93a94fSMichael Kruse 
5*5b03efb8SMichael Kruse   // expected-error@+1 {{expected '('}}
6*5b03efb8SMichael Kruse   #pragma omp interchange permutation
7*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
8*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
9*5b03efb8SMichael Kruse       ;
10*5b03efb8SMichael Kruse 
11*5b03efb8SMichael Kruse   // expected-error@+2 {{expected expression}}
12*5b03efb8SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
13*5b03efb8SMichael Kruse   #pragma omp interchange permutation(
14*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
15*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
16*5b03efb8SMichael Kruse       ;
17*5b03efb8SMichael Kruse 
18*5b03efb8SMichael Kruse   // expected-error@+1 {{expected expression}}
19*5b03efb8SMichael Kruse   #pragma omp interchange permutation()
20*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
21*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
22*5b03efb8SMichael Kruse       ;
23*5b03efb8SMichael Kruse 
24*5b03efb8SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
25*5b03efb8SMichael Kruse   #pragma omp interchange permutation(1
26*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
27*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
28*5b03efb8SMichael Kruse       ;
29*5b03efb8SMichael Kruse 
30*5b03efb8SMichael Kruse   // expected-error@+2 {{expected expression}}
31*5b03efb8SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
32*5b03efb8SMichael Kruse   #pragma omp interchange permutation(1,
33*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
34*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
35*5b03efb8SMichael Kruse       ;
36*5b03efb8SMichael Kruse 
37*5b03efb8SMichael Kruse   // expected-error@+1 {{expected expression}}
38*5b03efb8SMichael Kruse   #pragma omp interchange permutation(1,)
39*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
40*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
41*5b03efb8SMichael Kruse       ;
42*5b03efb8SMichael Kruse 
43*5b03efb8SMichael Kruse   // expected-error@+2 {{expected expression}}
44*5b03efb8SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
45*5b03efb8SMichael Kruse   #pragma omp interchange permutation(5+
46*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
47*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
48*5b03efb8SMichael Kruse       ;
49*5b03efb8SMichael Kruse 
50*5b03efb8SMichael Kruse   // expected-error@+1 {{expected expression}}
51*5b03efb8SMichael Kruse   #pragma omp interchange permutation(5+)
52*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
53*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
54*5b03efb8SMichael Kruse       ;
55*5b03efb8SMichael Kruse 
56*5b03efb8SMichael Kruse   // expected-error@+1 {{expected expression}}
57*5b03efb8SMichael Kruse   #pragma omp interchange permutation(for)
58*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
59*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
60*5b03efb8SMichael Kruse       ;
61*5b03efb8SMichael Kruse 
62*5b03efb8SMichael Kruse   // expected-error@+1 {{permutation index must be at least 1 and at most 1}}
63*5b03efb8SMichael Kruse   #pragma omp interchange permutation(0)
64*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
65*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
66*5b03efb8SMichael Kruse       ;
67*5b03efb8SMichael Kruse 
68*5b03efb8SMichael Kruse   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
69*5b03efb8SMichael Kruse   #pragma omp interchange permutation(1,3)
70*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
71*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
72*5b03efb8SMichael Kruse       ;
73*5b03efb8SMichael Kruse 
74*5b03efb8SMichael Kruse   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
75*5b03efb8SMichael Kruse   #pragma omp interchange permutation(1,1)
76*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
77*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
78*5b03efb8SMichael Kruse       ;
79*5b03efb8SMichael Kruse 
80*5b03efb8SMichael Kruse   // expected-error@+4 {{expression is not an integral constant expression}}
81*5b03efb8SMichael Kruse   // expected-note@+3 {{read of non-const variable 'a' is not allowed in a constant expression}}
82*5b03efb8SMichael Kruse   // expected-note@+1 {{declared here}}
83*5b03efb8SMichael Kruse   int a;
84*5b03efb8SMichael Kruse   #pragma omp interchange permutation(a)
85*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
86*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
87*5b03efb8SMichael Kruse       ;
88*5b03efb8SMichael Kruse 
895c93a94fSMichael Kruse   // expected-warning@+1 {{extra tokens at the end of '#pragma omp interchange' are ignored}}
905c93a94fSMichael Kruse   #pragma omp interchange foo
915c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
925c93a94fSMichael Kruse     for (int j = 0; j < 13; ++j)
935c93a94fSMichael Kruse       ;
945c93a94fSMichael Kruse 
95*5b03efb8SMichael Kruse   // expected-error@+1 {{directive '#pragma omp interchange' cannot contain more than one 'permutation' clause}}
96*5b03efb8SMichael Kruse   #pragma omp interchange permutation(2,1) permutation(2,1)
97*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
98*5b03efb8SMichael Kruse     for (int j = 0; j < 13; ++j)
99*5b03efb8SMichael Kruse       ;
100*5b03efb8SMichael Kruse 
1015c93a94fSMichael Kruse   // expected-error@+1 {{unexpected OpenMP clause 'collapse' in directive '#pragma omp interchange'}}
1025c93a94fSMichael Kruse   #pragma omp interchange collapse(2)
1035c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1045c93a94fSMichael Kruse     for (int j = 0; j < 13; ++j)
1055c93a94fSMichael Kruse       ;
1065c93a94fSMichael Kruse 
1075c93a94fSMichael Kruse   {
1085c93a94fSMichael Kruse     // expected-error@+2 {{expected statement}}
1095c93a94fSMichael Kruse     #pragma omp interchange
1105c93a94fSMichael Kruse   }
1115c93a94fSMichael Kruse 
1125c93a94fSMichael Kruse   // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}
1135c93a94fSMichael Kruse   #pragma omp interchange
1145c93a94fSMichael Kruse   int b = 0;
1155c93a94fSMichael Kruse 
1165c93a94fSMichael Kruse   // expected-error@+3 {{statement after '#pragma omp interchange' must be a for loop}}
1175c93a94fSMichael Kruse   #pragma omp interchange
1185c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1195c93a94fSMichael Kruse     ;
1205c93a94fSMichael Kruse 
1215c93a94fSMichael Kruse   // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}
1225c93a94fSMichael Kruse   #pragma omp interchange
1235c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i) {
1245c93a94fSMichael Kruse     int k = 3;
1255c93a94fSMichael Kruse     for (int j = 0; j < 7; ++j)
1265c93a94fSMichael Kruse       ;
1275c93a94fSMichael Kruse   }
1285c93a94fSMichael Kruse 
1295c93a94fSMichael Kruse   // expected-error@+3 {{expected loop invariant expression}}
1305c93a94fSMichael Kruse   #pragma omp interchange
1315c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1325c93a94fSMichael Kruse     for (int j = i; j < 7; ++j)
1335c93a94fSMichael Kruse       ;
1345c93a94fSMichael Kruse 
1355c93a94fSMichael Kruse   // expected-error@+3 {{expected loop invariant expression}}
1365c93a94fSMichael Kruse   #pragma omp interchange
1375c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1385c93a94fSMichael Kruse     for (int j = 0; j < i; ++j)
1395c93a94fSMichael Kruse       ;
1405c93a94fSMichael Kruse 
1415c93a94fSMichael Kruse   // expected-error@+3 {{expected loop invariant expression}}
1425c93a94fSMichael Kruse   #pragma omp interchange
1435c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1445c93a94fSMichael Kruse     for (int j = 0; j < i; ++j)
1455c93a94fSMichael Kruse       ;
1465c93a94fSMichael Kruse 
1475c93a94fSMichael Kruse   // expected-error@+6 {{expected 3 for loops after '#pragma omp for', but found only 2}}
1485c93a94fSMichael Kruse   // expected-note@+1 {{as specified in 'collapse' clause}}
1495c93a94fSMichael Kruse   #pragma omp for collapse(3)
1505c93a94fSMichael Kruse   #pragma omp interchange
1515c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1525c93a94fSMichael Kruse     for (int j = 0; j < 13; ++j)
1535c93a94fSMichael Kruse       ;
1545c93a94fSMichael Kruse 
1555c93a94fSMichael Kruse   // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}
1565c93a94fSMichael Kruse   #pragma omp interchange
1575c93a94fSMichael Kruse   #pragma omp for
1585c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1595c93a94fSMichael Kruse     ;
1605c93a94fSMichael Kruse 
1615c93a94fSMichael Kruse   // expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'j'}}
1625c93a94fSMichael Kruse   #pragma omp interchange
1635c93a94fSMichael Kruse   for (int i = 0; i < 7; ++i)
1645c93a94fSMichael Kruse     for (int j = 0; j/3<7; ++j)
1655c93a94fSMichael Kruse       ;
1665c93a94fSMichael Kruse }
1675c93a94fSMichael Kruse 
168*5b03efb8SMichael Kruse 
169*5b03efb8SMichael Kruse 
170*5b03efb8SMichael Kruse template <typename T>
171*5b03efb8SMichael Kruse static void templated_func() {
172*5b03efb8SMichael Kruse   // In a template context, but expression itself not instantiation-dependent
173*5b03efb8SMichael Kruse 
174*5b03efb8SMichael Kruse   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
175*5b03efb8SMichael Kruse   #pragma omp interchange permutation(0,1)
176*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
177*5b03efb8SMichael Kruse     for (int j = 0; j<7; ++j)
178*5b03efb8SMichael Kruse       ;
179*5b03efb8SMichael Kruse 
180*5b03efb8SMichael Kruse   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
181*5b03efb8SMichael Kruse   #pragma omp interchange permutation(1,1)
182*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
183*5b03efb8SMichael Kruse     for (int j = 0; j<7; ++j)
184*5b03efb8SMichael Kruse       ;
185*5b03efb8SMichael Kruse }
186*5b03efb8SMichael Kruse 
187*5b03efb8SMichael Kruse 
188*5b03efb8SMichael Kruse 
189*5b03efb8SMichael Kruse template <int S>
190*5b03efb8SMichael Kruse static void templated_func_value_dependent() {
191*5b03efb8SMichael Kruse   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
192*5b03efb8SMichael Kruse   #pragma omp interchange permutation(S,S+1)
193*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
194*5b03efb8SMichael Kruse     for (int j = 0; j<7; ++j)
195*5b03efb8SMichael Kruse       ;
196*5b03efb8SMichael Kruse 
197*5b03efb8SMichael Kruse   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
198*5b03efb8SMichael Kruse   #pragma omp interchange permutation(S+1,S+1)
199*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
200*5b03efb8SMichael Kruse     for (int j = 0; j<7; ++j)
201*5b03efb8SMichael Kruse       ;
202*5b03efb8SMichael Kruse }
203*5b03efb8SMichael Kruse 
204*5b03efb8SMichael Kruse 
205*5b03efb8SMichael Kruse template <typename T>
206*5b03efb8SMichael Kruse static void templated_func_type_dependent() {
207*5b03efb8SMichael Kruse   constexpr T s = 0;
208*5b03efb8SMichael Kruse 
209*5b03efb8SMichael Kruse   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
210*5b03efb8SMichael Kruse   #pragma omp interchange permutation(s,s+1)
211*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
212*5b03efb8SMichael Kruse     for (int j = 0; j<7; ++j)
213*5b03efb8SMichael Kruse       ;
214*5b03efb8SMichael Kruse 
215*5b03efb8SMichael Kruse   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
216*5b03efb8SMichael Kruse   #pragma omp interchange permutation(s+1,s+1)
217*5b03efb8SMichael Kruse   for (int i = 0; i < 7; ++i)
218*5b03efb8SMichael Kruse     for (int j = 0; j<7; ++j)
219*5b03efb8SMichael Kruse       ;
220*5b03efb8SMichael Kruse }
221*5b03efb8SMichael Kruse 
222*5b03efb8SMichael Kruse 
223*5b03efb8SMichael Kruse void template_inst() {
224*5b03efb8SMichael Kruse   // expected-note@+1 {{in instantiation of function template specialization 'templated_func<int>' requested here}}
225*5b03efb8SMichael Kruse   templated_func<int>();
226*5b03efb8SMichael Kruse   // expected-note@+1 {{in instantiation of function template specialization 'templated_func_value_dependent<0>' requested here}}
227*5b03efb8SMichael Kruse   templated_func_value_dependent<0>();
228*5b03efb8SMichael Kruse   // expected-note@+1 {{in instantiation of function template specialization 'templated_func_type_dependent<int>' requested here}}
229*5b03efb8SMichael Kruse   templated_func_type_dependent<int>();
230*5b03efb8SMichael Kruse }
231*5b03efb8SMichael Kruse 
232