1 /* Test __builtin_{add,sub}_overflow on {,un}signed char. */
3 /* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */
5 #define UCHAR_MAX ((unsigned char) ~0)
8 typedef unsigned char U
;
11 #define S_MAX __SCHAR_MAX__
12 #define S_MIN (-__SCHAR_MAX__ - 1)
13 #define COND (__SIZEOF_INT__ > 1)
16 #define F(n, t1, t2, tr, b) \
17 __attribute__((noinline, noclone)) tr \
18 n (t1 x, t2 y, int *ovf) \
21 *ovf = __builtin_##b##_overflow (x, y, &res); \
25 F (spses
, S
, S
, S
, add
)
26 F (upueu
, U
, U
, U
, add
)
27 F (spseu
, S
, S
, U
, add
)
28 F (upues
, U
, U
, S
, add
)
29 F (spues
, S
, U
, S
, add
)
30 F (upses
, U
, S
, S
, add
)
31 F (spueu
, S
, U
, U
, add
)
32 F (upseu
, U
, S
, U
, add
)
33 F (ssses
, S
, S
, S
, sub
)
34 F (usueu
, U
, U
, U
, sub
)
35 F (ssseu
, S
, S
, U
, sub
)
36 F (usues
, U
, U
, S
, sub
)
37 F (ssues
, S
, U
, S
, sub
)
38 F (usses
, U
, S
, S
, sub
)
39 F (ssueu
, S
, U
, U
, sub
)
40 F (usseu
, U
, S
, U
, sub
)
47 for (i
= 0; i
< UCHAR_MAX
; i
++)
48 for (j
= 0; j
< UCHAR_MAX
; j
++)
50 S s1
= ((W
) i
<< SHIFT
) + S_MIN
;
51 U u1
= ((W
) i
<< SHIFT
);
52 S s2
= ((W
) j
<< SHIFT
) + S_MIN
;
53 U u2
= ((W
) j
<< SHIFT
);
56 #define T(n, t1, t2, tr, op) \
57 w = ((W) t1##1) op ((W) t2##2); \
58 if (n (t1##1, t2##2, &ovf) != (tr) w \
59 || ovf != (w != (tr) w)) \