| @@ -16,6 +16,10 @@ · 15 unmodified lines |
| 16 | 16 | |
| 17 | 17 | #endif |
| 18 | 18 | |
| 19 | +#ifndef __TINYC__ |
| 20 | +typedef __SIZE_TYPE__ uintptr_t; |
| 21 | +#endif |
| 22 | + |
| 19 | 23 | #if defined(_WIN32) |
| 20 | 24 | #define LONG_LONG_FORMAT "%lld" |
| 21 | 25 | #define ULONG_LONG_FORMAT "%llu" |
| @@ -1163,7 +1167,7 @@ void struct_test() · 1141 unmodified lines |
| 1163 | 1167 | s->f3 = 1; |
| 1164 | 1168 | printf("st2: %d %d %d\n", |
| 1165 | 1169 | s->f1, s->f2, s->f3); |
| 1166 | | − printf("str_addr=%x\n", (int)st1.str - (int)&st1.f1); |
| 1170 | + printf("str_addr=%x\n", (int)(uintptr_t)st1.str - (int)(uintptr_t)&st1.f1); |
| 1167 | 1171 | |
| 1168 | 1172 | /* align / size tests */ |
| 1169 | 1173 | printf("aligntest1 sizeof=%d alignof=%d\n", |
| @@ -1203,10 +1207,17 @@ void struct_test() · 33 unmodified lines |
| 1203 | 1207 | printf("Large: offsetof(compound_head)=%d\n", (int)((char*)&ls.compound_head - (char*)&ls)); |
| 1204 | 1208 | } |
| 1205 | 1209 | |
| 1210 | +/* simulate char/short return value with undefined upper bits */ |
| 1211 | +static int __csf(int x) { return x; } |
| 1212 | +static void *_csf = __csf; |
| 1213 | +#define csf(t,n) ((t(*)(int))_csf)(n) |
| 1214 | + |
| 1206 | 1215 | /* XXX: depend on endianness */ |
| 1207 | 1216 | void char_short_test() |
| 1208 | 1217 | { |
| 1209 | 1218 | int var1, var2; |
| 1219 | + char var3; |
| 1220 | + long long var4; |
| 1210 | 1221 | |
| 1211 | 1222 | printf("char_short:\n"); |
| 1212 | 1223 | |
| @@ -1230,6 +1241,34 @@ void char_short_test() · 17 unmodified lines |
| 1230 | 1241 | printf("var1=%x\n", var1); |
| 1231 | 1242 | *(int *)&var1 = 0x08090a0b; |
| 1232 | 1243 | printf("var1=%x\n", var1); |
| 1244 | + |
| 1245 | + var1 = 0x778899aa; |
| 1246 | + var4 = 0x11223344aa998877ULL; |
| 1247 | + var1 = var3 = var1 + 1; |
| 1248 | + var4 = var3 = var4 + 1; |
| 1249 | + printf("promote char/short assign %d "LONG_LONG_FORMAT"\n", var1, var4); |
| 1250 | + var1 = 0x778899aa; |
| 1251 | + var4 = 0x11223344aa998877ULL; |
| 1252 | + printf("promote char/short assign VA %d %d\n", var3 = var1 + 1, var3 = var4 + 1); |
| 1253 | + printf("promote char/short cast VA %d %d\n", (char)(var1 + 1), (char)(var4 + 1)); |
| 1254 | + var1 = csf(unsigned char,0x89898989); |
| 1255 | + var4 = csf(char,0xabababab); |
| 1256 | + printf("promote char/short funcret %d "LONG_LONG_FORMAT"\n", var1, var4); |
| 1257 | + printf("promote char/short fumcret VA %d %d %d %d\n", |
| 1258 | + csf(unsigned short,0xcdcdcdcd), |
| 1259 | + csf(short,0xefefefef), |
| 1260 | + csf(_Bool,0x33221100), |
| 1261 | + csf(_Bool,0x33221101)); |
| 1262 | + var3 = -10; |
| 1263 | + var1 = (char)(unsigned char)(var3 + 1); |
| 1264 | + var4 = (char)(unsigned char)(var3 + 1); |
| 1265 | + printf("promote multicast (char)(unsigned char) %d "LONG_LONG_FORMAT"\n", var1, var4); |
| 1266 | + var4 = 0x11223344aa998877ULL; |
| 1267 | + var4 = (unsigned)(int)(var4 + 1); |
| 1268 | + printf("promote multicast (unsigned)(int) "LONG_LONG_FORMAT"\n", var4); |
| 1269 | + var4 = 0x11223344bbaa9988ULL; |
| 1270 | + var4 = (unsigned)(char)(var4 + 1); |
| 1271 | + printf("promote multicast (unsigned)(char) "LONG_LONG_FORMAT"\n", var4); |
| 1233 | 1272 | } |
| 1234 | 1273 | |
| 1235 | 1274 | /******************/ |
| @@ -1679,6 +1718,10 @@ void cast_test() · 443 unmodified lines |
| 1679 | 1718 | printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a')); |
| 1680 | 1719 | printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a')); |
| 1681 | 1720 | |
| 1721 | +#ifdef __TINYC__ |
| 1722 | +# pragma comment(option, "-w") |
| 1723 | +#endif |
| 1724 | + |
| 1682 | 1725 | /* from pointer to integer types */ |
| 1683 | 1726 | printf("%d %d %ld %ld %lld %lld\n", |
| 1684 | 1727 | (int)p, (unsigned int)p, |
| @@ -1689,6 +1732,10 @@ void cast_test() · 4 unmodified lines |
| 1689 | 1732 | printf("%p %p %p %p\n", |
| 1690 | 1733 | (void *)a, (void *)b, (void *)c, (void *)d); |
| 1691 | 1734 | |
| 1735 | +#ifdef __TINYC__ |
| 1736 | +# pragma comment(option, "-W") |
| 1737 | +#endif |
| 1738 | + |
| 1692 | 1739 | /* int to int with sign set */ |
| 1693 | 1740 | printf("0x%lx\n", (unsigned long)(int)ul); |
| 1694 | 1741 | } |
| @@ -2347,7 +2394,7 @@ void funcptr_test() · 652 unmodified lines |
| 2347 | 2394 | |
| 2348 | 2395 | /* Check that we can align functions */ |
| 2349 | 2396 | func = aligned_function; |
| 2350 | | − printf("aligned_function (should be zero): %d\n", ((int)func) & 15); |
| 2397 | + printf("aligned_function (should be zero): %d\n", ((int)(uintptr_t)func) & 15); |
| 2351 | 2398 | } |
| 2352 | 2399 | |
| 2353 | 2400 | void lloptest(long long a, long long b) |
| @@ -2549,6 +2596,9 @@ void longlong_test(void) · 195 unmodified lines |
| 2549 | 2596 | unsigned long long u = 0x8000000000000001ULL; |
| 2550 | 2597 | u = (unsigned)(u + 1); |
| 2551 | 2598 | printf("long long u=" ULONG_LONG_FORMAT "\n", u); |
| 2599 | + u = 0x11223344aa998877ULL; |
| 2600 | + u = (unsigned)(int)(u + 1); |
| 2601 | + printf("long long u=" ULONG_LONG_FORMAT "\n", u); |
| 2552 | 2602 | |
| 2553 | 2603 | /* was a problem with missing save_regs in gen_opl on 32-bit platforms */ |
| 2554 | 2604 | char cc = 78; |
| @@ -2897,10 +2947,6 @@ void c99_vla_test(int size1, int size2) · 342 unmodified lines |
| 2897 | 2947 | #endif |
| 2898 | 2948 | } |
| 2899 | 2949 | |
| 2900 | | −#ifndef __TINYC__ |
| 2901 | | −typedef __SIZE_TYPE__ uintptr_t; |
| 2902 | | −#endif |
| 2903 | | − |
| 2904 | 2950 | void sizeof_test(void) |
| 2905 | 2951 | { |
| 2906 | 2952 | int a; |