diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-02-10 23:56:09 -0700 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-02-12 11:18:23 +0100 |
| commit | ba31a9469f48065c9ebf935160faffd0f6c9bfdc (patch) | |
| tree | 4954ac369623951c5390ab9e2da0e089592f8a4c /src | |
| parent | b92e1ab8ccf4e450467dfd5ee8ff9ea87c148c26 (diff) | |
| download | zig-ba31a9469f48065c9ebf935160faffd0f6c9bfdc.tar.gz zig-ba31a9469f48065c9ebf935160faffd0f6c9bfdc.zip | |
Sema: int casting to u0 returns const value
Also shift left with u0 rhs returns lhs even when lhs is runtime known.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 3b4f1c6f55..41c841e298 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5977,8 +5977,13 @@ fn zirIntCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air return sema.fail(block, src, "unable to cast runtime value to 'comptime_int'", .{}); } - try sema.requireRuntimeBlock(block, operand_src); // TODO insert safety check to make sure the value fits in the dest type + + if ((try sema.typeHasOnePossibleValue(block, dest_ty_src, dest_ty))) |opv| { + return sema.addConstant(dest_ty, opv); + } + + try sema.requireRuntimeBlock(block, operand_src); return block.addTyOp(.intcast, dest_ty, operand); } @@ -7537,17 +7542,21 @@ fn zirShl( const maybe_lhs_val = try sema.resolveMaybeUndefVal(block, lhs_src, lhs); const maybe_rhs_val = try sema.resolveMaybeUndefVal(block, rhs_src, rhs); + if (maybe_rhs_val) |rhs_val| { + if (rhs_val.isUndef()) { + return sema.addConstUndef(sema.typeOf(lhs)); + } + if (rhs_val.compareWithZero(.eq)) { + return lhs; + } + } + const runtime_src = if (maybe_lhs_val) |lhs_val| rs: { const lhs_ty = sema.typeOf(lhs); if (lhs_val.isUndef()) return sema.addConstUndef(lhs_ty); const rhs_val = maybe_rhs_val orelse break :rs rhs_src; - if (rhs_val.isUndef()) return sema.addConstUndef(lhs_ty); - // If rhs is 0, return lhs without doing any calculations. - if (rhs_val.compareWithZero(.eq)) { - return sema.addConstant(lhs_ty, lhs_val); - } const target = sema.mod.getTarget(); const val = switch (air_tag) { .shl_exact => val: { @@ -7577,12 +7586,7 @@ fn zirShl( }; return sema.addConstant(lhs_ty, val); - } else rs: { - if (maybe_rhs_val) |rhs_val| { - if (rhs_val.isUndef()) return sema.addConstUndef(sema.typeOf(lhs)); - } - break :rs lhs_src; - }; + } else lhs_src; // TODO: insert runtime safety check for shl_exact |
