1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
3 
4 #include <stdbool.h>
5 
my_uadd_overflow(unsigned char a,unsigned char b,unsigned char * res)6 bool my_uadd_overflow (unsigned char a, unsigned char b, unsigned char *res)
7 {
8   return __builtin_add_overflow (a, b, res);
9 }
10 
my_usub_overflow(unsigned char a,unsigned char b,unsigned char * res)11 bool my_usub_overflow (unsigned char a, unsigned char b, unsigned char *res)
12 {
13   return __builtin_sub_overflow (a, b, res);
14 }
15 
my_uneg_overflow(unsigned char a,unsigned char * res)16 bool my_uneg_overflow (unsigned char a, unsigned char *res)
17 {
18   return __builtin_sub_overflow (0, a, res);
19 }
20 
my_add_overflow(signed char a,signed char b,signed char * res)21 bool my_add_overflow (signed char a, signed char b, signed char *res)
22 {
23   return __builtin_add_overflow (a, b, res);
24 }
25 
my_sub_overflow(signed char a,signed char b,signed char * res)26 bool my_sub_overflow (signed char a, signed char b, signed char *res)
27 {
28   return __builtin_sub_overflow (a, b, res);
29 }
30 
my_neg_overflow(signed char a,signed char * res)31 bool my_neg_overflow (signed char a, signed char *res)
32 {
33   return __builtin_sub_overflow (0, a, res);
34 }
35 
36 /* { dg-final { scan-assembler-times "add.b" 2 } } */
37 /* { dg-final { scan-assembler-times "sub.b" 4 } } */
38 /* { dg-final { scan-assembler-not "cmp.b" } } */
39