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 Levon static 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