Skip to content

Commit 3246c44

Browse files
authored
[OpenMP][Clang] Enable inscan modifier for generic datatypes (#82220)
This patch fixes the #67002 ([OpenMP][Clang] Scan Directive not supported for Generic types). It disables the Sema checks/analysis that are run on the helper arrays which go into the implementation of the `omp scan` directive until the template instantiation happens. Grateful to @alexey-bataev for suggesting these changes.
1 parent 230b06b commit 3246c44

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

clang/lib/Sema/SemaOpenMP.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -4962,7 +4962,8 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
49624962
if (RC->getModifier() != OMPC_REDUCTION_inscan)
49634963
continue;
49644964
for (Expr *E : RC->copy_array_temps())
4965-
MarkDeclarationsReferencedInExpr(E);
4965+
if (E)
4966+
MarkDeclarationsReferencedInExpr(E);
49664967
}
49674968
if (auto *AC = dyn_cast<OMPAlignedClause>(C)) {
49684969
for (Expr *E : AC->varlists())

clang/test/OpenMP/scan_ast_print.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ T tmain(T argc) {
1717
static T a;
1818
#pragma omp for reduction(inscan, +: a)
1919
for (int i = 0; i < 10; ++i) {
20+
#pragma omp scan inclusive(a)
21+
}
22+
#pragma omp parallel for reduction(inscan, +:a)
23+
for (int i = 0; i < 10; ++i) {
2024
#pragma omp scan inclusive(a)
2125
}
2226
return a + argc;
@@ -25,15 +29,29 @@ T tmain(T argc) {
2529
// CHECK-NEXT: #pragma omp for reduction(inscan, +: a)
2630
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
2731
// CHECK-NEXT: #pragma omp scan inclusive(a){{$}}
32+
33+
// CHECK: #pragma omp parallel for reduction(inscan, +: a)
34+
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
35+
// CHECK-NEXT: #pragma omp scan inclusive(a){{$}}
36+
2837
// CHECK: static int a;
2938
// CHECK-NEXT: #pragma omp for reduction(inscan, +: a)
3039
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
3140
// CHECK-NEXT: #pragma omp scan inclusive(a)
41+
42+
// CHECK: #pragma omp parallel for reduction(inscan, +: a)
43+
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
44+
// CHECK-NEXT: #pragma omp scan inclusive(a)
45+
3246
// CHECK: static char a;
3347
// CHECK-NEXT: #pragma omp for reduction(inscan, +: a)
3448
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
3549
// CHECK-NEXT: #pragma omp scan inclusive(a)
3650

51+
// CHECK: #pragma omp parallel for reduction(inscan, +: a)
52+
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
53+
// CHECK-NEXT: #pragma omp scan inclusive(a)
54+
3755
int main(int argc, char **argv) {
3856
static int a;
3957
// CHECK: static int a;

0 commit comments

Comments
 (0)