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 
   6 int g(int);
   7 int h(int) __attribute__((pure));
   8 int i(int) __attribute__((const));
   9 
  10 static 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
  30 builtin_safe1.c:13:3: warning: Macro argument with side effects: x++
  31 builtin_safe1.c:14:3: warning: Macro argument with side effects: x+=1
  32 builtin_safe1.c:15:3: warning: Macro argument with side effects: x=x+1
  33 builtin_safe1.c:16:3: warning: Macro argument with side effects: x%=y
  34 builtin_safe1.c:17:3: warning: Macro argument with side effects: x=y
  35 builtin_safe1.c:18:3: warning: Macro argument with side effects: g(x)
  36 builtin_safe1.c:19:3: warning: Macro argument with side effects: (y,g(x))
  37  * check-error-end
  38  */