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(...@@ -7474,7 +7474,10 @@ fn zirShl(
7474 }7474 }
7475 const val = switch (air_tag) {7475 const val = switch (air_tag) {
7476 .shl_exact => return sema.fail(block, lhs_src, "TODO implement Sema for comptime shl_exact", .{}),7476 .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()),
7478 .shl => try lhs_val.shl(rhs_val, sema.arena),7481 .shl => try lhs_val.shl(rhs_val, sema.arena),
7479 else => unreachable,7482 else => unreachable,
7480 };7483 };
...@@ -8189,10 +8192,12 @@ fn analyzeArithmetic(...@@ -8189,10 +8192,12 @@ fn analyzeArithmetic(
8189 return casted_lhs;8192 return casted_lhs;
8190 }8193 }
8191 if (maybe_lhs_val) |lhs_val| {8194 if (maybe_lhs_val) |lhs_val| {
8192 return sema.addConstant(8195 const val = if (scalar_tag == .ComptimeInt)
8193 scalar_type,8196 try lhs_val.intAdd(rhs_val, sema.arena)
8194 try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target),8197 else
8195 );8198 try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target);
8199
8200 return sema.addConstant(scalar_type, val);
8196 } else break :rs .{ .src = lhs_src, .air_tag = .add_sat };8201 } else break :rs .{ .src = lhs_src, .air_tag = .add_sat };
8197 } else break :rs .{ .src = rhs_src, .air_tag = .add_sat };8202 } else break :rs .{ .src = rhs_src, .air_tag = .add_sat };
8198 },8203 },
...@@ -8280,10 +8285,12 @@ fn analyzeArithmetic(...@@ -8280,10 +8285,12 @@ fn analyzeArithmetic(
8280 return sema.addConstUndef(scalar_type);8285 return sema.addConstUndef(scalar_type);
8281 }8286 }
8282 if (maybe_rhs_val) |rhs_val| {8287 if (maybe_rhs_val) |rhs_val| {
8283 return sema.addConstant(8288 const val = if (scalar_tag == .ComptimeInt)
8284 scalar_type,8289 try lhs_val.intSub(rhs_val, sema.arena)
8285 try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target),8290 else
8286 );8291 try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target);
8292
8293 return sema.addConstant(scalar_type, val);
8287 } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat };8294 } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat };
8288 } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat };8295 } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat };
8289 },8296 },
...@@ -8663,10 +8670,13 @@ fn analyzeArithmetic(...@@ -8663,10 +8670,13 @@ fn analyzeArithmetic(
8663 if (lhs_val.isUndef()) {8670 if (lhs_val.isUndef()) {
8664 return sema.addConstUndef(scalar_type);8671 return sema.addConstUndef(scalar_type);
8665 }8672 }
8666 return sema.addConstant(8673
8667 scalar_type,8674 const val = if (scalar_tag == .ComptimeInt)
8668 try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target),8675 try lhs_val.intMul(rhs_val, sema.arena)
8669 );8676 else
8677 try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target);
8678
8679 return sema.addConstant(scalar_type, val);
8670 } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat };8680 } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat };
8671 } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat };8681 } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat };
8672 },8682 },
src/value.zig+12
...@@ -2275,6 +2275,10 @@ pub const Value = extern union {...@@ -2275,6 +2275,10 @@ pub const Value = extern union {
2275 ) !Value {2275 ) !Value {
2276 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);2276 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
22772277
2278 if (ty.zigTypeTag() == .ComptimeInt) {
2279 return intAdd(lhs, rhs, arena);
2280 }
2281
2278 if (ty.isAnyFloat()) {2282 if (ty.isAnyFloat()) {
2279 return floatAdd(lhs, rhs, ty, arena);2283 return floatAdd(lhs, rhs, ty, arena);
2280 }2284 }
...@@ -2361,6 +2365,10 @@ pub const Value = extern union {...@@ -2361,6 +2365,10 @@ pub const Value = extern union {
2361 ) !Value {2365 ) !Value {
2362 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);2366 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
23632367
2368 if (ty.zigTypeTag() == .ComptimeInt) {
2369 return intSub(lhs, rhs, arena);
2370 }
2371
2364 if (ty.isAnyFloat()) {2372 if (ty.isAnyFloat()) {
2365 return floatSub(lhs, rhs, ty, arena);2373 return floatSub(lhs, rhs, ty, arena);
2366 }2374 }
...@@ -2440,6 +2448,10 @@ pub const Value = extern union {...@@ -2440,6 +2448,10 @@ pub const Value = extern union {
2440 ) !Value {2448 ) !Value {
2441 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);2449 if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef);
24422450
2451 if (ty.zigTypeTag() == .ComptimeInt) {
2452 return intMul(lhs, rhs, arena);
2453 }
2454
2443 if (ty.isAnyFloat()) {2455 if (ty.isAnyFloat()) {
2444 return floatMul(lhs, rhs, ty, arena);2456 return floatMul(lhs, rhs, ty, arena);
2445 }2457 }