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