xref: /llvm-project/clang/test/SemaOpenACC/data-construct.cpp (revision bfc2dbe02e00f0023c0a2d58b53cdbd1f4139f02)
1 // RUN: %clang_cc1 %s -fopenacc -verify -Wno-empty-body -Wno-unused-value
2 
3 void HasStmt() {
4   {
5     // expected-error@+2{{expected statement}}
6 #pragma acc data default(none)
7   }
8 
9   int I;
10   {
11     // expected-error@+2{{expected statement}}
12 #pragma acc host_data use_device(I)
13   }
14   // Don't have statements, so this is fine.
15   {
16 #pragma acc enter data copyin(I)
17   }
18   {
19 #pragma acc exit data copyout(I)
20   }
21 }
22 
23 void AtLeastOneOf() {
24   int Var;
25   int *VarPtr = &Var;
26 // Data
27 #pragma acc data copy(Var)
28   ;
29 #pragma acc data copyin(Var)
30   ;
31 #pragma acc data copyout(Var)
32   ;
33 #pragma acc data create(Var)
34   ;
35 #pragma acc data no_create(Var)
36   ;
37 #pragma acc data present(Var)
38   ;
39 #pragma acc data deviceptr(VarPtr)
40   ;
41 #pragma acc data attach(VarPtr)
42   ;
43 #pragma acc data default(none)
44   ;
45 
46     // expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
47 #pragma acc data if(Var)
48   ;
49 
50     // expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
51 #pragma acc data async
52   ;
53 
54     // expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
55 #pragma acc data wait
56   ;
57 
58     // expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
59 #pragma acc data device_type(*)
60   ;
61     // expected-error@+1{{OpenACC 'data' construct must have at least one 'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 'attach' or 'default' clause}}
62 #pragma acc data
63   ;
64 
65   // Enter Data
66 #pragma acc enter data copyin(Var)
67 #pragma acc enter data create(Var)
68 #pragma acc enter data attach(VarPtr)
69 
70   // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
71 #pragma acc enter data if(Var)
72   // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
73 #pragma acc enter data async
74   // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
75 #pragma acc enter data wait
76   // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'copyin', 'create' or 'attach' clause}}
77 #pragma acc enter data
78 
79   // Exit Data
80 #pragma acc exit data copyout(Var)
81 #pragma acc exit data delete(Var)
82 #pragma acc exit data detach(VarPtr)
83 
84   // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
85 #pragma acc exit data if(Var)
86   // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
87 #pragma acc exit data async
88   // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
89 #pragma acc exit data wait
90   // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
91 #pragma acc exit data finalize
92   // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete' or 'detach' clause}}
93 #pragma acc exit data
94 
95   // Host Data
96 #pragma acc host_data use_device(Var)
97   ;
98 
99   // expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
100 #pragma acc host_data if(Var)
101   ;
102   // expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
103 #pragma acc host_data if_present
104   ;
105   // expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
106 #pragma acc host_data
107   ;
108 }
109 
110 void DataRules() {
111   int Var;
112   // expected-error@+2{{OpenACC clause 'copy' may not follow a 'device_type' clause in a 'data' construct}}
113   // expected-note@+1{{previous clause is here}}
114 #pragma acc data default(none) device_type(*) copy(Var)
115   ;
116   // expected-error@+2{{OpenACC clause 'copyin' may not follow a 'device_type' clause in a 'data' construct}}
117   // expected-note@+1{{previous clause is here}}
118 #pragma acc data default(none) device_type(*) copyin(Var)
119   ;
120   // expected-error@+2{{OpenACC clause 'copyout' may not follow a 'device_type' clause in a 'data' construct}}
121   // expected-note@+1{{previous clause is here}}
122 #pragma acc data default(none) device_type(*) copyout(Var)
123   ;
124   // expected-error@+2{{OpenACC clause 'create' may not follow a 'device_type' clause in a 'data' construct}}
125   // expected-note@+1{{previous clause is here}}
126 #pragma acc data default(none) device_type(*) create(Var)
127   ;
128   // expected-error@+2{{OpenACC clause 'no_create' may not follow a 'device_type' clause in a 'data' construct}}
129   // expected-note@+1{{previous clause is here}}
130 #pragma acc data default(none) device_type(*) no_create(Var)
131   ;
132   // expected-error@+2{{OpenACC clause 'present' may not follow a 'device_type' clause in a 'data' construct}}
133   // expected-note@+1{{previous clause is here}}
134 #pragma acc data default(none) device_type(*) present(Var)
135   ;
136   // expected-error@+2{{OpenACC clause 'deviceptr' may not follow a 'device_type' clause in a 'data' construct}}
137   // expected-note@+1{{previous clause is here}}
138 #pragma acc data default(none) device_type(*) deviceptr(Var)
139   ;
140   // expected-error@+2{{OpenACC clause 'attach' may not follow a 'device_type' clause in a 'data' construct}}
141   // expected-note@+1{{previous clause is here}}
142 #pragma acc data default(none) device_type(*) attach(Var)
143   ;
144   // expected-error@+2{{OpenACC clause 'default' may not follow a 'device_type' clause in a 'data' construct}}
145   // expected-note@+1{{previous clause is here}}
146 #pragma acc data default(none) device_type(*) default(none)
147   ;
148   // expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' clause in a 'data' construct}}
149   // expected-note@+1{{previous clause is here}}
150 #pragma acc data default(none) device_type(*) if(Var)
151   ;
152 #pragma acc data default(none) device_type(*) async
153   ;
154 #pragma acc data default(none) device_type(*) wait
155   ;
156 }
157 
158 struct HasMembers {
159   int Member;
160 
161   void HostDataError() {
162   // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
163 #pragma acc host_data use_device(this)
164   ;
165   // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
166 #pragma acc host_data use_device(this->Member)
167   ;
168   // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
169 #pragma acc host_data use_device(Member)
170   ;
171   }
172 };
173 
174 void HostDataRules() {
175   int Var, Var2;
176   // expected-error@+3{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
177   // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'host_data' directive}}
178   // expected-note@+1{{previous clause is here}}
179 #pragma acc host_data if(Var) if (Var2)
180   ;
181 
182 #pragma acc host_data use_device(Var)
183   ;
184 
185   int Array[5];
186 #pragma acc host_data use_device(Array)
187   ;
188 
189   // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
190 #pragma acc host_data use_device(Array[1:1])
191   ;
192 
193   // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
194 #pragma acc host_data use_device(Array[1])
195   ;
196   HasMembers HM;
197   // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
198 #pragma acc host_data use_device(HM.Member)
199   ;
200 
201 }
202