xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-private-clause.c (revision 4bbdb018a6cb564783cfb9c65ca82b81c6006bb6)
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 parallel private(LocalInt)
26   while(1);
27 #pragma acc serial private(LocalInt)
28   while(1);
29   // expected-error@+1{{OpenACC 'private' clause is not valid on 'kernels' directive}}
30 #pragma acc kernels private(LocalInt)
31   while(1);
32 
33   // Valid cases:
34 #pragma acc parallel private(LocalInt, LocalPointer, LocalArray)
35   while(1);
36 #pragma acc parallel private(LocalArray)
37   while(1);
38 #pragma acc parallel private(LocalArray[:])
39   while(1);
40 #pragma acc parallel private(LocalArray[:5])
41   while(1);
42 #pragma acc parallel private(LocalArray[2:])
43   while(1);
44 #pragma acc parallel private(LocalArray[2:1])
45   while(1);
46 #pragma acc parallel private(LocalArray[2])
47   while(1);
48 #pragma acc parallel private(LocalComposite)
49   while(1);
50 #pragma acc parallel private(LocalComposite.EnumMember)
51   while(1);
52 #pragma acc parallel private(LocalComposite.ScalarMember)
53   while(1);
54 #pragma acc parallel private(LocalComposite.ArrayMember)
55   while(1);
56 #pragma acc parallel private(LocalComposite.ArrayMember[5])
57   while(1);
58 #pragma acc parallel private(LocalComposite.PointerMember)
59   while(1);
60 #pragma acc parallel private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)
61   while(1);
62 #pragma acc parallel private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)
63   while(1);
64 #pragma acc parallel private(LocalComposite, GlobalComposite)
65   while(1);
66 #pragma acc parallel private(IntParam, PointerParam, ArrayParam, CompositeParam)
67   while(1);
68 #pragma acc parallel private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)
69   while(1);
70 
71 #pragma acc parallel private(LocalArray) private(LocalArray[2])
72   while(1);
73 
74 #pragma acc parallel private(LocalArray, LocalArray[2])
75   while(1);
76 
77 #pragma acc parallel private(LocalComposite, LocalComposite.ScalarMember)
78   while(1);
79 
80 #pragma acc parallel private(LocalComposite.CompositeMember.A, LocalComposite.ScalarMember)
81   while(1);
82 
83 #pragma acc parallel private(LocalComposite.CompositeMember.A) private(LocalComposite.ScalarMember)
84   while(1);
85 
86   Complete LocalComposite2;
87 #pragma acc parallel private(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember)
88   while(1);
89 
90   // Invalid cases, arbitrary expressions.
91   struct Incomplete *I;
92   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
93 #pragma acc parallel private(*I)
94   while(1);
95   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
96 #pragma acc parallel private(GlobalInt + IntParam)
97   while(1);
98   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
99 #pragma acc parallel private(+GlobalInt)
100   while(1);
101 
102   // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
103 #pragma acc parallel private(PointerParam[:])
104   while(1);
105 #pragma acc parallel private(PointerParam[:5])
106   while(1);
107 #pragma acc parallel private(PointerParam[:IntParam])
108   while(1);
109   // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
110 #pragma acc parallel private(PointerParam[2:])
111   while(1);
112 #pragma acc parallel private(PointerParam[2:5])
113   while(1);
114 #pragma acc parallel private(PointerParam[2])
115   while(1);
116 #pragma acc parallel private(ArrayParam[:])
117   while(1);
118 #pragma acc parallel private(ArrayParam[:5])
119   while(1);
120 #pragma acc parallel private(ArrayParam[:IntParam])
121   while(1);
122 #pragma acc parallel private(ArrayParam[2:])
123   while(1);
124   // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
125 #pragma acc parallel private(ArrayParam[2:5])
126   while(1);
127 #pragma acc parallel private(ArrayParam[2])
128   while(1);
129 
130   // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}
131   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
132 #pragma acc parallel private((float*)ArrayParam[2:5])
133   while(1);
134   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
135 #pragma acc parallel private((float)ArrayParam[2])
136   while(1);
137 
138   // expected-error@+1{{OpenACC 'private' clause is not valid on 'init' directive}}
139 #pragma acc init private(LocalInt)
140   for(;;);
141 }
142