1/* { dg-do run } */
2/* { dg-options "-fsanitize=signed-integer-overflow -fno-sanitize-recover=signed-integer-overflow" } */
3
4#ifndef ASM1
5# define ASM1(a) /* Nothing */
6#endif
7#ifndef ASM2
8# define ASM2(a, b) /* Nothing */
9#endif
10
11#define CHECK(A, B) ({ if ((A) != (B)) __builtin_abort (); })
12
13#define FN1(T1, T2, OP)				\
14  ({						\
15    T1 a = 14;					\
16    T2 b = 9;					\
17    ASM2 (a, b);				\
18    a OP b;					\
19  })
20
21#define FN2(T, OP)				\
22  ({						\
23    T a = 14;					\
24    ASM1 (a);					\
25    a OP 7;					\
26  })
27
28#define FN3(T1, T2, OP)				\
29  ({						\
30    T1 a = 4;					\
31    T2 b = 1;					\
32    ASM2 (a, b);				\
33    ~a OP b;					\
34  })
35
36#define FN4(T1, T2, OP)				\
37  ({						\
38    T1 a = 4;					\
39    T2 b = 1;					\
40    ASM2 (a, b);				\
41    a OP ~b;					\
42  })
43
44#define FN5(T)					\
45  ({						\
46    T a = 77;					\
47    ASM1 (a);					\
48    -a;						\
49  })
50
51int
52main (void)
53{
54  CHECK (FN1 (char, char, +), 23);
55  CHECK (FN1 (char, char, -), 5);
56  CHECK (FN1 (char, char, *), 126);
57  CHECK (FN1 (unsigned char, unsigned char, +), 23);
58  CHECK (FN1 (unsigned char, unsigned char, -), 5);
59  CHECK (FN1 (unsigned char, unsigned char, *), 126);
60  CHECK (FN1 (short, short, +), 23);
61  CHECK (FN1 (short, short, -), 5);
62  CHECK (FN1 (short, short, *), 126);
63  CHECK (FN1 (unsigned short, unsigned short, +), 23);
64  CHECK (FN1 (unsigned short, unsigned short, -), 5);
65  CHECK (FN1 (unsigned short, unsigned short, *), 126);
66  CHECK (FN1 (int, int, +), 23);
67  CHECK (FN1 (int, int, -), 5);
68  CHECK (FN1 (int, int, *), 126);
69  CHECK (FN1 (unsigned int, unsigned int, +), 23);
70  CHECK (FN1 (unsigned int, unsigned int, -), 5);
71  CHECK (FN1 (unsigned int, unsigned int, *), 126);
72  CHECK (FN1 (long int, long int, +), 23);
73  CHECK (FN1 (long int, long int, -), 5);
74  CHECK (FN1 (long int, long int, *), 126);
75  CHECK (FN1 (unsigned long int, unsigned long int, +), 23);
76  CHECK (FN1 (unsigned long int, unsigned long int, -), 5);
77  CHECK (FN1 (unsigned long int, unsigned long int, *), 126);
78  CHECK (FN1 (long long int, long int, +), 23);
79  CHECK (FN1 (long long int, long int, -), 5);
80  CHECK (FN1 (long long int, long int, *), 126);
81  CHECK (FN1 (unsigned long long int, unsigned long long int, +), 23);
82  CHECK (FN1 (unsigned long long int, unsigned long long int, -), 5);
83  CHECK (FN1 (unsigned long long int, unsigned long long int, *), 126);
84  CHECK (FN1 (int, unsigned char, +), 23);
85  CHECK (FN1 (int, unsigned char, -), 5);
86  CHECK (FN1 (int, unsigned char, *), 126);
87  CHECK (FN1 (unsigned char, int, +), 23);
88  CHECK (FN1 (unsigned char, int, -), 5);
89  CHECK (FN1 (unsigned char, int, *), 126);
90  CHECK (FN1 (int, long int, +), 23);
91  CHECK (FN1 (int, long int, -), 5);
92  CHECK (FN1 (int, long int, *), 126);
93  CHECK (FN1 (long int, int, +), 23);
94  CHECK (FN1 (long int, int, -), 5);
95  CHECK (FN1 (long int, int, *), 126);
96  CHECK (FN1 (unsigned int, int, +), 23);
97  CHECK (FN1 (unsigned int, int, -), 5);
98  CHECK (FN1 (unsigned int, int, *), 126);
99  CHECK (FN1 (int, unsigned int, +), 23);
100  CHECK (FN1 (int, unsigned int, -), 5);
101  CHECK (FN1 (int, unsigned int, *), 126);
102  CHECK (FN1 (unsigned long int, int, +), 23);
103  CHECK (FN1 (unsigned long int, int, -), 5);
104  CHECK (FN1 (unsigned long int, int, *), 126);
105  CHECK (FN1 (int, unsigned long int, +), 23);
106  CHECK (FN1 (int, unsigned long int, -), 5);
107  CHECK (FN1 (int, unsigned long int, *), 126);
108
109  CHECK (FN2 (char, +), 21);
110  CHECK (FN2 (char, -), 7);
111  CHECK (FN2 (char, *), 98);
112  CHECK (FN2 (unsigned char, +), 21);
113  CHECK (FN2 (unsigned char, -), 7);
114  CHECK (FN2 (unsigned char, *), 98);
115  CHECK (FN2 (short, +), 21);
116  CHECK (FN2 (short, -), 7);
117  CHECK (FN2 (short, *), 98);
118  CHECK (FN2 (unsigned short, +), 21);
119  CHECK (FN2 (unsigned short, -), 7);
120  CHECK (FN2 (unsigned short, *), 98);
121  CHECK (FN2 (int, +), 21);
122  CHECK (FN2 (int, -), 7);
123  CHECK (FN2 (int, *), 98);
124  CHECK (FN2 (unsigned int, +), 21);
125  CHECK (FN2 (unsigned int, -), 7);
126  CHECK (FN2 (unsigned int, *), 98);
127  CHECK (FN2 (long int, +), 21);
128  CHECK (FN2 (long int, -), 7);
129  CHECK (FN2 (long int, *), 98);
130  CHECK (FN2 (unsigned long int, +), 21);
131  CHECK (FN2 (unsigned long int, -), 7);
132  CHECK (FN2 (unsigned long int, *), 98);
133  CHECK (FN2 (long long int, +), 21);
134  CHECK (FN2 (long long int, -), 7);
135  CHECK (FN2 (long long int, *), 98);
136  CHECK (FN2 (unsigned long long int, +), 21);
137  CHECK (FN2 (unsigned long long int, -), 7);
138  CHECK (FN2 (unsigned long long int, *), 98);
139
140  CHECK (FN3 (char, char, +), -4);
141  CHECK (FN3 (char, char, -), -6);
142  CHECK (FN3 (char, char, *), -5);
143  CHECK (FN3 (unsigned char, unsigned char, +), -4);
144  CHECK (FN3 (unsigned char, unsigned char, -), -6);
145  CHECK (FN3 (unsigned char, unsigned char, *), -5);
146  CHECK (FN3 (short, short, +), -4);
147  CHECK (FN3 (short, short, -), -6);
148  CHECK (FN3 (short, short, *), -5);
149  CHECK (FN3 (unsigned short, unsigned short, +), -4);
150  CHECK (FN3 (unsigned short, unsigned short, -), -6);
151  CHECK (FN3 (unsigned short, unsigned short, *), -5);
152  CHECK (FN3 (int, int, +), -4);
153  CHECK (FN3 (int, int, -), -6);
154  CHECK (FN3 (int, int, *), -5);
155  CHECK (FN3 (unsigned int, unsigned int, +), -4);
156  CHECK (FN3 (unsigned int, unsigned int, -), -6);
157  CHECK (FN3 (unsigned int, unsigned int, *), -5);
158  CHECK (FN3 (long int, long int, +), -4);
159  CHECK (FN3 (long int, long int, -), -6);
160  CHECK (FN3 (long int, long int, *), -5);
161  CHECK (FN3 (unsigned long int, unsigned long int, +), -4);
162  CHECK (FN3 (unsigned long int, unsigned long int, -), -6);
163  CHECK (FN3 (unsigned long int, unsigned long int, *), -5);
164  CHECK (FN3 (long long int, long int, +), -4);
165  CHECK (FN3 (long long int, long int, -), -6);
166  CHECK (FN3 (long long int, long int, *), -5);
167  CHECK (FN3 (unsigned long long int, unsigned long long int, +), -4);
168  CHECK (FN3 (unsigned long long int, unsigned long long int, -), -6);
169  CHECK (FN3 (unsigned long long int, unsigned long long int, *), -5);
170  CHECK (FN3 (int, unsigned char, +), -4);
171  CHECK (FN3 (int, unsigned char, -), -6);
172  CHECK (FN3 (int, unsigned char, *), -5);
173  CHECK (FN3 (unsigned char, int, +), -4);
174  CHECK (FN3 (unsigned char, int, -), -6);
175  CHECK (FN3 (unsigned char, int, *), -5);
176  CHECK (FN3 (int, long int, +), -4);
177  CHECK (FN3 (int, long int, -), -6);
178  CHECK (FN3 (int, long int, *), -5);
179  CHECK (FN3 (long int, int, +), -4);
180  CHECK (FN3 (long int, int, -), -6);
181  CHECK (FN3 (long int, int, *), -5);
182  CHECK (FN3 (unsigned int, int, +), -4);
183  CHECK (FN3 (unsigned int, int, -), -6);
184  CHECK (FN3 (unsigned int, int, *), -5);
185  CHECK (FN3 (int, unsigned int, +), -4);
186  CHECK (FN3 (int, unsigned int, -), -6);
187  CHECK (FN3 (int, unsigned int, *), -5);
188  CHECK (FN3 (unsigned long int, int, +), -4);
189  CHECK (FN3 (unsigned long int, int, -), -6);
190  CHECK (FN3 (unsigned long int, int, *), -5);
191  CHECK (FN3 (int, unsigned long int, +), -4);
192  CHECK (FN3 (int, unsigned long int, -), -6);
193  CHECK (FN3 (int, unsigned long int, *), -5);
194
195  CHECK (FN4 (char, char, +), 2);
196  CHECK (FN4 (char, char, -), 6);
197  CHECK (FN4 (char, char, *), -8);
198  CHECK (FN4 (unsigned char, unsigned char, +), 2);
199  CHECK (FN4 (unsigned char, unsigned char, -), 6);
200  CHECK (FN4 (unsigned char, unsigned char, *), -8);
201  CHECK (FN4 (short, short, +), 2);
202  CHECK (FN4 (short, short, -), 6);
203  CHECK (FN4 (short, short, *), -8);
204  CHECK (FN4 (unsigned short, unsigned short, +), 2);
205  CHECK (FN4 (unsigned short, unsigned short, -), 6);
206  CHECK (FN4 (unsigned short, unsigned short, *), -8);
207  CHECK (FN4 (int, int, +), 2);
208  CHECK (FN4 (int, int, -), 6);
209  CHECK (FN4 (int, int, *), -8);
210  CHECK (FN4 (unsigned int, unsigned int, +), 2);
211  CHECK (FN4 (unsigned int, unsigned int, -), 6);
212  CHECK (FN4 (unsigned int, unsigned int, *), -8);
213  CHECK (FN4 (long int, long int, +), 2);
214  CHECK (FN4 (long int, long int, -), 6);
215  CHECK (FN4 (long int, long int, *), -8);
216  CHECK (FN4 (unsigned long int, unsigned long int, +), 2);
217  CHECK (FN4 (unsigned long int, unsigned long int, -), 6);
218  CHECK (FN4 (unsigned long int, unsigned long int, *), -8);
219  CHECK (FN4 (long long int, long int, +), 2);
220  CHECK (FN4 (long long int, long int, -), 6);
221  CHECK (FN4 (long long int, long int, *), -8);
222  CHECK (FN4 (unsigned long long int, unsigned long long int, +), 2);
223  CHECK (FN4 (unsigned long long int, unsigned long long int, -), 6);
224  CHECK (FN4 (unsigned long long int, unsigned long long int, *), -8);
225  CHECK (FN4 (int, unsigned char, +), 2);
226  CHECK (FN4 (int, unsigned char, -), 6);
227  CHECK (FN4 (int, unsigned char, *), -8);
228  CHECK (FN4 (unsigned char, int, +), 2);
229  CHECK (FN4 (unsigned char, int, -), 6);
230  CHECK (FN4 (unsigned char, int, *), -8);
231  CHECK (FN4 (int, long int, +), 2);
232  CHECK (FN4 (int, long int, -), 6);
233  CHECK (FN4 (int, long int, *), -8);
234  CHECK (FN4 (long int, int, +), 2);
235  CHECK (FN4 (long int, int, -), 6);
236  CHECK (FN4 (long int, int, *), -8);
237  CHECK (FN4 (unsigned int, int, +), 2);
238  CHECK (FN4 (unsigned int, int, -), 6);
239  CHECK (FN4 (unsigned int, int, *), -8);
240  CHECK (FN4 (int, unsigned int, +), 2);
241  CHECK (FN4 (int, unsigned int, -), 6);
242  CHECK (FN4 (int, unsigned int, *), -8);
243  CHECK (FN4 (unsigned long int, int, +), 2);
244  CHECK (FN4 (unsigned long int, int, -), 6);
245  CHECK (FN4 (unsigned long int, int, *), -8);
246  CHECK (FN4 (int, unsigned long int, +), 2);
247  CHECK (FN4 (int, unsigned long int, -), 6);
248  CHECK (FN4 (int, unsigned long int, *), -8);
249
250  CHECK (FN5 (char), -77);
251  CHECK (FN5 (unsigned char), -77);
252  CHECK (FN5 (short), -77);
253  CHECK (FN5 (unsigned short), -77);
254  CHECK (FN5 (int), -77);
255  CHECK (FN5 (unsigned int), -77);
256  CHECK (FN5 (long int), -77);
257  CHECK (FN5 (unsigned long int), -77);
258  CHECK (FN5 (long long int), -77);
259  CHECK (FN5 (unsigned long long int), -77);
260  return 0;
261}
262