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