xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-copyin-clause.cpp (revision a15b685c2d868eaf408d05baa50baa3c9f5cc740)
1 // RUN: %clang_cc1 %s -fopenacc -verify
2 
3 enum SomeE{};
4 typedef struct IsComplete {
5   struct S { int A; } CompositeMember;
6   int ScalarMember;
7   float ArrayMember[5];
8   SomeE EnumMember;
9   char *PointerMember;
10 } Complete;
11 
uses(int IntParam,char * PointerParam,float ArrayParam[5],Complete CompositeParam,int & IntParamRef)12 void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) {
13   int LocalInt;
14   char *LocalPointer;
15   float LocalArray[5];
16   // Check Appertainment:
17 #pragma acc parallel copyin(LocalInt)
18   while(1);
19 #pragma acc serial copyin(LocalInt)
20   while(1);
21 #pragma acc kernels copyin(LocalInt)
22   while(1);
23 
24   // Valid cases:
25 #pragma acc parallel copyin(LocalInt, LocalPointer, LocalArray)
26   while(1);
27 #pragma acc parallel copyin(LocalArray[2:1])
28   while(1);
29 
30   Complete LocalComposite2;
31 #pragma acc parallel copyin(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember)
32   while(1);
33 
34   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
35 #pragma acc parallel copyin(1 + IntParam)
36   while(1);
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 parallel copyin(+IntParam)
40   while(1);
41 
42   // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
43 #pragma acc parallel copyin(PointerParam[2:])
44   while(1);
45 
46   // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
47 #pragma acc parallel copyin(ArrayParam[2:5])
48   while(1);
49 
50   // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
51   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
52 #pragma acc parallel copyin((float*)ArrayParam[2:5])
53   while(1);
54   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
55 #pragma acc parallel copyin((float)ArrayParam[2])
56   while(1);
57 }
58 
59 template<typename T, unsigned I, typename V>
TemplUses(T t,T (& arrayT)[I],V TemplComp)60 void TemplUses(T t, T (&arrayT)[I], V TemplComp) {
61   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
62 #pragma acc parallel copyin(+t)
63   while(true);
64 
65   // NTTP's are only valid if it is a reference to something.
66   // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
67   // expected-note@#TEMPL_USES_INST{{in instantiation of}}
68 #pragma acc parallel copyin(I)
69   while(true);
70 
71   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
72 #pragma acc parallel copyin(t, I)
73   while(true);
74 
75 #pragma acc parallel copyin(arrayT)
76   while(true);
77 
78 #pragma acc parallel copyin(TemplComp)
79   while(true);
80 
81 #pragma acc parallel copyin(TemplComp.PointerMember[5])
82   while(true);
83  int *Pointer;
84 #pragma acc parallel copyin(Pointer[:I])
85   while(true);
86 #pragma acc parallel copyin(Pointer[:t])
87   while(true);
88   // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
89 #pragma acc parallel copyin(Pointer[1:])
90   while(true);
91 }
92 
93 template<unsigned I, auto &NTTP_REF>
NTTP()94 void NTTP() {
95   // NTTP's are only valid if it is a reference to something.
96   // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
97   // expected-note@#NTTP_INST{{in instantiation of}}
98 #pragma acc parallel copyin(I)
99   while(true);
100 
101 #pragma acc parallel copyin(NTTP_REF)
102   while(true);
103 }
104 
Inst()105 void Inst() {
106   static constexpr int NTTP_REFed = 1;
107   int i;
108   int Arr[5];
109   Complete C;
110   TemplUses(i, Arr, C); // #TEMPL_USES_INST
111   NTTP<5, NTTP_REFed>(); // #NTTP_INST
112 }
113