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