Commit ea18f894f5
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;