1// -Wall
2#pragma version(1)
3#pragma rs java_package_name(accum)
4
5// Several checks for bad accumulator DATA TYPE (not bad accumulator FUNCTION)
6
7/////////////////////////////////////////////////////////////////////////////
8// accumulator cannot be incomplete array
9/////////////////////////////////////////////////////////////////////////////
10
11typedef int IntA[]; // incomplete (unknown element count)
12
13#pragma rs reduce(redIntA) accumulator(AccumIntA) combiner(CombIntA)
14static void AccumIntA(IntA *accum, int val) { }
15static void CombIntA(IntA *accum, const IntA *val) { }
16
17// outconverter does not help
18#pragma rs reduce(redIntAOut) accumulator(AccumIntA) combiner(CombIntA) outconverter(OutIntA)
19static void OutIntA(int *out, const IntA *val) { }
20
21/////////////////////////////////////////////////////////////////////////////
22// accumulator cannot be incomplete struct
23/////////////////////////////////////////////////////////////////////////////
24
25struct Incomplete;
26
27#pragma rs reduce(redStructIncomplete) accumulator(AccumStructIncomplete) combiner(CombStructIncomplete)
28static void AccumStructIncomplete(struct Incomplete *accum, int val) { }
29static void CombStructIncomplete(struct Incomplete *accum, const struct Incomplete *other) { }
30
31// outconverter does not help
32#pragma rs reduce(redStructIncompleteOut) accumulator(AccumStructIncomplete) combiner(CombStructIncomplete) \
33  outconverter(OutStructIncomplete)
34static void OutStructIncomplete(int *out, const struct Incomplete *val) { }
35
36/////////////////////////////////////////////////////////////////////////////
37// accumulator cannot be function
38/////////////////////////////////////////////////////////////////////////////
39
40typedef void Fn(void);
41
42#pragma rs reduce(redFn) accumulator(AccumFn) combiner(CombineFn)
43static void AccumFn(Fn *accum, int val) { }
44static void CombineFn(Fn *accum, const Fn *other) { }
45
46// outconverter does not help
47#pragma rs reduce(redFnOut) accumulator(AccumFn) combiner(CombineFn) outconverter(OutFn)
48static void OutFn(int *out, const Fn *val) { }
49
50/////////////////////////////////////////////////////////////////////////////
51// accumulator cannot be object
52/////////////////////////////////////////////////////////////////////////////
53
54#pragma rs reduce(redObj) accumulator(AccumObj) combiner(CombineObj)
55static void AccumObj(rs_element *accum, int val) { }
56static void CombineObj(rs_element *accum, const rs_element *other) { }
57
58// outconverter does not help
59#pragma rs reduce(redObjOut) accumulator(AccumObj) combiner(CombineObj) outconverter(OutObj)
60static void OutObj(int *out, const rs_element *val) { }
61
62