1*c85f09ccSJohn Levon enum e { OK, KO = -1 };
2*c85f09ccSJohn Levon typedef _Bool bool;
3*c85f09ccSJohn Levon 
test(int i,long l,long long ll,enum e e,bool b,void * p)4*c85f09ccSJohn Levon static int test(int i, long l, long long ll, enum e e, bool b, void *p)
5*c85f09ccSJohn Levon {
6*c85f09ccSJohn Levon 	int rc = 0;
7*c85f09ccSJohn Levon 
8*c85f09ccSJohn Levon 	// should be OK
9*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, &i);
10*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(l, i, &i);
11*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, l, &i);
12*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, &l);
13*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(ll, i, &i);
14*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, ll, &i);
15*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, &ll);
16*c85f09ccSJohn Levon 
17*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, i);
18*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(l, i, i);
19*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, l, i);
20*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, l);
21*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(ll, i, i);
22*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, ll, i);
23*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, ll);
24*c85f09ccSJohn Levon 
25*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, &i);
26*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(l, i, &i);
27*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, l, &i);
28*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, &l);
29*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(ll, i, &i);
30*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, ll, &i);
31*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, &ll);
32*c85f09ccSJohn Levon 
33*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, i);
34*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(l, i, i);
35*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, l, i);
36*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, l);
37*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(ll, i, i);
38*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, ll, i);
39*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, ll);
40*c85f09ccSJohn Levon 
41*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, &i);
42*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(l, i, &i);
43*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, l, &i);
44*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, &l);
45*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(ll, i, &i);
46*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, ll, &i);
47*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, &ll);
48*c85f09ccSJohn Levon 
49*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, i);
50*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(l, i, i);
51*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, l, i);
52*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, l);
53*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(ll, i, i);
54*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, ll, i);
55*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, ll);
56*c85f09ccSJohn Levon 
57*c85f09ccSJohn Levon 	// should be KO
58*c85f09ccSJohn Levon 	rc += __builtin_add_overflow();
59*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i);
60*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i);
61*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, &i, i);
62*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(e, i, &i);
63*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, e, &i);
64*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, &e);
65*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(b, i, &i);
66*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, b, &i);
67*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, &b);
68*c85f09ccSJohn Levon 	rc += __builtin_add_overflow(i, i, p);
69*c85f09ccSJohn Levon 
70*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p();
71*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i);
72*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i);
73*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, i, i);
74*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(e, i, i);
75*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, e, i);
76*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, e);
77*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(b, i, i);
78*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, b, i);
79*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, b);
80*c85f09ccSJohn Levon 	rc += __builtin_add_overflow_p(i, i, p);
81*c85f09ccSJohn Levon 
82*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow();
83*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i);
84*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i);
85*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, &i, i);
86*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(e, i, &i);
87*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, e, &i);
88*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, &e);
89*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(b, i, &i);
90*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, b, &i);
91*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, &b);
92*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow(i, i, p);
93*c85f09ccSJohn Levon 
94*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p();
95*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i);
96*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i);
97*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, i, i);
98*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(e, i, i);
99*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, e, i);
100*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, e);
101*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(b, i, i);
102*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, b, i);
103*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, b);
104*c85f09ccSJohn Levon 	rc += __builtin_sub_overflow_p(i, i, p);
105*c85f09ccSJohn Levon 
106*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow();
107*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i);
108*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i);
109*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, &i, i);
110*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(e, i, &i);
111*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, e, &i);
112*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, &e);
113*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(b, i, &i);
114*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, b, &i);
115*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, &b);
116*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow(i, i, p);
117*c85f09ccSJohn Levon 
118*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p();
119*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i);
120*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i);
121*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, i, i);
122*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(e, i, i);
123*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, e, i);
124*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, e);
125*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(b, i, i);
126*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, b, i);
127*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, b);
128*c85f09ccSJohn Levon 	rc += __builtin_mul_overflow_p(i, i, p);
129*c85f09ccSJohn Levon 
130*c85f09ccSJohn Levon 	return rc;
131*c85f09ccSJohn Levon }
132*c85f09ccSJohn Levon 
133*c85f09ccSJohn Levon /*
134*c85f09ccSJohn Levon  * check-name: builtin-overflow
135*c85f09ccSJohn Levon  *
136*c85f09ccSJohn Levon  * check-error-start
137*c85f09ccSJohn Levon builtin-overflow.c:58:37: error: not enough arguments for __builtin_add_overflow
138*c85f09ccSJohn Levon builtin-overflow.c:59:37: error: not enough arguments for __builtin_add_overflow
139*c85f09ccSJohn Levon builtin-overflow.c:60:37: error: not enough arguments for __builtin_add_overflow
140*c85f09ccSJohn Levon builtin-overflow.c:61:37: error: too many arguments for __builtin_add_overflow
141*c85f09ccSJohn Levon builtin-overflow.c:62:38: error: invalid type for argument 1:
142*c85f09ccSJohn Levon builtin-overflow.c:62:38:         int enum e e
143*c85f09ccSJohn Levon builtin-overflow.c:63:41: error: invalid type for argument 2:
144*c85f09ccSJohn Levon builtin-overflow.c:63:41:         int enum e e
145*c85f09ccSJohn Levon builtin-overflow.c:64:45: error: invalid type for argument 3:
146*c85f09ccSJohn Levon builtin-overflow.c:64:45:         int enum e *
147*c85f09ccSJohn Levon builtin-overflow.c:65:38: error: invalid type for argument 1:
148*c85f09ccSJohn Levon builtin-overflow.c:65:38:         bool [usertype] b
149*c85f09ccSJohn Levon builtin-overflow.c:66:41: error: invalid type for argument 2:
150*c85f09ccSJohn Levon builtin-overflow.c:66:41:         bool [usertype] b
151*c85f09ccSJohn Levon builtin-overflow.c:67:45: error: invalid type for argument 3:
152*c85f09ccSJohn Levon builtin-overflow.c:67:45:         bool *
153*c85f09ccSJohn Levon builtin-overflow.c:68:44: error: invalid type for argument 3:
154*c85f09ccSJohn Levon builtin-overflow.c:68:44:         void *p
155*c85f09ccSJohn Levon builtin-overflow.c:70:39: error: not enough arguments for __builtin_add_overflow_p
156*c85f09ccSJohn Levon builtin-overflow.c:71:39: error: not enough arguments for __builtin_add_overflow_p
157*c85f09ccSJohn Levon builtin-overflow.c:72:39: error: not enough arguments for __builtin_add_overflow_p
158*c85f09ccSJohn Levon builtin-overflow.c:73:39: error: too many arguments for __builtin_add_overflow_p
159*c85f09ccSJohn Levon builtin-overflow.c:74:40: error: invalid type for argument 1:
160*c85f09ccSJohn Levon builtin-overflow.c:74:40:         int enum e [addressable] e
161*c85f09ccSJohn Levon builtin-overflow.c:75:43: error: invalid type for argument 2:
162*c85f09ccSJohn Levon builtin-overflow.c:75:43:         int enum e [addressable] e
163*c85f09ccSJohn Levon builtin-overflow.c:76:46: error: invalid type for argument 3:
164*c85f09ccSJohn Levon builtin-overflow.c:76:46:         int enum e [addressable] e
165*c85f09ccSJohn Levon builtin-overflow.c:77:40: error: invalid type for argument 1:
166*c85f09ccSJohn Levon builtin-overflow.c:77:40:         bool [addressable] [usertype] b
167*c85f09ccSJohn Levon builtin-overflow.c:78:43: error: invalid type for argument 2:
168*c85f09ccSJohn Levon builtin-overflow.c:78:43:         bool [addressable] [usertype] b
169*c85f09ccSJohn Levon builtin-overflow.c:79:46: error: invalid type for argument 3:
170*c85f09ccSJohn Levon builtin-overflow.c:79:46:         bool [addressable] [usertype] b
171*c85f09ccSJohn Levon builtin-overflow.c:80:46: error: invalid type for argument 3:
172*c85f09ccSJohn Levon builtin-overflow.c:80:46:         void *p
173*c85f09ccSJohn Levon builtin-overflow.c:82:37: error: not enough arguments for __builtin_sub_overflow
174*c85f09ccSJohn Levon builtin-overflow.c:83:37: error: not enough arguments for __builtin_sub_overflow
175*c85f09ccSJohn Levon builtin-overflow.c:84:37: error: not enough arguments for __builtin_sub_overflow
176*c85f09ccSJohn Levon builtin-overflow.c:85:37: error: too many arguments for __builtin_sub_overflow
177*c85f09ccSJohn Levon builtin-overflow.c:86:38: error: invalid type for argument 1:
178*c85f09ccSJohn Levon builtin-overflow.c:86:38:         int enum e [addressable] e
179*c85f09ccSJohn Levon builtin-overflow.c:87:41: error: invalid type for argument 2:
180*c85f09ccSJohn Levon builtin-overflow.c:87:41:         int enum e [addressable] e
181*c85f09ccSJohn Levon builtin-overflow.c:88:45: error: invalid type for argument 3:
182*c85f09ccSJohn Levon builtin-overflow.c:88:45:         int enum e *
183*c85f09ccSJohn Levon builtin-overflow.c:89:38: error: invalid type for argument 1:
184*c85f09ccSJohn Levon builtin-overflow.c:89:38:         bool [addressable] [usertype] b
185*c85f09ccSJohn Levon builtin-overflow.c:90:41: error: invalid type for argument 2:
186*c85f09ccSJohn Levon builtin-overflow.c:90:41:         bool [addressable] [usertype] b
187*c85f09ccSJohn Levon builtin-overflow.c:91:45: error: invalid type for argument 3:
188*c85f09ccSJohn Levon builtin-overflow.c:91:45:         bool *
189*c85f09ccSJohn Levon builtin-overflow.c:92:44: error: invalid type for argument 3:
190*c85f09ccSJohn Levon builtin-overflow.c:92:44:         void *p
191*c85f09ccSJohn Levon builtin-overflow.c:94:39: error: not enough arguments for __builtin_sub_overflow_p
192*c85f09ccSJohn Levon builtin-overflow.c:95:39: error: not enough arguments for __builtin_sub_overflow_p
193*c85f09ccSJohn Levon builtin-overflow.c:96:39: error: not enough arguments for __builtin_sub_overflow_p
194*c85f09ccSJohn Levon builtin-overflow.c:97:39: error: too many arguments for __builtin_sub_overflow_p
195*c85f09ccSJohn Levon builtin-overflow.c:98:40: error: invalid type for argument 1:
196*c85f09ccSJohn Levon builtin-overflow.c:98:40:         int enum e [addressable] e
197*c85f09ccSJohn Levon builtin-overflow.c:99:43: error: invalid type for argument 2:
198*c85f09ccSJohn Levon builtin-overflow.c:99:43:         int enum e [addressable] e
199*c85f09ccSJohn Levon builtin-overflow.c:100:46: error: invalid type for argument 3:
200*c85f09ccSJohn Levon builtin-overflow.c:100:46:         int enum e [addressable] e
201*c85f09ccSJohn Levon builtin-overflow.c:101:40: error: invalid type for argument 1:
202*c85f09ccSJohn Levon builtin-overflow.c:101:40:         bool [addressable] [usertype] b
203*c85f09ccSJohn Levon builtin-overflow.c:102:43: error: invalid type for argument 2:
204*c85f09ccSJohn Levon builtin-overflow.c:102:43:         bool [addressable] [usertype] b
205*c85f09ccSJohn Levon builtin-overflow.c:103:46: error: invalid type for argument 3:
206*c85f09ccSJohn Levon builtin-overflow.c:103:46:         bool [addressable] [usertype] b
207*c85f09ccSJohn Levon builtin-overflow.c:104:46: error: invalid type for argument 3:
208*c85f09ccSJohn Levon builtin-overflow.c:104:46:         void *p
209*c85f09ccSJohn Levon builtin-overflow.c:106:37: error: not enough arguments for __builtin_mul_overflow
210*c85f09ccSJohn Levon builtin-overflow.c:107:37: error: not enough arguments for __builtin_mul_overflow
211*c85f09ccSJohn Levon builtin-overflow.c:108:37: error: not enough arguments for __builtin_mul_overflow
212*c85f09ccSJohn Levon builtin-overflow.c:109:37: error: too many arguments for __builtin_mul_overflow
213*c85f09ccSJohn Levon builtin-overflow.c:110:38: error: invalid type for argument 1:
214*c85f09ccSJohn Levon builtin-overflow.c:110:38:         int enum e [addressable] e
215*c85f09ccSJohn Levon builtin-overflow.c:111:41: error: invalid type for argument 2:
216*c85f09ccSJohn Levon builtin-overflow.c:111:41:         int enum e [addressable] e
217*c85f09ccSJohn Levon builtin-overflow.c:112:45: error: invalid type for argument 3:
218*c85f09ccSJohn Levon builtin-overflow.c:112:45:         int enum e *
219*c85f09ccSJohn Levon builtin-overflow.c:113:38: error: invalid type for argument 1:
220*c85f09ccSJohn Levon builtin-overflow.c:113:38:         bool [addressable] [usertype] b
221*c85f09ccSJohn Levon builtin-overflow.c:114:41: error: invalid type for argument 2:
222*c85f09ccSJohn Levon builtin-overflow.c:114:41:         bool [addressable] [usertype] b
223*c85f09ccSJohn Levon builtin-overflow.c:115:45: error: invalid type for argument 3:
224*c85f09ccSJohn Levon builtin-overflow.c:115:45:         bool *
225*c85f09ccSJohn Levon builtin-overflow.c:116:44: error: invalid type for argument 3:
226*c85f09ccSJohn Levon builtin-overflow.c:116:44:         void *p
227*c85f09ccSJohn Levon builtin-overflow.c:118:39: error: not enough arguments for __builtin_mul_overflow_p
228*c85f09ccSJohn Levon builtin-overflow.c:119:39: error: not enough arguments for __builtin_mul_overflow_p
229*c85f09ccSJohn Levon builtin-overflow.c:120:39: error: not enough arguments for __builtin_mul_overflow_p
230*c85f09ccSJohn Levon builtin-overflow.c:121:39: error: too many arguments for __builtin_mul_overflow_p
231*c85f09ccSJohn Levon builtin-overflow.c:122:40: error: invalid type for argument 1:
232*c85f09ccSJohn Levon builtin-overflow.c:122:40:         int enum e [addressable] e
233*c85f09ccSJohn Levon builtin-overflow.c:123:43: error: invalid type for argument 2:
234*c85f09ccSJohn Levon builtin-overflow.c:123:43:         int enum e [addressable] e
235*c85f09ccSJohn Levon builtin-overflow.c:124:46: error: invalid type for argument 3:
236*c85f09ccSJohn Levon builtin-overflow.c:124:46:         int enum e [addressable] e
237*c85f09ccSJohn Levon builtin-overflow.c:125:40: error: invalid type for argument 1:
238*c85f09ccSJohn Levon builtin-overflow.c:125:40:         bool [addressable] [usertype] b
239*c85f09ccSJohn Levon builtin-overflow.c:126:43: error: invalid type for argument 2:
240*c85f09ccSJohn Levon builtin-overflow.c:126:43:         bool [addressable] [usertype] b
241*c85f09ccSJohn Levon builtin-overflow.c:127:46: error: invalid type for argument 3:
242*c85f09ccSJohn Levon builtin-overflow.c:127:46:         bool [addressable] [usertype] b
243*c85f09ccSJohn Levon builtin-overflow.c:128:46: error: invalid type for argument 3:
244*c85f09ccSJohn Levon builtin-overflow.c:128:46:         void *p
245*c85f09ccSJohn Levon  * check-error-end
246*c85f09ccSJohn Levon  */
247