mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
stage2: fix bug where performing wrapping or saturating arithmetic or saturating left shift on type comptime_int executed unreachable code
This commit is contained in:
parent
54634991a2
commit
3c53667db8
36
src/Sema.zig
36
src/Sema.zig
@ -7474,7 +7474,10 @@ fn zirShl(
|
||||
}
|
||||
const val = switch (air_tag) {
|
||||
.shl_exact => return sema.fail(block, lhs_src, "TODO implement Sema for comptime shl_exact", .{}),
|
||||
.shl_sat => try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, sema.mod.getTarget()),
|
||||
.shl_sat => if (lhs_ty.zigTypeTag() == .ComptimeInt)
|
||||
try lhs_val.shl(rhs_val, sema.arena)
|
||||
else
|
||||
try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, sema.mod.getTarget()),
|
||||
.shl => try lhs_val.shl(rhs_val, sema.arena),
|
||||
else => unreachable,
|
||||
};
|
||||
@ -8189,10 +8192,12 @@ fn analyzeArithmetic(
|
||||
return casted_lhs;
|
||||
}
|
||||
if (maybe_lhs_val) |lhs_val| {
|
||||
return sema.addConstant(
|
||||
scalar_type,
|
||||
try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target),
|
||||
);
|
||||
const val = if (scalar_tag == .ComptimeInt)
|
||||
try lhs_val.intAdd(rhs_val, sema.arena)
|
||||
else
|
||||
try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target);
|
||||
|
||||
return sema.addConstant(scalar_type, val);
|
||||
} else break :rs .{ .src = lhs_src, .air_tag = .add_sat };
|
||||
} else break :rs .{ .src = rhs_src, .air_tag = .add_sat };
|
||||
},
|
||||
@ -8280,10 +8285,12 @@ fn analyzeArithmetic(
|
||||
return sema.addConstUndef(scalar_type);
|
||||
}
|
||||
if (maybe_rhs_val) |rhs_val| {
|
||||
return sema.addConstant(
|
||||
scalar_type,
|
||||
try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target),
|
||||
);
|
||||
const val = if (scalar_tag == .ComptimeInt)
|
||||
try lhs_val.intSub(rhs_val, sema.arena)
|
||||
else
|
||||
try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target);
|
||||
|
||||
return sema.addConstant(scalar_type, val);
|
||||
} else break :rs .{ .src = rhs_src, .air_tag = .sub_sat };
|
||||
} else break :rs .{ .src = lhs_src, .air_tag = .sub_sat };
|
||||
},
|
||||
@ -8663,10 +8670,13 @@ fn analyzeArithmetic(
|
||||
if (lhs_val.isUndef()) {
|
||||
return sema.addConstUndef(scalar_type);
|
||||
}
|
||||
return sema.addConstant(
|
||||
scalar_type,
|
||||
try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target),
|
||||
);
|
||||
|
||||
const val = if (scalar_tag == .ComptimeInt)
|
||||
try lhs_val.intMul(rhs_val, sema.arena)
|
||||
else
|
||||
try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target);
|
||||
|
||||
return sema.addConstant(scalar_type, val);
|
||||
} else break :rs .{ .src = lhs_src, .air_tag = .mul_sat };
|
||||
} else break :rs .{ .src = rhs_src, .air_tag = .mul_sat };
|
||||
},
|
||||
|
||||
@ -2275,6 +2275,10 @@ pub const Value = extern union {
|
||||
) !Value {
|
||||
if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
|
||||
|
||||
if (ty.zigTypeTag() == .ComptimeInt) {
|
||||
return intAdd(lhs, rhs, arena);
|
||||
}
|
||||
|
||||
if (ty.isAnyFloat()) {
|
||||
return floatAdd(lhs, rhs, ty, arena);
|
||||
}
|
||||
@ -2361,6 +2365,10 @@ pub const Value = extern union {
|
||||
) !Value {
|
||||
if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
|
||||
|
||||
if (ty.zigTypeTag() == .ComptimeInt) {
|
||||
return intSub(lhs, rhs, arena);
|
||||
}
|
||||
|
||||
if (ty.isAnyFloat()) {
|
||||
return floatSub(lhs, rhs, ty, arena);
|
||||
}
|
||||
@ -2440,6 +2448,10 @@ pub const Value = extern union {
|
||||
) !Value {
|
||||
if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
|
||||
|
||||
if (ty.zigTypeTag() == .ComptimeInt) {
|
||||
return intMul(lhs, rhs, arena);
|
||||
}
|
||||
|
||||
if (ty.isAnyFloat()) {
|
||||
return floatMul(lhs, rhs, ty, arena);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user