Skip to content

Commit 0f90dac

Browse files
committed
[OpenMP 6.0] Allow only byref arguments with need_device_addr modifier on adjust_args clause
If the need_device_addr adjust-op modifier is present, each list item that appears in the clause must refer to an argument in the declaration of the function variant that has a reference type. Reference: OpenMP 6.0 [Sec 9.6.2, page 332, line 31-33, adjust_args clause, Restrictions] PR Link: #149586
1 parent 7c57b55 commit 0f90dac

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,6 +1594,9 @@ def err_omp_unknown_adjust_args_op
15941594
def err_omp_declare_variant_wrong_clause : Error<
15951595
"expected %select{'match'|'match', 'adjust_args', or 'append_args'}0 clause "
15961596
"on 'omp declare variant' directive">;
1597+
def err_omp_non_by_ref_need_device_addr_modifier_argument
1598+
: Error<"expected reference type argument on 'adjust_args' clause with "
1599+
"'need_device_addr' modifier">;
15971600
def err_omp_declare_variant_duplicate_nested_trait : Error<
15981601
"nested OpenMP context selector contains duplicated trait '%0'"
15991602
" in selector '%1' and set '%2' with different score">;

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7612,6 +7612,23 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective(
76127612
return;
76137613
}
76147614

7615+
// OpenMP 6.0 [9.6.2 (page 332, line 31-33, adjust_args clause, Restrictions]
7616+
// If the `need_device_addr` adjust-op modifier is present, each list item
7617+
// that appears in the clause must refer to an argument in the declaration of
7618+
// the function variant that has a reference type
7619+
if (getLangOpts().OpenMP >= 60) {
7620+
for (Expr *E : AdjustArgsNeedDeviceAddr) {
7621+
E = E->IgnoreParenImpCasts();
7622+
if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
7623+
if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
7624+
if (!VD->getType()->isReferenceType())
7625+
Diag(E->getExprLoc(),
7626+
diag::err_omp_non_by_ref_need_device_addr_modifier_argument);
7627+
}
7628+
}
7629+
}
7630+
}
7631+
76157632
auto *NewAttr = OMPDeclareVariantAttr::CreateImplicit(
76167633
getASTContext(), VariantRef, &TI,
76177634
const_cast<Expr **>(AdjustArgsNothing.data()), AdjustArgsNothing.size(),

clang/test/OpenMP/declare_variant_clauses_ast_print.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@
3838
#ifndef HEADER
3939
#define HEADER
4040

41-
void foo_v1(float *AAA, float *BBB, int *I) {return;}
42-
void foo_v2(float *AAA, float *BBB, int *I) {return;}
43-
void foo_v3(float *AAA, float *BBB, int *I) {return;}
41+
void foo_v1(float *AAA, float *BBB, int &CCC, int *I) {return;}
42+
void foo_v2(float *AAA, float *BBB, int &CCC, int *I) {return;}
43+
void foo_v3(float *AAA, float *BBB, int &CCC, int *I) {return;}
4444

45-
//DUMP: FunctionDecl{{.*}} foo 'void (float *, float *, int *)'
45+
//DUMP: FunctionDecl{{.*}} foo 'void (float *, float *, int &, int *)'
4646
//DUMP: OMPDeclareVariantAttr{{.*}}device={arch(x86, x86_64)}
4747
//DUMP: DeclRefExpr{{.*}}Function{{.*}}foo_v3
4848
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'I'
@@ -54,9 +54,9 @@ void foo_v3(float *AAA, float *BBB, int *I) {return;}
5454
//DUMP: DeclRefExpr{{.*}}Function{{.*}}foo_v1
5555
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'AAA'
5656
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'BBB'
57-
//PRINT: #pragma omp declare variant(foo_v3) match(construct={dispatch}, device={arch(x86, x86_64)}) adjust_args(nothing:I) adjust_args(need_device_ptr:BBB) adjust_args(need_device_addr:AAA)
57+
//PRINT: #pragma omp declare variant(foo_v3) match(construct={dispatch}, device={arch(x86, x86_64)}) adjust_args(nothing:I) adjust_args(need_device_ptr:BBB) adjust_args(need_device_addr:CCC)
5858

59-
//PRINT: #pragma omp declare variant(foo_v2) match(construct={dispatch}, device={arch(ppc)}) adjust_args(need_device_ptr:AAA) adjust_args(need_device_addr:BBB)
59+
//PRINT: #pragma omp declare variant(foo_v2) match(construct={dispatch}, device={arch(ppc)}) adjust_args(need_device_ptr:AAA) adjust_args(need_device_addr:CCC)
6060

6161
//PRINT: omp declare variant(foo_v1) match(construct={dispatch}, device={arch(arm)}) adjust_args(need_device_ptr:AAA,BBB)
6262

@@ -67,33 +67,33 @@ void foo_v3(float *AAA, float *BBB, int *I) {return;}
6767
#pragma omp declare variant(foo_v2) \
6868
match(construct={dispatch}, device={arch(ppc)}), \
6969
adjust_args(need_device_ptr:AAA) \
70-
adjust_args(need_device_addr:BBB)
70+
adjust_args(need_device_addr:CCC)
7171

7272
#pragma omp declare variant(foo_v3) \
7373
adjust_args(need_device_ptr:BBB) adjust_args(nothing:I) \
74-
adjust_args(need_device_addr:AAA) \
74+
adjust_args(need_device_addr:CCC) \
7575
match(construct={dispatch}, device={arch(x86,x86_64)})
7676

77-
void foo(float *AAA, float *BBB, int *I) {return;}
77+
void foo(float *AAA, float *BBB, int &CCC, int *I) {return;}
7878

79-
void Foo_Var(float *AAA, float *BBB, float *CCC) {return;}
79+
void Foo_Var(float *AAA, float *BBB, float *&CCC) {return;}
8080

8181
#pragma omp declare variant(Foo_Var) \
8282
match(construct={dispatch}, device={arch(x86_64)}) \
8383
adjust_args(need_device_ptr:AAA) adjust_args(nothing:BBB) \
8484
adjust_args(need_device_addr:CCC)
8585
template<typename T>
86-
void Foo(T *AAA, T *BBB, T *CCC) {return;}
86+
void Foo(T *AAA, T *BBB, T *&CCC) {return;}
8787

8888
//PRINT: #pragma omp declare variant(Foo_Var) match(construct={dispatch}, device={arch(x86_64)}) adjust_args(nothing:BBB) adjust_args(need_device_ptr:AAA) adjust_args(need_device_addr:CCC)
89-
//DUMP: FunctionDecl{{.*}} Foo 'void (T *, T *, T *)'
89+
//DUMP: FunctionDecl{{.*}} Foo 'void (T *, T *, T *&)'
9090
//DUMP: OMPDeclareVariantAttr{{.*}}device={arch(x86_64)}
9191
//DUMP: DeclRefExpr{{.*}}Function{{.*}}Foo_Var
9292
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'BBB'
9393
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'AAA'
9494
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'CCC'
9595
//
96-
//DUMP: FunctionDecl{{.*}} Foo 'void (float *, float *, float *)'
96+
//DUMP: FunctionDecl{{.*}} Foo 'void (float *, float *, float *&)'
9797
//DUMP: OMPDeclareVariantAttr{{.*}}device={arch(x86_64)}
9898
//DUMP: DeclRefExpr{{.*}}Function{{.*}}Foo_Var
9999
//DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'BBB'

clang/test/OpenMP/declare_variant_clauses_messages.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ void foo_v1(float *AAA, float *BBB, int *I) { return; }
9191
void foo_v2(float *AAA, float *BBB, int *I) { return; }
9292
void foo_v3(float *AAA, float *BBB, int *I) { return; }
9393
void foo_v4(float *AAA, float *BBB, int *I, omp_interop_t IOp) { return; }
94+
void foo_v5(float *AAA, float *BBB, int I) { return; }
9495

9596
#if _OPENMP >= 202011 // At least OpenMP 5.1
9697
void vararg_foo(const char *fmt, omp_interop_t it, ...);
@@ -129,6 +130,11 @@ void vararg_bar2(const char *fmt) { return; }
129130
adjust_args(nothing:J) \
130131
match(construct={dispatch}, device={arch(x86,x86_64)})
131132

133+
// expected-error@+2 {{expected reference type argument on 'adjust_args' clause with 'need_device_addr' modifier}}
134+
#pragma omp declare variant(foo_v1) \
135+
adjust_args(need_device_addr:AAA) \
136+
match(construct={dispatch}, device={arch(x86,x86_64)})
137+
132138
// expected-error@+2 {{expected reference to one of the parameters of function 'foo'}}
133139
#pragma omp declare variant(foo_v3) \
134140
adjust_args(nothing:Other) \
@@ -218,6 +224,12 @@ void vararg_bar2(const char *fmt) { return; }
218224

219225
void foo(float *AAA, float *BBB, int *I) { return; }
220226

227+
// expected-error@+2 {{expected reference type argument on 'adjust_args' clause with 'need_device_addr' modifier}}
228+
#pragma omp declare variant(foo_v5) \
229+
adjust_args(need_device_addr:I) \
230+
match(construct={dispatch}, device={arch(x86,x86_64)})
231+
void foo5(float *AAA, float *BBB, int I) { return; }
232+
221233
#endif // NO_INTEROP_T_DEF
222234

223235
#ifdef C

0 commit comments

Comments
 (0)