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