Skip to content

Commit 7dcff59

Browse files
committed
[OpenACC] Implement 'private' clause sema for loop constructs
This clause works identically as far as Sema is concerned, to the 'private' clause on compute constructs, so this simply adds tests and unblocks the ASTNode generation and Sema checking when used on loop clauses.
1 parent 8b18f2f commit 7dcff59

File tree

5 files changed

+302
-10
lines changed

5 files changed

+302
-10
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -675,10 +675,12 @@ SemaOpenACC::ActOnClause(ArrayRef<const OpenACCClause *> ExistingClauses,
675675
Clause.getEndLoc());
676676
}
677677
case OpenACCClauseKind::Private: {
678-
// Restrictions only properly implemented on 'compute' constructs, and
679-
// 'compute' constructs are the only construct that can do anything with
680-
// this yet, so skip/treat as unimplemented in this case.
681-
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()))
678+
// Restrictions only properly implemented on 'compute' and 'loop'
679+
// constructs, and 'compute'/'loop' constructs are the only construct that
680+
// can do anything with this yet, so skip/treat as unimplemented in this
681+
// case.
682+
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
683+
Clause.getDirectiveKind() != OpenACCDirectiveKind::Loop)
682684
break;
683685

684686
// ActOnVar ensured that everything is a valid variable reference, so there

clang/test/AST/ast-print-openacc-loop-construct.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,13 @@ void foo() {
4848
// CHECK-NEXT: ;
4949
#pragma acc loop auto
5050
for(;;);
51+
52+
int i;
53+
float array[5];
54+
55+
// CHECK: #pragma acc loop private(i, array[1], array, array[1:2])
56+
// CHECK-NEXT: for (;;)
57+
// CHECK-NEXT: ;
58+
#pragma acc loop private(i, array[1], array, array[1:2])
59+
for(;;);
5160
}

clang/test/SemaOpenACC/loop-construct-auto_seq_independent-clauses.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ void uses() {
106106
// expected-error@+1{{OpenACC 'present' clause is not valid on 'loop' directive}}
107107
#pragma acc loop auto present(Var)
108108
for(;;);
109-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented}}
110109
#pragma acc loop auto private(Var)
111110
for(;;);
112111
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'loop' directive}}
@@ -246,7 +245,6 @@ void uses() {
246245
// expected-error@+1{{OpenACC 'present' clause is not valid on 'loop' directive}}
247246
#pragma acc loop present(Var) auto
248247
for(;;);
249-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented}}
250248
#pragma acc loop private(Var) auto
251249
for(;;);
252250
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'loop' directive}}
@@ -387,7 +385,6 @@ void uses() {
387385
// expected-error@+1{{OpenACC 'present' clause is not valid on 'loop' directive}}
388386
#pragma acc loop independent present(Var)
389387
for(;;);
390-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented}}
391388
#pragma acc loop independent private(Var)
392389
for(;;);
393390
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'loop' directive}}
@@ -527,7 +524,6 @@ void uses() {
527524
// expected-error@+1{{OpenACC 'present' clause is not valid on 'loop' directive}}
528525
#pragma acc loop present(Var) independent
529526
for(;;);
530-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented}}
531527
#pragma acc loop private(Var) independent
532528
for(;;);
533529
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'loop' directive}}
@@ -677,7 +673,6 @@ void uses() {
677673
// expected-error@+1{{OpenACC 'present' clause is not valid on 'loop' directive}}
678674
#pragma acc loop seq present(Var)
679675
for(;;);
680-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented}}
681676
#pragma acc loop seq private(Var)
682677
for(;;);
683678
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'loop' directive}}
@@ -826,7 +821,6 @@ void uses() {
826821
// expected-error@+1{{OpenACC 'present' clause is not valid on 'loop' directive}}
827822
#pragma acc loop present(Var) seq
828823
for(;;);
829-
// expected-warning@+1{{OpenACC clause 'private' not yet implemented}}
830824
#pragma acc loop private(Var) seq
831825
for(;;);
832826
// expected-error@+1{{OpenACC 'copyout' clause is not valid on 'loop' directive}}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
struct Incomplete;
4+
enum SomeE{ A };
5+
typedef struct IsComplete {
6+
struct S { int A; } CompositeMember;
7+
int ScalarMember;
8+
float ArrayMember[5];
9+
enum SomeE EnumMember;
10+
void *PointerMember;
11+
} Complete;
12+
13+
int GlobalInt;
14+
float GlobalArray[5];
15+
short *GlobalPointer;
16+
Complete GlobalComposite;
17+
18+
void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {
19+
int LocalInt;
20+
short *LocalPointer;
21+
float LocalArray[5];
22+
Complete LocalComposite;
23+
24+
// Check Appertainment:
25+
#pragma acc loop private(LocalInt)
26+
for(;;);
27+
28+
// Valid cases:
29+
#pragma acc loop private(LocalInt, LocalPointer, LocalArray)
30+
for(;;);
31+
#pragma acc loop private(LocalArray)
32+
for(;;);
33+
#pragma acc loop private(LocalArray[:])
34+
for(;;);
35+
#pragma acc loop private(LocalArray[:5])
36+
for(;;);
37+
#pragma acc loop private(LocalArray[2:])
38+
for(;;);
39+
#pragma acc loop private(LocalArray[2:1])
40+
for(;;);
41+
#pragma acc loop private(LocalArray[2])
42+
for(;;);
43+
#pragma acc loop private(LocalComposite)
44+
for(;;);
45+
#pragma acc loop private(LocalComposite.EnumMember)
46+
for(;;);
47+
#pragma acc loop private(LocalComposite.ScalarMember)
48+
for(;;);
49+
#pragma acc loop private(LocalComposite.ArrayMember)
50+
for(;;);
51+
#pragma acc loop private(LocalComposite.ArrayMember[5])
52+
for(;;);
53+
#pragma acc loop private(LocalComposite.PointerMember)
54+
for(;;);
55+
#pragma acc loop private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)
56+
for(;;);
57+
#pragma acc loop private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)
58+
for(;;);
59+
#pragma acc loop private(LocalComposite, GlobalComposite)
60+
for(;;);
61+
#pragma acc loop private(IntParam, PointerParam, ArrayParam, CompositeParam)
62+
for(;;);
63+
#pragma acc loop private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)
64+
for(;;);
65+
66+
#pragma acc loop private(LocalArray) private(LocalArray[2])
67+
for(;;);
68+
69+
#pragma acc loop private(LocalArray, LocalArray[2])
70+
for(;;);
71+
72+
#pragma acc loop private(LocalComposite, LocalComposite.ScalarMember)
73+
for(;;);
74+
75+
#pragma acc loop private(LocalComposite.CompositeMember.A, LocalComposite.ScalarMember)
76+
for(;;);
77+
78+
#pragma acc loop private(LocalComposite.CompositeMember.A) private(LocalComposite.ScalarMember)
79+
for(;;);
80+
81+
Complete LocalComposite2;
82+
#pragma acc loop private(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember)
83+
for(;;);
84+
85+
// Invalid cases, arbitrary expressions.
86+
struct Incomplete *I;
87+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
88+
#pragma acc loop private(*I)
89+
for(;;);
90+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
91+
#pragma acc loop private(GlobalInt + IntParam)
92+
for(;;);
93+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
94+
#pragma acc loop private(+GlobalInt)
95+
for(;;);
96+
97+
// expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
98+
#pragma acc loop private(PointerParam[:])
99+
for(;;);
100+
#pragma acc loop private(PointerParam[:5])
101+
for(;;);
102+
#pragma acc loop private(PointerParam[:IntParam])
103+
for(;;);
104+
// expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
105+
#pragma acc loop private(PointerParam[2:])
106+
for(;;);
107+
#pragma acc loop private(PointerParam[2:5])
108+
for(;;);
109+
#pragma acc loop private(PointerParam[2])
110+
for(;;);
111+
#pragma acc loop private(ArrayParam[:])
112+
for(;;);
113+
#pragma acc loop private(ArrayParam[:5])
114+
for(;;);
115+
#pragma acc loop private(ArrayParam[:IntParam])
116+
for(;;);
117+
#pragma acc loop private(ArrayParam[2:])
118+
for(;;);
119+
// expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
120+
#pragma acc loop private(ArrayParam[2:5])
121+
for(;;);
122+
#pragma acc loop private(ArrayParam[2])
123+
for(;;);
124+
125+
// expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
126+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
127+
#pragma acc loop private((float*)ArrayParam[2:5])
128+
for(;;);
129+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
130+
#pragma acc loop private((float)ArrayParam[2])
131+
for(;;);
132+
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
struct Incomplete;
4+
enum SomeE{};
5+
typedef struct IsComplete {
6+
struct S { int A; } CompositeMember;
7+
int ScalarMember;
8+
float ArrayMember[5];
9+
SomeE EnumMember;
10+
char *PointerMember;
11+
} Complete;
12+
13+
int GlobalInt;
14+
float GlobalArray[5];
15+
char *GlobalPointer;
16+
Complete GlobalComposite;
17+
18+
void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) {
19+
int LocalInt;
20+
char *LocalPointer;
21+
float LocalArray[5];
22+
Complete LocalComposite;
23+
24+
// Check Appertainment:
25+
26+
#pragma acc loop private(LocalInt)
27+
for(;;);
28+
29+
// Valid cases:
30+
#pragma acc loop private(LocalInt, LocalPointer, LocalArray)
31+
for(;;);
32+
#pragma acc loop private(LocalArray)
33+
for(;;);
34+
#pragma acc loop private(LocalArray[2])
35+
for(;;);
36+
#pragma acc loop private(LocalComposite)
37+
for(;;);
38+
#pragma acc loop private(LocalComposite.EnumMember)
39+
for(;;);
40+
#pragma acc loop private(LocalComposite.ScalarMember)
41+
for(;;);
42+
#pragma acc loop private(LocalComposite.ArrayMember)
43+
for(;;);
44+
#pragma acc loop private(LocalComposite.ArrayMember[5])
45+
for(;;);
46+
#pragma acc loop private(LocalComposite.PointerMember)
47+
for(;;);
48+
#pragma acc loop private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)
49+
for(;;);
50+
#pragma acc loop private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)
51+
for(;;);
52+
#pragma acc loop private(LocalComposite, GlobalComposite)
53+
for(;;);
54+
#pragma acc loop private(IntParam, PointerParam, ArrayParam, CompositeParam) private(IntParamRef)
55+
for(;;);
56+
#pragma acc loop private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)
57+
for(;;);
58+
59+
60+
// Invalid cases, arbitrary expressions.
61+
Incomplete *I;
62+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
63+
#pragma acc loop private(*I)
64+
for(;;);
65+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
66+
#pragma acc loop private(GlobalInt + IntParam)
67+
for(;;);
68+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
69+
#pragma acc loop private(+GlobalInt)
70+
for(;;);
71+
}
72+
73+
template<typename T, unsigned I, typename V>
74+
void TemplUses(T t, T (&arrayT)[I], V TemplComp) {
75+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
76+
#pragma acc loop private(+t)
77+
for(;;);
78+
79+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
80+
#pragma acc loop private(+I)
81+
for(;;);
82+
83+
// NTTP's are only valid if it is a reference to something.
84+
// expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
85+
// expected-note@#TEMPL_USES_INST{{in instantiation of}}
86+
#pragma acc loop private(I)
87+
for(;;);
88+
89+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
90+
#pragma acc loop private(t, I)
91+
for(;;);
92+
93+
#pragma acc loop private(arrayT)
94+
for(;;);
95+
96+
#pragma acc loop private(TemplComp)
97+
for(;;);
98+
99+
#pragma acc loop private(TemplComp.PointerMember[5])
100+
for(;;);
101+
102+
#pragma acc loop private(TemplComp.PointerMember[5]) private(TemplComp)
103+
for(;;);
104+
105+
int *Pointer;
106+
#pragma acc loop private(Pointer[:I])
107+
for(;;);
108+
#pragma acc loop private(Pointer[:t])
109+
for(;;);
110+
// expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
111+
#pragma acc loop private(Pointer[1:])
112+
for(;;);
113+
}
114+
115+
template<unsigned I, auto &NTTP_REF>
116+
void NTTP() {
117+
// NTTP's are only valid if it is a reference to something.
118+
// expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
119+
// expected-note@#NTTP_INST{{in instantiation of}}
120+
#pragma acc loop private(I)
121+
for(;;);
122+
123+
#pragma acc loop private(NTTP_REF)
124+
for(;;);
125+
}
126+
127+
struct S {
128+
int ThisMember;
129+
int ThisMemberArray[5];
130+
131+
void foo();
132+
};
133+
134+
void S::foo() {
135+
#pragma acc loop private(ThisMember, this->ThisMemberArray[1])
136+
for(;;);
137+
138+
#pragma acc loop private(ThisMemberArray[1:2])
139+
for(;;);
140+
141+
#pragma acc loop private(this)
142+
for(;;);
143+
144+
#pragma acc loop private(ThisMember, this->ThisMember)
145+
for(;;);
146+
}
147+
148+
void Inst() {
149+
static constexpr int NTTP_REFed = 1;
150+
int i;
151+
int Arr[5];
152+
Complete C;
153+
TemplUses(i, Arr, C); // #TEMPL_USES_INST
154+
NTTP<5, NTTP_REFed>(); // #NTTP_INST
155+
}

0 commit comments

Comments
 (0)