| author | |
| committer | |
| log | 271a37b418828c8ee79402f97016be42c5fa2884 |
| tree | 4834923022eddbc1e314a0d4d2844d15c0829574 |
| parent | 6131b3716322d60cf26f7aad1a654dc6c4414051 |
closes #463 files changed, 38 insertions(+), 1 deletions(-)
src/analyze.cpp+14-1| ... | ... | @@ -1892,12 +1892,25 @@ static TypeTableEntry *determine_peer_type_compatibility(CodeGen *g, AstNode *pa |
| 1892 | 1892 | continue; |
| 1893 | 1893 | } else if (prev_type->id == TypeTableEntryIdInt && |
| 1894 | 1894 | cur_type->id == TypeTableEntryIdInt && |
| 1895 | prev_type->data.integral.is_signed == cur_type->data.integral.is_signed) | |
| 1895 | prev_type->data.integral.is_signed == cur_type->data.integral.is_signed && | |
| 1896 | (cur_type->data.integral.bit_count >= prev_type->data.integral.bit_count && | |
| 1897 | (cur_type->data.integral.is_wrapping || !prev_type->data.integral.is_wrapping))) | |
| 1896 | 1898 | { |
| 1897 | 1899 | if (cur_type->data.integral.bit_count > prev_type->data.integral.bit_count) { |
| 1898 | 1900 | prev_type = cur_type; |
| 1899 | 1901 | prev_node = cur_node; |
| 1902 | } else if (cur_type->data.integral.is_wrapping && !prev_type->data.integral.is_wrapping) { | |
| 1903 | prev_type = cur_type; | |
| 1904 | prev_node = cur_node; | |
| 1900 | 1905 | } |
| 1906 | continue; | |
| 1907 | } else if (prev_type->id == TypeTableEntryIdInt && | |
| 1908 | cur_type->id == TypeTableEntryIdInt && | |
| 1909 | prev_type->data.integral.is_signed == cur_type->data.integral.is_signed && | |
| 1910 | (prev_type->data.integral.bit_count >= cur_type->data.integral.bit_count && | |
| 1911 | (prev_type->data.integral.is_wrapping || !cur_type->data.integral.is_wrapping))) | |
| 1912 | { | |
| 1913 | continue; | |
| 1901 | 1914 | } else if (prev_type->id == TypeTableEntryIdFloat && |
| 1902 | 1915 | cur_type->id == TypeTableEntryIdFloat) |
| 1903 | 1916 | { |
test/run_tests.cpp+7| ... | ... | @@ -1354,6 +1354,13 @@ fn mul(a: u16, b: u16) -> u16 { |
| 1354 | 1354 | ".tmp_source.zig:5:1: error: function evaluation caused overflow", |
| 1355 | 1355 | ".tmp_source.zig:3:18: note: called from here", |
| 1356 | 1356 | ".tmp_source.zig:6:7: note: overflow occurred here"); |
| 1357 | ||
| 1358 | add_compile_fail_case("add incompatible int types", R"SOURCE( | |
| 1359 | fn add(x: i8w, y: i32) { | |
| 1360 | const z = x + y; | |
| 1361 | } | |
| 1362 | )SOURCE", 1, ".tmp_source.zig:3:17: error: incompatible types: 'i8w' and 'i32'"); | |
| 1363 | ||
| 1357 | 1364 | } |
| 1358 | 1365 | |
| 1359 | 1366 | ////////////////////////////////////////////////////////////////////////////// |
test/self_hosted.zig+17| ... | ... | @@ -1534,3 +1534,20 @@ fn shl_with_overflow() { |
| 1534 | 1534 | assert(!@shl_with_overflow(u16, 0b0010111111111111, 2, &result)); |
| 1535 | 1535 | assert(result == 0b1011111111111100); |
| 1536 | 1536 | } |
| 1537 | ||
| 1538 | #attribute("test") | |
| 1539 | fn combine_non_wrap_with_wrap() { | |
| 1540 | const x: i32 = 123; | |
| 1541 | const y: i32w = 456; | |
| 1542 | const z = x + y; | |
| 1543 | const z2 = y + x; | |
| 1544 | assert(@typeof(z) == i32w); | |
| 1545 | assert(@typeof(z2) == i32w); | |
| 1546 | ||
| 1547 | const a: i8 = 123; | |
| 1548 | const b: i32w = 456; | |
| 1549 | const c = b + a; | |
| 1550 | const d = a + b; | |
| 1551 | assert(@typeof(c) == i32w); | |
| 1552 | assert(@typeof(d) == i32w); | |
| 1553 | } |