Skip to content

Commit 9359625

Browse files
committed
[OpenACC] 'create' clause sema for data/enter data constructs
Enable and add tests for 'create' on a data or enter data construct.
1 parent 62bdb85 commit 9359625

File tree

4 files changed

+208
-8
lines changed

4 files changed

+208
-8
lines changed

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -996,12 +996,6 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitCopyOutClause(
996996

997997
OpenACCClause *SemaOpenACCClauseVisitor::VisitCreateClause(
998998
SemaOpenACC::OpenACCParsedClause &Clause) {
999-
// Restrictions only properly implemented on 'compute'/'combined' constructs,
1000-
// and 'compute'/'combined' constructs are the only construct that can do
1001-
// anything with this yet, so skip/treat as unimplemented in this case.
1002-
if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
1003-
!isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
1004-
return isNotImplemented();
1005999
// ActOnVar ensured that everything is a valid variable reference, so there
10061000
// really isn't anything to do here. GCC does some duplicate-finding, though
10071001
// it isn't apparent in the standard where this is justified.
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -ast-dump | FileCheck %s
2+
3+
// Test this with PCH.
4+
// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -emit-pch -o %t %s
5+
// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -include-pch %t -ast-dump-all | FileCheck %s
6+
7+
#ifndef PCH_HELPER
8+
#define PCH_HELPER
9+
10+
int Global;
11+
short GlobalArray[5];
12+
void NormalUses(float *PointerParam) {
13+
// CHECK: FunctionDecl{{.*}}NormalUses
14+
// CHECK: ParmVarDecl
15+
// CHECK-NEXT: CompoundStmt
16+
17+
#pragma acc data create(GlobalArray) pcreate(zero:PointerParam[Global]) present_or_create(Global)
18+
;
19+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
20+
// CHECK-NEXT: create clause
21+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
22+
// CHECK-NEXT: pcreate clause : zero
23+
// CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
24+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
25+
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
26+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
27+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
28+
// CHECK-NEXT: present_or_create clause
29+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
30+
// CHECK-NEXT: NullStmt
31+
32+
#pragma acc enter data create(GlobalArray) pcreate(zero:PointerParam[Global]) present_or_create(Global)
33+
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
34+
// CHECK-NEXT: create clause
35+
// CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
36+
// CHECK-NEXT: pcreate clause : zero
37+
// CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
38+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
39+
// CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
40+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
41+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
42+
// CHECK-NEXT: present_or_create clause
43+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
44+
}
45+
46+
template<auto &NTTP, typename T, typename U>
47+
void TemplUses(T t, U u) {
48+
// CHECK-NEXT: FunctionTemplateDecl
49+
// CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP
50+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T
51+
// CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U
52+
// CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'
53+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
54+
// CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
55+
// CHECK-NEXT: CompoundStmt
56+
57+
#pragma acc data create(t) pcreate(zero: NTTP, u) present_or_create(u[0:t])
58+
;
59+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
60+
// CHECK-NEXT: create clause
61+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
62+
// CHECK-NEXT: pcreate clause : zero
63+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
64+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
65+
// CHECK-NEXT: present_or_create clause
66+
// CHECK-NEXT: ArraySectionExpr
67+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
68+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
69+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
70+
// CHECK-NEXT: NullStmt
71+
72+
#pragma acc enter data create(t) pcreate(zero: NTTP, u) present_or_create(u[0:t])
73+
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
74+
// CHECK-NEXT: create clause
75+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
76+
// CHECK-NEXT: pcreate clause : zero
77+
// CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
78+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
79+
// CHECK-NEXT: present_or_create clause
80+
// CHECK-NEXT: ArraySectionExpr
81+
// CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
82+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
83+
// CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
84+
85+
// Check the instantiated versions of the above.
86+
// CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *)' implicit_instantiation
87+
// CHECK-NEXT: TemplateArgument decl
88+
// CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'
89+
// CHECK-NEXT: TemplateArgument type 'int'
90+
// CHECK-NEXT: BuiltinType{{.*}} 'int'
91+
// CHECK-NEXT: TemplateArgument type 'int *'
92+
// CHECK-NEXT: PointerType{{.*}} 'int *'
93+
// CHECK-NEXT: BuiltinType{{.*}} 'int'
94+
// CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'
95+
// CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *'
96+
// CHECK-NEXT: CompoundStmt
97+
98+
// CHECK-NEXT: OpenACCDataConstruct{{.*}} data
99+
// CHECK-NEXT: create clause
100+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
101+
// CHECK-NEXT: pcreate clause : zero
102+
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
103+
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
104+
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
105+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
106+
// CHECK-NEXT: present_or_create clause
107+
// CHECK-NEXT: ArraySectionExpr
108+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
109+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
110+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
111+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
112+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
113+
// CHECK-NEXT: NullStmt
114+
115+
// CHECK-NEXT: OpenACCEnterDataConstruct{{.*}} enter data
116+
// CHECK-NEXT: create clause
117+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
118+
// CHECK-NEXT: pcreate clause : zero
119+
// CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
120+
// CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
121+
// CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
122+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
123+
// CHECK-NEXT: present_or_create clause
124+
// CHECK-NEXT: ArraySectionExpr
125+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
126+
// CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
127+
// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
128+
// CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
129+
// CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
130+
}
131+
132+
void Inst() {
133+
static constexpr unsigned CEVar = 1;
134+
int i;
135+
TemplUses<CEVar>(i, &i);
136+
}
137+
#endif
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// RUN: %clang_cc1 %s -fopenacc -verify
2+
3+
typedef struct IsComplete {
4+
struct S { int A; } CompositeMember;
5+
int ScalarMember;
6+
float ArrayMember[5];
7+
void *PointerMember;
8+
} Complete;
9+
void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {
10+
int LocalInt;
11+
short *LocalPointer;
12+
float LocalArray[5];
13+
Complete LocalComposite;
14+
// Check Appertainment:
15+
#pragma acc data create(LocalInt)
16+
;
17+
#pragma acc enter data create(LocalInt)
18+
19+
// expected-warning@+1{{OpenACC clause name 'pcreate' is a deprecated clause name and is now an alias for 'create'}}
20+
#pragma acc data pcreate(LocalInt)
21+
;
22+
23+
// expected-warning@+1{{OpenACC clause name 'present_or_create' is a deprecated clause name and is now an alias for 'create'}}
24+
#pragma acc data present_or_create(LocalInt)
25+
;
26+
27+
// Valid cases:
28+
#pragma acc data create(LocalInt, LocalPointer, LocalArray)
29+
;
30+
#pragma acc data create(LocalArray[2:1])
31+
;
32+
#pragma acc data create(zero:LocalArray[2:1])
33+
;
34+
35+
#pragma acc data create(LocalComposite.ScalarMember, LocalComposite.ScalarMember)
36+
;
37+
38+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
39+
#pragma acc data create(1 + IntParam)
40+
;
41+
42+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
43+
#pragma acc data create(+IntParam)
44+
;
45+
46+
// expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
47+
#pragma acc data create(PointerParam[2:])
48+
;
49+
50+
// expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
51+
#pragma acc data create(ArrayParam[2:5])
52+
;
53+
54+
// expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
55+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
56+
#pragma acc data create((float*)ArrayParam[2:5])
57+
;
58+
// expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
59+
#pragma acc data create((float)ArrayParam[2])
60+
;
61+
// expected-error@+2{{invalid tag 'invalid' on 'create' clause}}
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 data create(invalid:(float)ArrayParam[2])
64+
;
65+
66+
// expected-error@+1{{OpenACC 'create' clause is not valid on 'exit data' directive}}
67+
#pragma acc exit data create(LocalInt)
68+
// expected-error@+1{{OpenACC 'pcreate' clause is not valid on 'host_data' directive}}
69+
#pragma acc host_data pcreate(LocalInt)
70+
;
71+
}

clang/test/SemaOpenACC/data-construct.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ void AtLeastOneOf() {
2929
// expected-warning@+1{{OpenACC clause 'copyout' not yet implemented}}
3030
#pragma acc data copyout(Var)
3131
;
32-
// expected-warning@+1{{OpenACC clause 'create' not yet implemented}}
3332
#pragma acc data create(Var)
3433
;
3534
#pragma acc data no_create(Var)
@@ -66,7 +65,6 @@ void AtLeastOneOf() {
6665
// Enter Data
6766
// expected-warning@+1{{OpenACC clause 'copyin' not yet implemented}}
6867
#pragma acc enter data copyin(Var)
69-
// expected-warning@+1{{OpenACC clause 'create' not yet implemented}}
7068
#pragma acc enter data create(Var)
7169
// expected-warning@+1{{OpenACC clause 'attach' not yet implemented}}
7270
#pragma acc enter data attach(Var)

0 commit comments

Comments
 (0)