146a0334d8901576e20db68e15930a19f8f789cb8David Gross// -Wall -target-api 0
246a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma version(1)
346a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs java_package_name(fn)
446a0334d8901576e20db68e15930a19f8f789cb8David Gross
546a0334d8901576e20db68e15930a19f8f789cb8David Gross// Various ways halter can fail semantic checks.
646a0334d8901576e20db68e15930a19f8f789cb8David Gross// Also see reduce_general_bad_function.rs for other constituent function semantic checks.
746a0334d8901576e20db68e15930a19f8f789cb8David Gross// Also see reduce_general_bad_accumulator.rs for accumulator data type checks.
846a0334d8901576e20db68e15930a19f8f789cb8David Gross
946a0334d8901576e20db68e15930a19f8f789cb8David Gross// trivial accumulator for use multiple times later
1046a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic void AccumInt(int *accum, int val) { }
1146a0334d8901576e20db68e15930a19f8f789cb8David Gross
1246a0334d8901576e20db68e15930a19f8f789cb8David Gross/////////////////////////////////////////////////////////////////////////////
1346a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter
1446a0334d8901576e20db68e15930a19f8f789cb8David Gross/////////////////////////////////////////////////////////////////////////////
1546a0334d8901576e20db68e15930a19f8f789cb8David Gross
1646a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter must return bool
1746a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_void) accumulator(AccumInt) halter(halt_void)
1846a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic void halt_void(const int *accum) { }
1946a0334d8901576e20db68e15930a19f8f789cb8David Gross
2046a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter must return bool
2146a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_int) accumulator(AccumInt) halter(halt_int)
2246a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic int halt_int(const int *accum) { return 0; }
2346a0334d8901576e20db68e15930a19f8f789cb8David Gross
2446a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter must take exactly 1 parameter
2546a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt0) accumulator(AccumInt) halter(halt0)
2646a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic bool halt0() { return false; }
2746a0334d8901576e20db68e15930a19f8f789cb8David Gross
2846a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter must take exactly 1 parameter
2946a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt2) accumulator(AccumInt) halter(halt2)
3046a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic bool halt2(const int *accum, const int *accum2) { return false; }
3146a0334d8901576e20db68e15930a19f8f789cb8David Gross
3246a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter cannot take special parameter
3346a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_special) accumulator(AccumInt) halter(halt_special)
3446a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic bool halt_special(const int *context) { return false; }
3546a0334d8901576e20db68e15930a19f8f789cb8David Gross
3646a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter and accumulator must take pointers to same type
3746a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_vs_accum) accumulator(AccumInt) halter(hva_halt)
3846a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic bool hva_halt(const unsigned *accum) { return false; }
3946a0334d8901576e20db68e15930a19f8f789cb8David Gross
4046a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter may be overloadable . . .
4146a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_over) accumulator(AccumInt) halter(halt_over)
4246a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic __attribute__((overloadable)) bool halt_over(const int *accum) { return false; }
4346a0334d8901576e20db68e15930a19f8f789cb8David Gross
4446a0334d8901576e20db68e15930a19f8f789cb8David Gross// . . . but halter must not have duplicate definitions
4546a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_dup) accumulator(AccumInt) halter(halt_dup)
4646a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic __attribute__((overloadable)) bool halt_dup(const int *accum) { return false; }
4746a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic __attribute__((overloadable)) bool halt_dup(const unsigned int *accum) { return false; }
4846a0334d8901576e20db68e15930a19f8f789cb8David Gross
4946a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter must be present
5046a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_missing) accumulator(AccumInt) halter(halt_missing)
5146a0334d8901576e20db68e15930a19f8f789cb8David Gross
5246a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter must be static
5346a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_nonstatic) accumulator(AccumInt) halter(halt_nonstatic)
5446a0334d8901576e20db68e15930a19f8f789cb8David Grossbool halt_nonstatic(const int *accum) { return false; }
5546a0334d8901576e20db68e15930a19f8f789cb8David Gross
5646a0334d8901576e20db68e15930a19f8f789cb8David Gross// halter parameter must point to const
5746a0334d8901576e20db68e15930a19f8f789cb8David Gross#pragma rs reduce(halt_const) accumulator(AccumInt) halter(halt_const)
5846a0334d8901576e20db68e15930a19f8f789cb8David Grossstatic bool halt_const(int *accum) { return false; }
59