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