[flang][OpenMP] 'no_openmp_constructs' added to clang broke flang build (#126145)
[llvm-project.git] / clang / test / SemaOpenACC / compute-construct-reduction-clause.cpp
blob7372f683e2eb3ef65dcdd81add5727fdf66d50ef
1 // RUN: %clang_cc1 %s -fopenacc -verify
3 struct CompositeOfScalars {
4 int I;
5 float F;
6 short J;
7 char C;
8 double D;
9 _Complex float CF;
10 _Complex double CD;
13 struct CompositeHasComposite {
14 int I;
15 float F;
16 short J;
17 char C;
18 double D;
19 _Complex float CF;
20 _Complex double CD;
21 struct CompositeOfScalars COS; // #COS_FIELD
24 void uses(unsigned Parm) {
25 float Var;
26 int IVar;
28 #pragma acc parallel reduction(+:Parm)
29 while (1);
30 #pragma acc serial reduction(+:Parm)
31 while (1);
32 // expected-error@+1{{OpenACC 'reduction' clause is not valid on 'kernels' directive}}
33 #pragma acc kernels reduction(+:Parm)
34 while (1);
36 // On a 'parallel', 'num_gangs' cannot have >1 args. num_gangs not valid on
37 // 'serial', but 'reduction' not valid on 'kernels', other combos cannot be
38 // tested.
39 #pragma acc parallel reduction(+:Parm) num_gangs(IVar)
40 while (1);
41 #pragma acc parallel num_gangs(IVar) reduction(+:Var)
42 while (1);
44 // expected-error@+2{{OpenACC 'num_gangs' clause with more than 1 argument may not appear on a 'parallel' construct with a 'reduction' clause}}
45 // expected-note@+1{{previous clause is here}}
46 #pragma acc parallel reduction(+:Parm) num_gangs(Parm, IVar)
47 while (1);
49 // expected-error@+2{{OpenACC 'reduction' clause may not appear on a 'parallel' construct with a 'num_gangs' clause with more than 1 argument}}
50 // expected-note@+1{{previous clause is here}}
51 #pragma acc parallel num_gangs(Parm, IVar) reduction(+:Var)
52 while (1);
54 #pragma acc parallel reduction(+:Parm) reduction(+:Parm)
55 while (1);
57 struct CompositeOfScalars CoS;
58 struct CompositeOfScalars *CoSPtr;
59 struct CompositeHasComposite ChC;
60 struct CompositeHasComposite *ChCPtr;
62 int I;
63 float F;
64 int Array[5];
66 // Vars in a reduction must be a scalar or a composite of scalars.
67 #pragma acc parallel reduction(&: CoS, I, F)
68 while (1);
69 // expected-error@+2{{OpenACC 'reduction' composite variable must not have non-scalar field}}
70 // expected-note@#COS_FIELD{{invalid field is here}}
71 #pragma acc parallel reduction(&: ChC)
72 while (1);
73 // expected-error@+1{{OpenACC 'reduction' variable must be of scalar type, sub-array, or a composite of scalar types; type is 'int[5]'}}
74 #pragma acc parallel reduction(&: Array)
75 while (1);
77 #pragma acc parallel reduction(&: CoS, Array[I], Array[0:I])
78 while (1);
80 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
81 #pragma acc parallel reduction(&: CoS.I)
82 while (1);
84 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
85 #pragma acc parallel reduction(&: CoSPtr->I)
87 while (1);
88 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
89 #pragma acc parallel reduction(&: ChC.COS)
90 while (1);
92 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
93 #pragma acc parallel reduction(&: ChCPtr->COS)
94 while (1);
97 template<typename T, typename U, typename V>
98 void TemplUses(T Parm, U CoS, V ChC) {
99 T Var;
100 U *CoSPtr;
101 V *ChCPtr;
103 #pragma acc parallel reduction(+:Parm)
104 while (1);
105 #pragma acc serial reduction(+:Parm)
106 while (1);
107 // expected-error@+1{{OpenACC 'reduction' clause is not valid on 'kernels' directive}}
108 #pragma acc kernels reduction(+:Parm)
109 while (1);
111 // On a 'parallel', 'num_gangs' cannot have >1 args. num_gangs not valid on
112 // 'serial', but 'reduction' not valid on 'kernels', other combos cannot be
113 // tested.
114 #pragma acc parallel reduction(+:Parm) num_gangs(Var)
115 while (1);
116 #pragma acc parallel num_gangs(Var) reduction(+:Var)
117 while (1);
119 // expected-error@+2{{OpenACC 'num_gangs' clause with more than 1 argument may not appear on a 'parallel' construct with a 'reduction' clause}}
120 // expected-note@+1{{previous clause is here}}
121 #pragma acc parallel reduction(+:Parm) num_gangs(Parm, Var)
122 while (1);
124 // expected-error@+2{{OpenACC 'reduction' clause may not appear on a 'parallel' construct with a 'num_gangs' clause with more than 1 argument}}
125 // expected-note@+1{{previous clause is here}}
126 #pragma acc parallel num_gangs(Parm, Var) reduction(+:Var)
127 while (1);
129 #pragma acc parallel reduction(+:Parm) reduction(+:Parm)
130 while (1);
132 int NonDep;
133 int NonDepArray[5];
134 T Array[5];
136 // Vars in a reduction must be a scalar or a composite of scalars.
137 #pragma acc parallel reduction(&: CoS, Var, Parm)
138 while (1);
139 // expected-error@+2{{OpenACC 'reduction' composite variable must not have non-scalar field}}
140 // expected-note@#COS_FIELD{{invalid field is here}}
141 #pragma acc parallel reduction(&: ChC)
142 while (1);
143 // expected-error@+1{{OpenACC 'reduction' variable must be of scalar type, sub-array, or a composite of scalar types; type is 'int[5]'}}
144 #pragma acc parallel reduction(&: Array)
145 while (1);
146 // expected-error@+1{{OpenACC 'reduction' variable must be of scalar type, sub-array, or a composite of scalar types; type is 'int[5]'}}
147 #pragma acc parallel reduction(&: NonDepArray)
148 while (1);
150 #pragma acc parallel reduction(&: CoS, Array[Var], Array[0:Var])
151 while (1);
153 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
154 #pragma acc parallel reduction(&: CoS.I)
155 while (1);
157 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
158 #pragma acc parallel reduction(&: CoSPtr->I)
160 while (1);
161 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
162 #pragma acc parallel reduction(&: ChC.COS)
163 while (1);
165 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}}
166 #pragma acc parallel reduction(&: ChCPtr->COS)
167 while (1);
170 void inst() {
171 CompositeOfScalars CoS;
172 CompositeHasComposite ChC;
173 // expected-note@+1{{in instantiation of function template specialization}}
174 TemplUses(5, CoS, ChC);