xref: /llvm-project/clang/test/OpenMP/interchange_messages.cpp (revision 5b03efb85d63d1f4033ed649a56a177dd4ed62b4)
1 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=60 -fsyntax-only -Wuninitialized -verify %s
2 
3 void func() {
4 
5   // expected-error@+1 {{expected '('}}
6   #pragma omp interchange permutation
7   for (int i = 0; i < 7; ++i)
8     for (int j = 0; j < 13; ++j)
9       ;
10 
11   // expected-error@+2 {{expected expression}}
12   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
13   #pragma omp interchange permutation(
14   for (int i = 0; i < 7; ++i)
15     for (int j = 0; j < 13; ++j)
16       ;
17 
18   // expected-error@+1 {{expected expression}}
19   #pragma omp interchange permutation()
20   for (int i = 0; i < 7; ++i)
21     for (int j = 0; j < 13; ++j)
22       ;
23 
24   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
25   #pragma omp interchange permutation(1
26   for (int i = 0; i < 7; ++i)
27     for (int j = 0; j < 13; ++j)
28       ;
29 
30   // expected-error@+2 {{expected expression}}
31   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
32   #pragma omp interchange permutation(1,
33   for (int i = 0; i < 7; ++i)
34     for (int j = 0; j < 13; ++j)
35       ;
36 
37   // expected-error@+1 {{expected expression}}
38   #pragma omp interchange permutation(1,)
39   for (int i = 0; i < 7; ++i)
40     for (int j = 0; j < 13; ++j)
41       ;
42 
43   // expected-error@+2 {{expected expression}}
44   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
45   #pragma omp interchange permutation(5+
46   for (int i = 0; i < 7; ++i)
47     for (int j = 0; j < 13; ++j)
48       ;
49 
50   // expected-error@+1 {{expected expression}}
51   #pragma omp interchange permutation(5+)
52   for (int i = 0; i < 7; ++i)
53     for (int j = 0; j < 13; ++j)
54       ;
55 
56   // expected-error@+1 {{expected expression}}
57   #pragma omp interchange permutation(for)
58   for (int i = 0; i < 7; ++i)
59     for (int j = 0; j < 13; ++j)
60       ;
61 
62   // expected-error@+1 {{permutation index must be at least 1 and at most 1}}
63   #pragma omp interchange permutation(0)
64   for (int i = 0; i < 7; ++i)
65     for (int j = 0; j < 13; ++j)
66       ;
67 
68   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
69   #pragma omp interchange permutation(1,3)
70   for (int i = 0; i < 7; ++i)
71     for (int j = 0; j < 13; ++j)
72       ;
73 
74   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
75   #pragma omp interchange permutation(1,1)
76   for (int i = 0; i < 7; ++i)
77     for (int j = 0; j < 13; ++j)
78       ;
79 
80   // expected-error@+4 {{expression is not an integral constant expression}}
81   // expected-note@+3 {{read of non-const variable 'a' is not allowed in a constant expression}}
82   // expected-note@+1 {{declared here}}
83   int a;
84   #pragma omp interchange permutation(a)
85   for (int i = 0; i < 7; ++i)
86     for (int j = 0; j < 13; ++j)
87       ;
88 
89   // expected-warning@+1 {{extra tokens at the end of '#pragma omp interchange' are ignored}}
90   #pragma omp interchange foo
91   for (int i = 0; i < 7; ++i)
92     for (int j = 0; j < 13; ++j)
93       ;
94 
95   // expected-error@+1 {{directive '#pragma omp interchange' cannot contain more than one 'permutation' clause}}
96   #pragma omp interchange permutation(2,1) permutation(2,1)
97   for (int i = 0; i < 7; ++i)
98     for (int j = 0; j < 13; ++j)
99       ;
100 
101   // expected-error@+1 {{unexpected OpenMP clause 'collapse' in directive '#pragma omp interchange'}}
102   #pragma omp interchange collapse(2)
103   for (int i = 0; i < 7; ++i)
104     for (int j = 0; j < 13; ++j)
105       ;
106 
107   {
108     // expected-error@+2 {{expected statement}}
109     #pragma omp interchange
110   }
111 
112   // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}
113   #pragma omp interchange
114   int b = 0;
115 
116   // expected-error@+3 {{statement after '#pragma omp interchange' must be a for loop}}
117   #pragma omp interchange
118   for (int i = 0; i < 7; ++i)
119     ;
120 
121   // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}
122   #pragma omp interchange
123   for (int i = 0; i < 7; ++i) {
124     int k = 3;
125     for (int j = 0; j < 7; ++j)
126       ;
127   }
128 
129   // expected-error@+3 {{expected loop invariant expression}}
130   #pragma omp interchange
131   for (int i = 0; i < 7; ++i)
132     for (int j = i; j < 7; ++j)
133       ;
134 
135   // expected-error@+3 {{expected loop invariant expression}}
136   #pragma omp interchange
137   for (int i = 0; i < 7; ++i)
138     for (int j = 0; j < i; ++j)
139       ;
140 
141   // expected-error@+3 {{expected loop invariant expression}}
142   #pragma omp interchange
143   for (int i = 0; i < 7; ++i)
144     for (int j = 0; j < i; ++j)
145       ;
146 
147   // expected-error@+6 {{expected 3 for loops after '#pragma omp for', but found only 2}}
148   // expected-note@+1 {{as specified in 'collapse' clause}}
149   #pragma omp for collapse(3)
150   #pragma omp interchange
151   for (int i = 0; i < 7; ++i)
152     for (int j = 0; j < 13; ++j)
153       ;
154 
155   // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}
156   #pragma omp interchange
157   #pragma omp for
158   for (int i = 0; i < 7; ++i)
159     ;
160 
161   // expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'j'}}
162   #pragma omp interchange
163   for (int i = 0; i < 7; ++i)
164     for (int j = 0; j/3<7; ++j)
165       ;
166 }
167 
168 
169 
170 template <typename T>
171 static void templated_func() {
172   // In a template context, but expression itself not instantiation-dependent
173 
174   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
175   #pragma omp interchange permutation(0,1)
176   for (int i = 0; i < 7; ++i)
177     for (int j = 0; j<7; ++j)
178       ;
179 
180   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
181   #pragma omp interchange permutation(1,1)
182   for (int i = 0; i < 7; ++i)
183     for (int j = 0; j<7; ++j)
184       ;
185 }
186 
187 
188 
189 template <int S>
190 static void templated_func_value_dependent() {
191   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
192   #pragma omp interchange permutation(S,S+1)
193   for (int i = 0; i < 7; ++i)
194     for (int j = 0; j<7; ++j)
195       ;
196 
197   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
198   #pragma omp interchange permutation(S+1,S+1)
199   for (int i = 0; i < 7; ++i)
200     for (int j = 0; j<7; ++j)
201       ;
202 }
203 
204 
205 template <typename T>
206 static void templated_func_type_dependent() {
207   constexpr T s = 0;
208 
209   // expected-error@+1 {{permutation index must be at least 1 and at most 2}}
210   #pragma omp interchange permutation(s,s+1)
211   for (int i = 0; i < 7; ++i)
212     for (int j = 0; j<7; ++j)
213       ;
214 
215   // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}
216   #pragma omp interchange permutation(s+1,s+1)
217   for (int i = 0; i < 7; ++i)
218     for (int j = 0; j<7; ++j)
219       ;
220 }
221 
222 
223 void template_inst() {
224   // expected-note@+1 {{in instantiation of function template specialization 'templated_func<int>' requested here}}
225   templated_func<int>();
226   // expected-note@+1 {{in instantiation of function template specialization 'templated_func_value_dependent<0>' requested here}}
227   templated_func_value_dependent<0>();
228   // expected-note@+1 {{in instantiation of function template specialization 'templated_func_type_dependent<int>' requested here}}
229   templated_func_type_dependent<int>();
230 }
231 
232