authorgravatar for 94326797+riverbl@users.noreply.github.comriverbl <94326797+riverbl@users.noreply.github.com> 2021-12-27 22:52:56+00:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-01-29 18:12:28+02:00
log3c53667db8d44777c2fbceaf3c6d3a22a6c9caad
treeac459f5fcfabd49454dfa19c6e302b75d3fadb77
parent54634991a2b9767d20725b20a2c273b6db60a825

stage2: fix bug where performing wrapping or saturating arithmetic or saturating left shift on type comptime_int executed unreachable code


2 files changed, 35 insertions(+), 13 deletions(-)

src/Sema.zig+23-13
......@@ -7474,7 +7474,10 @@ fn zirShl(
74747474 }
74757475 const val = switch (air_tag) {
74767476 .shl_exact => return sema.fail(block, lhs_src, "TODO implement Sema for comptime shl_exact", .{}),
7477 .shl_sat => try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, sema.mod.getTarget()),
7477 .shl_sat => if (lhs_ty.zigTypeTag() == .ComptimeInt)
7478 try lhs_val.shl(rhs_val, sema.arena)
7479 else
7480 try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, sema.mod.getTarget()),
74787481 .shl => try lhs_val.shl(rhs_val, sema.arena),
74797482 else => unreachable,
74807483 };
......@@ -8189,10 +8192,12 @@ fn analyzeArithmetic(
81898192 return casted_lhs;
81908193 }
81918194 if (maybe_lhs_val) |lhs_val| {
8192 return sema.addConstant(
8193 scalar_type,
8194 try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target),
8195 );
8195 const val = if (scalar_tag == .ComptimeInt)
8196 try lhs_val.intAdd(rhs_val, sema.arena)
8197 else
8198 try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target);
8199
8200 return sema.addConstant(scalar_type, val);
81968201 } else break :rs .{ .src = lhs_src, .air_tag = .add_sat };
81978202 } else break :rs .{ .src = rhs_src, .air_tag = .add_sat };
81988203 },
......@@ -8280,10 +8285,12 @@ fn analyzeArithmetic(
82808285 return sema.addConstUndef(scalar_type);
82818286 }
82828287 if (maybe_rhs_val) |rhs_val| {
8283 return sema.addConstant(
8284 scalar_type,
8285 try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target),
8286 );
8288 const val = if (scalar_tag == .ComptimeInt)
8289 try lhs_val.intSub(rhs_val, sema.arena)
8290 else
8291 try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target);
8292
8293 return sema.addConstant(scalar_type, val);
82878294 } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat };
82888295 } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat };
82898296 },
......@@ -8663,10 +8670,13 @@ fn analyzeArithmetic(
86638670 if (lhs_val.isUndef()) {
86648671 return sema.addConstUndef(scalar_type);
86658672 }
8666 return sema.addConstant(
8667 scalar_type,
8668 try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target),
8669 );
8673
8674 const val = if (scalar_tag == .ComptimeInt)
8675 try lhs_val.intMul(rhs_val, sema.arena)
8676 else
8677 try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target);
8678
8679 return sema.addConstant(scalar_type, val);
86708680 } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat };
86718681 } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat };
86728682 },
src/value.zig+12
......@@ -2275,6 +2275,10 @@ pub const Value = extern union {
22752275 ) !Value {
22762276 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
22772277
2278 if (ty.zigTypeTag() == .ComptimeInt) {
2279 return intAdd(lhs, rhs, arena);
2280 }
2281
22782282 if (ty.isAnyFloat()) {
22792283 return floatAdd(lhs, rhs, ty, arena);
22802284 }
......@@ -2361,6 +2365,10 @@ pub const Value = extern union {
23612365 ) !Value {
23622366 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
23632367
2368 if (ty.zigTypeTag() == .ComptimeInt) {
2369 return intSub(lhs, rhs, arena);
2370 }
2371
23642372 if (ty.isAnyFloat()) {
23652373 return floatSub(lhs, rhs, ty, arena);
23662374 }
......@@ -2440,6 +2448,10 @@ pub const Value = extern union {
24402448 ) !Value {
24412449 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
24422450
2451 if (ty.zigTypeTag() == .ComptimeInt) {
2452 return intMul(lhs, rhs, arena);
2453 }
2454
24432455 if (ty.isAnyFloat()) {
24442456 return floatMul(lhs, rhs, ty, arena);
24452457 }