xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-deviceptr-clause.cpp (revision 48c8a5791ae71c96661479f684459b7b9427a22d)
1*48c8a579Serichkeane // RUN: %clang_cc1 %s -fopenacc -verify
2*48c8a579Serichkeane 
3*48c8a579Serichkeane struct S {
4*48c8a579Serichkeane   int IntMem;
5*48c8a579Serichkeane   int *PtrMem;
6*48c8a579Serichkeane   operator int*();
7*48c8a579Serichkeane };
8*48c8a579Serichkeane 
uses()9*48c8a579Serichkeane void uses() {
10*48c8a579Serichkeane   int LocalInt;
11*48c8a579Serichkeane   int *LocalPtr;
12*48c8a579Serichkeane   int Array[5];
13*48c8a579Serichkeane   int *PtrArray[5];
14*48c8a579Serichkeane   struct S s;
15*48c8a579Serichkeane 
16*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}
17*48c8a579Serichkeane #pragma acc parallel deviceptr(LocalInt)
18*48c8a579Serichkeane   while (true);
19*48c8a579Serichkeane 
20*48c8a579Serichkeane #pragma acc parallel deviceptr(LocalPtr)
21*48c8a579Serichkeane   while (true);
22*48c8a579Serichkeane 
23*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int[5]'}}
24*48c8a579Serichkeane #pragma acc parallel deviceptr(Array)
25*48c8a579Serichkeane   while (true);
26*48c8a579Serichkeane 
27*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}
28*48c8a579Serichkeane #pragma acc parallel deviceptr(Array[0])
29*48c8a579Serichkeane   while (true);
30*48c8a579Serichkeane 
31*48c8a579Serichkeane   // expected-error@+2{{OpenACC sub-array is not allowed here}}
32*48c8a579Serichkeane   // expected-note@+1{{expected variable of pointer type}}
33*48c8a579Serichkeane #pragma acc parallel deviceptr(Array[0:1])
34*48c8a579Serichkeane   while (true);
35*48c8a579Serichkeane 
36*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int *[5]'}}
37*48c8a579Serichkeane #pragma acc parallel deviceptr(PtrArray)
38*48c8a579Serichkeane   while (true);
39*48c8a579Serichkeane 
40*48c8a579Serichkeane #pragma acc parallel deviceptr(PtrArray[0])
41*48c8a579Serichkeane   while (true);
42*48c8a579Serichkeane 
43*48c8a579Serichkeane   // expected-error@+2{{OpenACC sub-array is not allowed here}}
44*48c8a579Serichkeane   // expected-note@+1{{expected variable of pointer type}}
45*48c8a579Serichkeane #pragma acc parallel deviceptr(PtrArray[0:1])
46*48c8a579Serichkeane   while (true);
47*48c8a579Serichkeane 
48*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'struct S'}}
49*48c8a579Serichkeane #pragma acc parallel deviceptr(s)
50*48c8a579Serichkeane   while (true);
51*48c8a579Serichkeane 
52*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}
53*48c8a579Serichkeane #pragma acc parallel deviceptr(s.IntMem)
54*48c8a579Serichkeane   while (true);
55*48c8a579Serichkeane 
56*48c8a579Serichkeane #pragma acc parallel deviceptr(s.PtrMem)
57*48c8a579Serichkeane   while (true);
58*48c8a579Serichkeane }
59*48c8a579Serichkeane 
60*48c8a579Serichkeane template<typename T, typename TPtr, typename TStruct, auto &R1>
Templ()61*48c8a579Serichkeane void Templ() {
62*48c8a579Serichkeane   T SomeInt;
63*48c8a579Serichkeane   TPtr SomePtr;
64*48c8a579Serichkeane   T SomeIntArray[5];
65*48c8a579Serichkeane   TPtr SomeIntPtrArray[5];
66*48c8a579Serichkeane   TStruct SomeStruct;
67*48c8a579Serichkeane 
68*48c8a579Serichkeane   // expected-error@+2{{expected pointer in 'deviceptr' clause, type is 'int'}}
69*48c8a579Serichkeane   // expected-note@#INST{{in instantiation of function template specialization}}
70*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeInt)
71*48c8a579Serichkeane   while (true);
72*48c8a579Serichkeane 
73*48c8a579Serichkeane #pragma acc parallel deviceptr(SomePtr)
74*48c8a579Serichkeane   while (true);
75*48c8a579Serichkeane 
76*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int[5]'}}
77*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeIntArray)
78*48c8a579Serichkeane   while (true);
79*48c8a579Serichkeane 
80*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}
81*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeIntArray[0])
82*48c8a579Serichkeane   while (true);
83*48c8a579Serichkeane 
84*48c8a579Serichkeane   // expected-error@+2{{OpenACC sub-array is not allowed here}}
85*48c8a579Serichkeane   // expected-note@+1{{expected variable of pointer type}}
86*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeIntArray[0:1])
87*48c8a579Serichkeane   while (true);
88*48c8a579Serichkeane 
89*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int *[5]'}}
90*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeIntPtrArray)
91*48c8a579Serichkeane   while (true);
92*48c8a579Serichkeane 
93*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeIntPtrArray[0])
94*48c8a579Serichkeane   while (true);
95*48c8a579Serichkeane 
96*48c8a579Serichkeane   // expected-error@+2{{OpenACC sub-array is not allowed here}}
97*48c8a579Serichkeane   // expected-note@+1{{expected variable of pointer type}}
98*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeIntPtrArray[0:1])
99*48c8a579Serichkeane   while (true);
100*48c8a579Serichkeane 
101*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'S'}}
102*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeStruct)
103*48c8a579Serichkeane   while (true);
104*48c8a579Serichkeane 
105*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}
106*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeStruct.IntMem)
107*48c8a579Serichkeane   while (true);
108*48c8a579Serichkeane 
109*48c8a579Serichkeane #pragma acc parallel deviceptr(SomeStruct.PtrMem)
110*48c8a579Serichkeane   while (true);
111*48c8a579Serichkeane 
112*48c8a579Serichkeane   // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}
113*48c8a579Serichkeane #pragma acc parallel deviceptr(R1)
114*48c8a579Serichkeane   while (true);
115*48c8a579Serichkeane }
116*48c8a579Serichkeane 
inst()117*48c8a579Serichkeane void inst() {
118*48c8a579Serichkeane   static constexpr int CEVar = 1;
119*48c8a579Serichkeane   Templ<int, int*, S, CEVar>(); // #INST
120*48c8a579Serichkeane }
121