Skip to content

Commit 9237ce4

Browse files
authored
[OpenMP 5.2] Deprecate old syntax of linear clause (llvm#70152)
The syntax of the linear clause that specifies its argument and linear-modifier as linear-modifier(list) was deprecated since OpenMP 5.2 and the step modifier was added for specifying the linear step. Reference: OpenMP 5.2 Spec, Page 627, Line 15
1 parent 78dcd01 commit 9237ce4

10 files changed

+130
-101
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,8 @@ def warn_omp_extra_tokens_at_eol : Warning<
13501350
InGroup<ExtraTokens>;
13511351
def err_omp_multiple_step_or_linear_modifier : Error<
13521352
"multiple %select{'step size'|'linear modifier'}0 found in linear clause">;
1353+
def err_omp_deprecate_old_syntax: Error<
1354+
"old syntax '%0' on '%1' clause was deprecated, use new syntax '%2'">;
13531355
def warn_pragma_expected_colon_r_paren : Warning<
13541356
"missing ':' or ')' after %0 - ignoring">, InGroup<IgnoredPragmas>;
13551357
def err_omp_unknown_directive : Error<

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4573,6 +4573,10 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
45734573
Data.ExtraModifierLoc = ConsumeToken();
45744574
LinearT.consumeOpen();
45754575
NeedRParenForLinear = true;
4576+
if (getLangOpts().OpenMP >= 52)
4577+
Diag(Data.ExtraModifierLoc, diag::err_omp_deprecate_old_syntax)
4578+
<< "linear-modifier(list)" << getOpenMPClauseName(Kind)
4579+
<< "linear(list: [linear-modifier,] step(step-size))";
45764580
}
45774581
} else if (Kind == OMPC_lastprivate) {
45784582
// Try to parse modifier if any.

clang/test/OpenMP/for_ast_print.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ class S7 : public T {
4848
#pragma omp for lastprivate(a) lastprivate(this->a) lastprivate(T::a)
4949
for (int k = 0; k < a.a; ++k)
5050
++this->a.a;
51+
#if defined(OMP52)
52+
#pragma omp for linear(c: val)
53+
#else
5154
#pragma omp for linear(val(c))
55+
#endif
5256
for (int k = 0; k < a.a; ++k)
5357
++this->a.a;
5458
}
@@ -59,7 +63,11 @@ class S7 : public T {
5963
#pragma omp for lastprivate(a) lastprivate(this->a)
6064
for (int k = 0; k < s.a.a; ++k)
6165
++s.a.a;
66+
#if defined(OMP52)
67+
#pragma omp for linear(this->b: uval)
68+
#else
6269
#pragma omp for linear(uval(this->b))
70+
#endif
6371
for (int k = 0; k < s.a.a; ++k)
6472
++s.a.a;
6573
return *this;
@@ -87,7 +95,11 @@ class S8 : public S7<S> {
8795
#pragma omp for lastprivate(a) lastprivate(this->a) lastprivate(S7<S>::a)
8896
for (int k = 0; k < a.a; ++k)
8997
++this->a.a;
98+
#if defined(OMP52)
99+
#pragma omp for linear(S7<S>::d: ref)
100+
#else
90101
#pragma omp for linear(ref(S7<S>::d))
102+
#endif
91103
for (int k = 0; k < a.a; ++k)
92104
++this->a.a;
93105
}

clang/test/OpenMP/for_linear_messages.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ int main(int argc, char **argv) {
215215
int i;
216216
#pragma omp for linear(i)
217217
for (int k = 0; k < argc; ++k) ++k;
218+
#pragma omp for linear(val(i)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
219+
for (int k = 0; k < argc; ++k) ++k;
218220
#ifdef OMP52
219221
#pragma omp for linear(i : step(4))
220222
#else

clang/test/OpenMP/masked_taskloop_simd_linear_messages.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,19 +131,19 @@ template<class I, class C> int foomain(I argc, C **argv) {
131131
for (int k = 0; k < argc; ++k) ++k;
132132
#pragma omp masked taskloop simd linear (val // expected-error {{use of undeclared identifier 'val'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
133133
for (int k = 0; k < argc; ++k) ++k;
134-
#pragma omp masked taskloop simd linear (uval( // expected-error {{expected expression}} expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
134+
#pragma omp masked taskloop simd linear (uval( // expected-error {{expected expression}} expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
135135
for (int k = 0; k < argc; ++k) ++k;
136-
#pragma omp masked taskloop simd linear (ref() // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
136+
#pragma omp masked taskloop simd linear (ref() // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
137137
for (int k = 0; k < argc; ++k) ++k;
138-
#pragma omp masked taskloop simd linear (foo() // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
138+
#pragma omp masked taskloop simd linear (foo() // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
139139
for (int k = 0; k < argc; ++k) ++k;
140140
#pragma omp masked taskloop simd linear () // expected-error {{expected expression}}
141141
for (int k = 0; k < argc; ++k) ++k;
142142
#pragma omp masked taskloop simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
143143
for (int k = 0; k < argc; ++k) ++k;
144144
#pragma omp masked taskloop simd linear (val argc // expected-error {{use of undeclared identifier 'val'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
145145
for (int k = 0; k < argc; ++k) ++k;
146-
#pragma omp masked taskloop simd linear (val(argc, // expected-error {{expected expression}} expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
146+
#pragma omp masked taskloop simd linear (val(argc, // expected-error {{expected expression}} expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
147147
for (int k = 0; k < argc; ++k) ++k;
148148
#pragma omp masked taskloop simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
149149
for (int k = 0; k < argc; ++k) ++k;
@@ -164,11 +164,11 @@ template<class I, class C> int foomain(I argc, C **argv) {
164164
for (int k = 0; k < argc; ++k) ++k;
165165
#pragma omp masked taskloop simd linear (argv[1]) // expected-error {{expected variable name}}
166166
for (int k = 0; k < argc; ++k) ++k;
167-
#pragma omp masked taskloop simd linear(ref(e, g)) // expected-error 2 {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'ref'}}
167+
#pragma omp masked taskloop simd linear(ref(e, g)) // expected-error 2 {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'ref'}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
168168
for (int k = 0; k < argc; ++k) ++k;
169169
#pragma omp masked taskloop simd linear(h, z) // expected-error {{threadprivate or thread local variable cannot be linear}}
170170
for (int k = 0; k < argc; ++k) ++k;
171-
#pragma omp masked taskloop simd linear(uval(i)) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
171+
#pragma omp masked taskloop simd linear(uval(i)) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}} omp52 {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
172172
for (int k = 0; k < argc; ++k) ++k;
173173
#pragma omp parallel
174174
{
@@ -177,9 +177,9 @@ template<class I, class C> int foomain(I argc, C **argv) {
177177
#pragma omp masked taskloop simd allocate(omp_thread_mem_alloc: v) linear(v:i) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'masked taskloop simd' directive}}
178178
for (int k = 0; k < argc; ++k) { i = k; v += i; }
179179
}
180-
#pragma omp masked taskloop simd linear(ref(j))
180+
#pragma omp masked taskloop simd linear(ref(j)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
181181
for (int k = 0; k < argc; ++k) ++k;
182-
#pragma omp masked taskloop simd linear(uval(j))
182+
#pragma omp masked taskloop simd linear(uval(j)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
183183
for (int k = 0; k < argc; ++k) ++k;
184184
int v = 0;
185185
#pragma omp masked taskloop simd linear(v:j)
@@ -201,13 +201,13 @@ void linear_modifiers(int argc) {
201201
int &f = argc;
202202
#pragma omp masked taskloop simd linear(f)
203203
for (int k = 0; k < argc; ++k) ++k;
204-
#pragma omp masked taskloop simd linear(val(f))
204+
#pragma omp masked taskloop simd linear(val(f)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
205205
for (int k = 0; k < argc; ++k) ++k;
206-
#pragma omp masked taskloop simd linear(uval(f))
206+
#pragma omp masked taskloop simd linear(uval(f)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
207207
for (int k = 0; k < argc; ++k) ++k;
208-
#pragma omp masked taskloop simd linear(ref(f))
208+
#pragma omp masked taskloop simd linear(ref(f)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
209209
for (int k = 0; k < argc; ++k) ++k;
210-
#pragma omp masked taskloop simd linear(foo(f)) // expected-error {{expected one of 'ref', val' or 'uval' modifiers}}
210+
#pragma omp masked taskloop simd linear(foo(f)) // expected-error {{expected one of 'ref', val' or 'uval' modifiers}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
211211
for (int k = 0; k < argc; ++k) ++k;
212212
}
213213

@@ -233,9 +233,9 @@ int main(int argc, char **argv) {
233233
for (int k = 0; k < argc; ++k) ++k;
234234
#pragma omp masked taskloop simd linear (val // expected-error {{use of undeclared identifier 'val'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
235235
for (int k = 0; k < argc; ++k) ++k;
236-
#pragma omp masked taskloop simd linear (ref()) // expected-error {{expected expression}}
236+
#pragma omp masked taskloop simd linear (ref()) // expected-error {{expected expression}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
237237
for (int k = 0; k < argc; ++k) ++k;
238-
#pragma omp masked taskloop simd linear (foo()) // expected-error {{expected expression}}
238+
#pragma omp masked taskloop simd linear (foo()) // expected-error {{expected expression}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
239239
for (int k = 0; k < argc; ++k) ++k;
240240
#pragma omp masked taskloop simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
241241
for (int k = 0; k < argc; ++k) ++k;
@@ -253,6 +253,7 @@ int main(int argc, char **argv) {
253253
for (int k = 0; k < argc; ++k) ++k;
254254
#pragma omp masked taskloop simd linear (argv[1]) // expected-error {{expected variable name}}
255255
for (int k = 0; k < argc; ++k) ++k;
256+
// omp52-error@+3 {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
256257
// expected-error@+2 {{argument of a linear clause should be of integral or pointer type, not 'S4'}}
257258
// expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S5'}}
258259
#pragma omp masked taskloop simd linear(val(e, g))
@@ -262,12 +263,12 @@ int main(int argc, char **argv) {
262263
#pragma omp parallel
263264
{
264265
int i;
265-
#pragma omp masked taskloop simd linear(val(i))
266+
#pragma omp masked taskloop simd linear(val(i)) // omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
266267
for (int k = 0; k < argc; ++k) ++k;
267268
#ifdef OMP52
268269
#pragma omp masked taskloop simd linear(i : uval, step(4)) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
269270
#else
270-
#pragma omp masked taskloop simd linear(uval(i) : 4) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
271+
#pragma omp masked taskloop simd linear(uval(i) : 4) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}} omp52-error {{old syntax 'linear-modifier(list)' on 'linear' clause was deprecated, use new syntax 'linear(list: [linear-modifier,] step(step-size))'}}
271272
#endif
272273
for (int k = 0; k < argc; ++k) { ++k; i += 4; }
273274
}

0 commit comments

Comments
 (0)