Commit ea18f894f5

g-w1 <58830309+g-w1@users.noreply.github.com>
2020-12-22 23:05:42
Peer type resolution with unsigned ints and larger signed ints
1 parent 03113d9
Changed files (2)
src
stage1
test
stage1
behavior
src/stage1/ir.cpp
@@ -12706,11 +12706,13 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
         }
 
         if (prev_type->id == ZigTypeIdInt &&
-                   cur_type->id == ZigTypeIdInt &&
-                   prev_type->data.integral.is_signed == cur_type->data.integral.is_signed)
+                   cur_type->id == ZigTypeIdInt)
         {
-            if (cur_type->data.integral.bit_count > prev_type->data.integral.bit_count) {
-                prev_inst = cur_inst;
+            if ((prev_type->data.integral.is_signed == cur_type->data.integral.is_signed) ||
+                (cur_type->data.integral.is_signed && !prev_type->data.integral.is_signed)) {
+                if (cur_type->data.integral.bit_count > prev_type->data.integral.bit_count) {
+                    prev_inst = cur_inst;
+                }
             }
             continue;
         }
test/stage1/behavior/cast.zig
@@ -869,6 +869,15 @@ test "peer type resolve string lit with sentinel-terminated mutable slice" {
     comptime expect(@TypeOf("hi", slice) == [:0]const u8);
 }
 
+test "peer type unsigned int to signed" {
+    var w: u31 = 5;
+    var x: u8 = 7;
+    var y: i32 = -5;
+    var a = w + y + x;
+    comptime expect(@TypeOf(a) == i32);
+    expect(a == 7);
+}
+
 test "peer type resolve array pointers, one of them const" {
     var array1: [4]u8 = undefined;
     const array2: [5]u8 = undefined;