reduce_general_bad_result.rs revision 65f23ed862e1a1e16477ba740f295ff4a83ac822
1// -target-api 0 -Wall
2#pragma version(1)
3#pragma rs java_package_name(export)
4
5// trivial accumulator for use multiple times later
6static void AccumInt(int *accum, int val) { }
7
8// NOTE: union and bitfield errors are only emitted once per type, so
9//       we have multiple types here to ensure that we issue errors
10//       in multiple contexts.
11
12// NOTE: accumulator data type is restricted in certain ways regardless
13//       of result type; we do not test that here.  This is covered
14//       in the test case reduce_general_bad_accumulator.rs.
15
16/////////////////////////////////////////////////////////////////////////
17
18// result type cannot be a vector of half
19#pragma rs reduce(redHalf3) accumulator(AccumHalf3)
20static void AccumHalf3(half3 *accum, half3 val) { }
21
22// problem is result type, not accumulator type, so outconverter can fix this
23#pragma rs reduce(redHalf3OutFix) accumulator(AccumHalf3) outconverter(OutHalf3Fix)
24static void OutHalf3Fix(half *out, const half3 *val) { }
25
26// problem is result type, not accumulator type, so outconverter can break this
27#pragma rs reduce(redHalf3OutBreak) accumulator(AccumInt) outconverter(OutHalf3Break)
28static void OutHalf3Break(half3 *out, const int *val) { }
29
30/////////////////////////////////////////////////////////////////////////
31
32typedef half4 Half4Array5[5];
33
34// result type cannot be an array of vector of half
35#pragma rs reduce(redHalf4A5) accumulator(AccumHalf4A5) combiner(CombHalf4A5)
36static void AccumHalf4A5(Half4Array5 *accum, short val) { }
37static void CombHalf4A5(Half4Array5 *accum, const Half4Array5 *other) { }
38
39// problem is result type, not accumulator type, so outconverter can fix this
40#pragma rs reduce(redHalf4A5OutFix) accumulator(AccumHalf4A5) combiner(CombHalf4A5) \
41  outconverter(OutHalf4A5Fix)
42static void OutHalf4A5Fix(half *out, const Half4Array5 *val) { }
43
44// problem is result type, not accumulator type, so outconverter can break this
45#pragma rs reduce(redHalf4A5OutBreak) accumulator(AccumInt) outconverter(OutHalf4A5Break)
46static void OutHalf4A5Break(Half4Array5 *out, const int *val) { }
47
48/////////////////////////////////////////////////////////////////////////
49
50typedef unsigned int UIntA916[9][16];
51
52// result type cannot be multidimensional array
53#pragma rs reduce(redUInt2dA) accumulator(AccumUInt2dA) combiner(CombUInt2dA)
54static void AccumUInt2dA(UIntA916 *accum, int val) { }
55static void CombUInt2dA(UIntA916 *accum, const UIntA916 *val) { }
56
57// problem is result type, not accumulator type, so outconverter can fix this
58#pragma rs reduce(redUInt2dAOutFix) accumulator(AccumUInt2dA) combiner(CombUInt2dA) \
59  outconverter(OutUInt2dAFix)
60static void OutUInt2dAFix(uint *out, const UIntA916 *val) { }
61
62// problem is result type, not accumulator type, so outconverter can break this
63#pragma rs reduce(redUInt2dAOutBreak) accumulator(AccumInt) outconverter(OutUInt2dABreak)
64static void OutUInt2dABreak(UIntA916 *out, const int *val) { }
65
66/////////////////////////////////////////////////////////////////////////
67
68union UnionShortDouble {
69  short s;
70  double d;
71};
72
73union UnionCharInt {
74  char c;
75  int i;
76};
77
78union UnionLongFloat {
79  long l;
80  float f;
81};
82
83// result type cannot be union
84#pragma rs reduce(redUnionShortDouble) accumulator(AccumUnionShortDouble) \
85  combiner(CombineUnionShortDouble)
86static void AccumUnionShortDouble(union UnionShortDouble *accum, short s, double d) { }
87static void CombineUnionShortDouble(union UnionShortDouble *accum,
88                                    const union UnionShortDouble *other) { }
89
90// problem is result type, not accumulator type, so outconverter can fix this
91#pragma rs reduce(redUnionCharIntOutFix) accumulator(AccumUnionCharInt) \
92  combiner(CombineUnionCharInt) outconverter(OutUnionCharIntFix)
93static void AccumUnionCharInt(union UnionCharInt *accum, short s, double d) { }
94static void CombineUnionCharInt(union UnionCharInt *accum, const union UnionCharInt *other) { }
95static void OutUnionCharIntFix(int *out, const union UnionCharInt *val) { }
96
97// problem is result type, not accumulator type, so outconverter can break this
98#pragma rs reduce(redUnionLongFloatOutBreak) accumulator(AccumInt) \
99  outconverter(OutUnionLongFloatBreak)
100static void OutUnionLongFloatBreak(union UnionLongFloat *out, const int *val) { }
101
102/////////////////////////////////////////////////////////////////////////
103
104union UnionIntFloat {
105  short s;
106  double d;
107};
108typedef union UnionIntFloat UnionIntFloatArray[10];
109
110union UnionDoubleFloat {
111  double d;
112  float f;
113};
114typedef union UnionDoubleFloat UnionDoubleFloatArray[10];
115
116union UnionCharLong {
117  char c;
118  long l;
119};
120typedef union UnionCharLong UnionCharLongArray[10];
121
122// cannot export array of union
123#pragma rs reduce(redUnionIntFloatArray) accumulator(AccumUnionIntFloatArray) \
124  combiner(CombineUnionIntFloatArray)
125static void AccumUnionIntFloatArray(UnionIntFloatArray *accum, int val) { }
126static void CombineUnionIntFloatArray(UnionIntFloatArray *accum,
127                                      const UnionIntFloatArray *other) { }
128
129// problem is result type, not accumulator type, so outconverter can fix this
130#pragma rs reduce(redUnionDoubleFloatArrayOutFix) accumulator(AccumUnionDoubleFloatArray) \
131  combiner(CombineUnionDoubleFloatArray) outconverter(OutUnionDoubleFloatArrayFix)
132static void AccumUnionDoubleFloatArray(UnionDoubleFloatArray *accum, short s, double d) { }
133static void CombineUnionDoubleFloatArray(UnionDoubleFloatArray *accum,
134                                           const UnionDoubleFloatArray *other) { }
135static void OutUnionDoubleFloatArrayFix(int *out, const UnionDoubleFloatArray *val) { }
136
137// problem is result type, not accumulator type, so outconverter can break this
138#pragma rs reduce(redUnionCharLongArrayOutBreak) accumulator(AccumInt) \
139  outconverter(OutUnionCharLongArrayBreak)
140static void OutUnionCharLongArrayBreak(UnionCharLongArray *out, const int *val) { }
141
142/////////////////////////////////////////////////////////////////////////
143
144struct Bits1 {
145  int b:1;
146};
147
148struct Bits11 {
149  int c:1;
150  int d:1;
151};
152
153struct Bits111 {
154  int e:1;
155  int f:1;
156  int g:1;
157};
158
159// cannot export struct with bitfield
160#pragma rs reduce(redBits) accumulator(AccumBits) combiner(CombineBits)
161static void AccumBits(struct Bits1 *accum, int val) { }
162static void CombineBits(struct Bits1 *accum, const struct Bits1 *other) { }
163
164// problem is result type, not accumulator type, so outconverter can fix this
165#pragma rs reduce(redBitsOutFix) accumulator(AccumBitsOutFix) combiner(CombineBitsOutFix) \
166  outconverter(OutBitsFix)
167static void AccumBitsOutFix(struct Bits11 *accum, int val) { }
168static void CombineBitsOutFix(struct Bits11 *accum, const struct Bits11 *other) { }
169static void OutBitsFix(int *out, const struct Bits11 *val) { }
170
171// problem is result type, not accumulator type, so outconverter can break this
172#pragma rs reduce(redBitsOutBreak) accumulator(AccumInt) outconverter(OutBitsBreak)
173static void OutBitsBreak(struct Bits111 *out, const int *val) { }
174
175/////////////////////////////////////////////////////////////////////////
176
177struct Bits2 {
178  int b:2;
179};
180typedef struct Bits2 Bits2Array[10];
181
182struct Bits22 {
183  int c:2;
184  int d:2;
185};
186typedef struct Bits22 Bits22Array[10];
187
188struct Bits222 {
189  int e:2;
190  int f:2;
191  int g:2;
192};
193typedef struct Bits222 Bits222Array[10];
194
195// cannot export array of struct with bitfield
196#pragma rs reduce(redBitsArray) accumulator(AccumBitsArray) combiner(CombineBitsArray)
197static void AccumBitsArray(Bits2Array *accum, int val) { }
198static void CombineBitsArray(Bits2Array *accum, const Bits2Array *other) { }
199
200// problem is result type, not accumulator type, so outconverter can fix this
201#pragma rs reduce(redBitsArrayOutFix) accumulator(AccumBitsArrayOutFix) \
202  combiner(CombineBitsArrayOutFix) outconverter(OutBitsArrayFix)
203static void AccumBitsArrayOutFix(Bits22Array *accum, int val) { }
204static void CombineBitsArrayOutFix(Bits22Array *accum, const Bits22Array *other) { }
205static void OutBitsArrayFix(int *out, const Bits22Array *val) { }
206
207// problem is result type, not accumulator type, so outconverter can break this
208#pragma rs reduce(redBitsArrayOutBreak) accumulator(AccumInt) outconverter(OutBitsArrayBreak)
209static void OutBitsArrayBreak(Bits222Array *out, const int *val) { }
210
211/////////////////////////////////////////////////////////////////////////
212
213// result type cannot be matrix
214#pragma rs reduce(redMat) accumulator(AccumMat)
215static void AccumMat(rs_matrix2x2 *accum, rs_matrix2x2 val) { }
216
217// problem is result type, not accumulator type, so outconverter can fix this
218#pragma rs reduce(redMatOutFix) accumulator(AccumMat) outconverter(OutMatFix)
219static void OutMatFix(int *out, const rs_matrix2x2 *val) { }
220
221// problem is result type, not accumulator type, so outconverter can break this
222#pragma rs reduce(redMatOutBreak) accumulator(AccumInt) outconverter(OutMatBreak)
223static void OutMatBreak(rs_matrix2x2 *out, const int *val) { }
224
225/////////////////////////////////////////////////////////////////////////
226
227typedef rs_matrix2x2 ArrayMatrix2x2[10];
228
229// result type cannot be array of matrix
230#pragma rs reduce(redMatArray) accumulator(AccumMatArray) combiner(CombineMatArray)
231static void AccumMatArray(ArrayMatrix2x2 *accum, rs_matrix2x2 val) { }
232static void CombineMatArray(ArrayMatrix2x2 *accum, const ArrayMatrix2x2 *other) { }
233
234// problem is result type, not accumulator type, so outconverter can fix this
235#pragma rs reduce(redMatArrayOutFix) accumulator(AccumMatArray) combiner(CombineMatArray) \
236  outconverter(OutMatArrayFix)
237static void OutMatArrayFix(int *out, const ArrayMatrix2x2 *val) { }
238
239// problem is result type, not accumulator type, so outconverter can break this
240#pragma rs reduce(redMatArrayOutBreak) accumulator(AccumInt) outconverter(OutMatArrayBreak)
241static void OutMatArrayBreak(ArrayMatrix2x2 *out, const int *val) { }
242
243/////////////////////////////////////////////////////////////////////////
244
245// result type cannot be object type
246#pragma rs reduce(redAlloc) accumulator(AccumInt) outconverter(OutAlloc)
247static void OutAlloc(rs_allocation *out, const int *val) { }
248
249/////////////////////////////////////////////////////////////////////////
250
251typedef rs_allocation AllocArray[10];
252
253// result type cannot be array of object type
254#pragma rs reduce(redAllocArray) accumulator(AccumAllocArray) outconverter(OutAllocArray)
255static void AccumAllocArray(int *accum, int val) { }
256static void OutAllocArray(AllocArray *out, const int *val) { }
257
258/////////////////////////////////////////////////////////////////////////
259
260struct StructObj1 {
261  int f;
262  rs_element e;
263};
264
265// result type cannot be struct containing object type
266#pragma rs reduce(redStructObj) accumulator(AccumStructObj) outconverter(OutStructObj)
267static void AccumStructObj(int *accum, int val) { }
268static void OutStructObj(struct StructObj1 *out, const int *val) { }
269
270/////////////////////////////////////////////////////////////////////////
271
272struct StructObj2 {
273  rs_type t;
274  float f;
275};
276typedef struct StructObj2 StructObj2Array[10];
277
278// result type cannot be array of struct containing object type
279#pragma rs reduce(redStructObjArray) accumulator(AccumStructObjArray) \
280  outconverter(OutStructObjArray)
281static void AccumStructObjArray(int *accum, int val) { }
282static void OutStructObjArray(StructObj2Array *out, const int *val) { }
283
284/////////////////////////////////////////////////////////////////////////
285
286typedef char *Ptr;
287
288// result type cannot be pointer
289#pragma rs reduce(redPtr) accumulator(AccumPtr) combiner(CombPtr)
290static void AccumPtr(Ptr *accum, char val) { }
291static void CombPtr(Ptr *accum, const Ptr *other) { }
292
293// problem is result type, not accumulator type, so outconverter can fix this
294#pragma rs reduce(redPtrOutFix) accumulator(AccumPtr) combiner(CombPtr) \
295  outconverter(OutPtrFix)
296static void OutPtrFix(int *out, const Ptr *val) { }
297
298// problem is result type, not accumulator type, so outconverter can break this
299#pragma rs reduce(redPtrOutBreak) accumulator(AccumInt) outconverter(OutPtrBreak)
300static void OutPtrBreak(Ptr *out, const int *val) { }
301
302/////////////////////////////////////////////////////////////////////////
303
304typedef Ptr PtrArray7[7];
305
306// cannot export array of pointer
307#pragma rs reduce(redPtrArray7) accumulator(AccumPtrArray7) combiner(CombPtrArray7)
308static void AccumPtrArray7(PtrArray7 *accum, int val) { }
309static void CombPtrArray7(PtrArray7 *accum, const PtrArray7 *other) { }
310
311// problem is result type, not accumulator type, so outconverter can fix this
312#pragma rs reduce(redPtrArray7OutFix) accumulator(AccumPtrArray7) combiner(CombPtrArray7) \
313  outconverter(OutPtrArray7Fix)
314static void OutPtrArray7Fix(int *out, const PtrArray7 *val) { }
315
316// problem is result type, not accumulator type, so outconverter can break this
317#pragma rs reduce(redPtrArray7OutBreak) accumulator(AccumInt) outconverter(OutPtrArray7Break)
318static void OutPtrArray7Break(PtrArray7 *out, const int *val) { }
319
320/////////////////////////////////////////////////////////////////////////
321
322struct StructPtr1 {
323  Ptr p;
324  double d;
325};
326
327struct StructPtr11 {
328  Ptr p;
329  double d;
330  int i;
331};
332
333struct StructPtr111 {
334  Ptr p;
335  double d;
336  int i;
337  float f;
338};
339
340// cannot export struct containing pointer
341#pragma rs reduce(redStructPtr) accumulator(AccumStructPtr) combiner(CombStructPtr)
342static void AccumStructPtr(struct StructPtr1 *accum, int val) { }
343static void CombStructPtr(struct StructPtr1 *accum, const struct StructPtr1 *other) { }
344
345// problem is result type, not accumulator type, so outconverter can fix this
346#pragma rs reduce(redStructPtrOutFix) accumulator(AccumStructPtrOutFix) \
347  combiner(CombStructPtrOutFix) outconverter(OutStructPtrFix)
348static void AccumStructPtrOutFix(struct StructPtr11 *accum, int val) { }
349static void CombStructPtrOutFix(struct StructPtr11 *accum, const struct StructPtr11 *other) { }
350static void OutStructPtrFix(int *out, const struct StructPtr11 *val) { }
351
352// problem is result type, not accumulator type, so outconverter can break this
353#pragma rs reduce(redStructPtrOutBreak) accumulator(AccumInt) outconverter(OutStructPtrBreak)
354static void OutStructPtrBreak(struct StructPtr111 *out, const int *val) { }
355
356/////////////////////////////////////////////////////////////////////////
357
358struct StructPtr2 {
359  float f;
360  Ptr p;
361};
362typedef struct StructPtr2 StructPtr2Array[7];
363
364struct StructPtr22 {
365  float f;
366  Ptr p;
367  char c;
368};
369typedef struct StructPtr22 StructPtr22Array[7];
370
371struct StructPtr222 {
372  float f;
373  Ptr p;
374  char c;
375  double d;
376};
377typedef struct StructPtr222 StructPtr222Array[7];
378
379// cannot export struct containing pointer
380#pragma rs reduce(redStructPtrArray) accumulator(AccumStructPtrArray) combiner(CombStructPtrArray)
381static void AccumStructPtrArray(StructPtr2Array *accum, int val) { }
382static void CombStructPtrArray(StructPtr2Array *accum, const StructPtr2Array *other) { }
383
384// problem is result type, not accumulator type, so outconverter can fix this
385#pragma rs reduce(redStructPtrArrayOutFix) accumulator(AccumStructPtrArrayOutFix) \
386  combiner(CombStructPtrArrayOutFix) outconverter(OutStructPtrArrayFix)
387static void AccumStructPtrArrayOutFix(StructPtr22Array *accum, int val) { }
388static void CombStructPtrArrayOutFix(StructPtr22Array *accum, const StructPtr22Array *other) { }
389static void OutStructPtrArrayFix(int *out, const StructPtr22Array *val) { }
390
391// problem is result type, not accumulator type, so outconverter can break this
392#pragma rs reduce(redStructPtrArrayOutBreak) accumulator(AccumInt) \
393  outconverter(OutStructPtrArrayBreak)
394static void OutStructPtrArrayBreak(StructPtr22Array *out, const int *val) { }
395
396/////////////////////////////////////////////////////////////////////////
397
398typedef void Fn(void);
399
400// cannot export function type
401//
402// NOTE: Not suitable as accumulator data type, regardless of whether
403//       we have outconverter; that's tested in reduce_general_bad_accumulator.rs.
404#pragma rs reduce(redFn) accumulator(AccumInt) outconverter(OutFn)
405static void OutFn(Fn *out, const int *val) { }
406
407/////////////////////////////////////////////////////////////////////////
408
409struct Incomplete;
410
411// result type cannot be incomplete type
412//
413// NOTE: Not suitable as accumulator data type, regardless of whether
414//       we have outconverter; that's tested in reduce_general_bad_accumulator.rs.
415#pragma rs reduce(redStructIncomplete) accumulator(AccumInt) outconverter(OutStructIncomplete)
416static void OutStructIncomplete(struct Incomplete *out, const int *val) { }
417
418/////////////////////////////////////////////////////////////////////////
419
420typedef int IntA[]; // incomplete (unknown element count)
421
422// result type cannot be incomplete type
423//
424// NOTE: Not suitable as accumulator data type, regardless of whether
425//       we have outconverter; that's tested in reduce_general_bad_accumulator.rs.
426#pragma rs reduce(redArrayIncomplete) accumulator(AccumInt) outconverter(OutArrayIncomplete)
427static void OutArrayIncomplete(IntA *out, const int *val) { }
428