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