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