Skip to content

Commit e716b02

Browse files
mdfazlaymikerice1969
authored andcommitted
[OpenMP 5.2] Deprecate 'destroy' clause without argument for 'depobj' construct
Deprecate and diagnose uses of the 'destroy' clauses without an argument in 'omp depobj' directives. Differential Revision: https://reviews.llvm.org/D143021
1 parent b1d8205 commit e716b02

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,9 @@ def err_omp_map_type_modifier_missing : Error<
13691369
"missing map type modifier">;
13701370
def err_omp_declare_simd_inbranch_notinbranch : Error<
13711371
"unexpected '%0' clause, '%1' is specified already">;
1372+
def err_omp_expected_clause_argument
1373+
: Error<"expected '%0' clause with an argument on '#pragma omp %1' "
1374+
"construct">;
13721375
def err_expected_end_declare_target_or_variant : Error<
13731376
"expected '#pragma omp end declare %select{target|variant}0'">;
13741377
def err_expected_begin_declare_variant

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17662,6 +17662,13 @@ OMPClause *Sema::ActOnOpenMPDestroyClause(Expr *InteropVar,
1766217662
SourceLocation LParenLoc,
1766317663
SourceLocation VarLoc,
1766417664
SourceLocation EndLoc) {
17665+
if (!InteropVar && LangOpts.OpenMP >= 52 &&
17666+
DSAStack->getCurrentDirective() == OMPD_depobj) {
17667+
Diag(StartLoc, diag::err_omp_expected_clause_argument)
17668+
<< getOpenMPClauseName(OMPC_destroy)
17669+
<< getOpenMPDirectiveName(OMPD_depobj);
17670+
return nullptr;
17671+
}
1766517672
if (InteropVar &&
1766617673
!isValidInteropVariable(*this, InteropVar, VarLoc, OMPC_destroy))
1766717674
return nullptr;

clang/test/OpenMP/depobj_messages.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
// RUN: -ferror-limit 100 %s -Wuninitialized
33
// RUN: %clang_cc1 -verify=expected,omp51 -fopenmp -fopenmp-version=51 \
44
// RUN: -ferror-limit 100 %s -Wuninitialized
5+
// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 \
6+
// RUN: -ferror-limit 100 %s -Wuninitialized
57

68
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 \
79
// RUN: -ferror-limit 100 %s -Wuninitialized
810
// RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd -fopenmp-version=51 \
911
// RUN: -ferror-limit 100 %s -Wuninitialized
12+
// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=52 \
13+
// RUN: -ferror-limit 100 %s -Wuninitialized
1014

1115
struct S1 { // expected-note 2 {{declared here}}
1216
int a;
@@ -27,7 +31,7 @@ T tmain(T argc) {
2731
#pragma omp depobj(x) untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
2832
#pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
2933
if (argc)
30-
#pragma omp depobj(x) destroy // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
34+
#pragma omp depobj(x) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
3135
if (argc) {
3236
#pragma omp depobj(x) depend(in:s)
3337
}
@@ -148,24 +152,24 @@ label1 : {
148152
#pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
149153
;
150154
#pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}}
151-
#pragma omp depobj(x) depend(source: x) // omp51-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
155+
#pragma omp depobj(x) depend(source: x) // omp52-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp51-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
152156
#pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}}
153-
#pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
154-
#pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
155-
#pragma omp depobj(x) destroy destroy // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}}
157+
#pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} omp52-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
158+
#pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} omp52-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
159+
#pragma omp depobj(x) destroy destroy //omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp50-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}} // omp52-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}} omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}}
156160
#pragma omp depobj(x) update(in) update(in) // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'update' clause}}
157-
#pragma omp depobj(x) depend(in: argc) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
158-
#pragma omp depobj(x) destroy depend(in: argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
161+
#pragma omp depobj(x) depend(in: argc) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} omp50-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
162+
#pragma omp depobj(x) destroy depend(in: argc) // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} omp50-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
159163
#pragma omp depobj(x) depend(in: argc) update(mutexinoutset) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
160-
#pragma omp depobj(x) update(inout) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
164+
#pragma omp depobj(x) update(inout) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} omp50-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
161165
#pragma omp depobj(x) (x) depend(in: x) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
162166
#pragma omp depobj(x) (x) update(in) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
163167
#pragma omp depobj(x) depend(in: argc) depend(out:argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
164168
#pragma omp depend(out:x) depobj(x) // expected-error {{expected an OpenMP directive}}
165169
#pragma omp destroy depobj(x) // expected-error {{expected an OpenMP directive}}
166170
#pragma omp update(out) depobj(x) // expected-error {{expected an OpenMP directive}}
167171
#pragma omp depobj depend(in:x) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
168-
#pragma omp depobj destroy (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
172+
#pragma omp depobj destroy (x) // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
169173
#pragma omp depobj update(in) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
170174
return tmain(argc); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}}
171175
}

0 commit comments

Comments
 (0)