1 /* Test __builtin_{add,sub,mul}_overflow_p.  */
2 /* { dg-do run } */
3 /* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
4 
5 #include "builtin-arith-overflow.h"
6 
7 #ifdef __SIZEOF_INT128__
8 #define WTYPE __int128
9 #else
10 #define WTYPE long long int
11 #endif
12 
13 struct S
14 {
15   signed int s1 : 1;
16   unsigned int u1 : 1;
17   signed int s2 : 2;
18   unsigned int u2 : 2;
19   signed int s3 : 3;
20   unsigned int u3 : 3;
21   signed int s4 : 4;
22   unsigned int u4 : 4;
23   signed int s5 : 5;
24   unsigned int u5 : 5;
25   signed int s6 : 6;
26   unsigned int u6 : 6;
27   signed int s7 : 7;
28   unsigned int u7 : 7;
29 } vs;
30 
31 #define TESTS \
32 TP (100, signed char, signed char, vs.u2, -1, 0, add, 1) \
33 TP (101, unsigned char, unsigned char, vs.u4, 5, 5, add, 0) \
34 TP (102, unsigned char, unsigned char, vs.u3, 5, 3, add, 1) \
35 TP (103, signed char, unsigned short, vs.u1, 5, 5, sub, 0) \
36 TP (104, signed char, unsigned short, vs.u1, 6, 5, sub, 0) \
37 TP (105, signed char, unsigned short, vs.u1, 7, 5, sub, 1) \
38 TP (106, signed char, unsigned short, vs.u4, 5, 6, sub, 1) \
39 TP (107, signed char, signed char, vs.u1, -1, -1, mul, 0) \
40 TP (108, signed char, signed char, vs.s1, -1, -1, mul, 1) \
41 TP (109, unsigned char, signed char, vs.u6, 17, -2, mul, 1) \
42 TP (110, unsigned char, signed char, vs.s6, 17, -2, mul, 1) \
43 TP (111, unsigned char, signed char, vs.s7, 17, -2, mul, 0) \
44 TP (112, unsigned WTYPE, signed WTYPE, vs.s5, 5, -2, mul, 0) \
45 TP (113, unsigned WTYPE, signed WTYPE, vs.s4, 5, -2, mul, 1) \
46 TP (114, long long int, long long int, vs.u2, -3, 5, add, 0) \
47 TP (115, long long int, long long int, vs.u1, -3, 5, add, 1) \
48 TP (116, long long int, int, vs.u3, -5, 3, add, 1) \
49 TP (117, long long int, int, vs.s1, -5, 3, add, 1) \
50 TP (118, long long int, int, vs.s2, -5, 3, add, 0) \
51 TP (119, int, WTYPE, vs.u2, -3, 5, add, 0) \
52 TP (120, int, WTYPE, vs.u1, -3, 5, add, 1) \
53 TP (121, unsigned char, unsigned char, vs.u6, SCHAR_MAX - 1, (unsigned char) SCHAR_MAX + 4, sub, 1) \
54 TP (122, unsigned char, unsigned char, vs.s3, SCHAR_MAX - 1, (unsigned char) SCHAR_MAX + 4, sub, 1) \
55 TP (123, unsigned char, unsigned char, vs.s4, SCHAR_MAX - 1, (unsigned char) SCHAR_MAX + 4, sub, 0) \
56 TP (124, unsigned int, unsigned int, vs.u7, INT_MAX, 1, add, 1) \
57 TP (125, unsigned int, unsigned int, vs.u7, 127, 1, add, 1) \
58 TP (126, unsigned int, unsigned int, vs.u7, 1, 63, add, 0) \
59 TP (127, int, int, vs.s7, INT_MIN, 1, sub, 1) \
60 TP (128, int, int, vs.s7, -64, 1, sub, 1) \
61 TP (129, int, int, vs.s7, -63, 1, sub, 0)
62 
63 TESTS
64 
65 #undef TP
66 #define TP(n, t1, t2, er, v1, v2, b, o) t##n##b ();
67 
68 int
main()69 main ()
70 {
71   TESTS
72   return 0;
73 }
74