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)
    }
}
