int foo (int a) { int b = a == 0; return (a & b); } #define function(vol,cst) \ __attribute__((noipa)) \ _Bool func_##cst##_##vol(vol int a) \ { \ vol int b = a == cst; \ return (a & b); \ } #define funcdefs(cst) \ function(,cst) \ function(volatile,cst) #define funcs(f) \ f(0) \ f(1) \ f(5) funcs(funcdefs) #define test(cst) \ do { \ if(func_##cst##_(a) != func_##cst##_volatile(a))\ __builtin_abort(); \ } while(0); int main(void) { for(int a = -10; a <= 10; a++) { funcs(test) } }