1#define MY_MACRO(a) do { \ 2 __builtin_warning(!__builtin_safe_p(a), "Macro argument with side effects: " #a); \ 3 a; \ 4 } while (0) 5 6int g(int); 7int h(int) __attribute__((pure)); 8int i(int) __attribute__((const)); 9 10static int foo(int x, int y) 11{ 12 /* unsafe: */ 13 MY_MACRO(x++); 14 MY_MACRO(x+=1); 15 MY_MACRO(x=x+1); 16 MY_MACRO(x%=y); 17 MY_MACRO(x=y); 18 MY_MACRO(g(x)); 19 MY_MACRO((y,g(x))); 20 /* safe: */ 21 MY_MACRO(x+1); 22 MY_MACRO(h(x)); 23 MY_MACRO(i(x)); 24 return x; 25} 26 27/* 28 * check-name: __builtin_safe 29 * check-error-start 30builtin_safe1.c:13:3: warning: Macro argument with side effects: x++ 31builtin_safe1.c:14:3: warning: Macro argument with side effects: x+=1 32builtin_safe1.c:15:3: warning: Macro argument with side effects: x=x+1 33builtin_safe1.c:16:3: warning: Macro argument with side effects: x%=y 34builtin_safe1.c:17:3: warning: Macro argument with side effects: x=y 35builtin_safe1.c:18:3: warning: Macro argument with side effects: g(x) 36builtin_safe1.c:19:3: warning: Macro argument with side effects: (y,g(x)) 37 * check-error-end 38 */ 39