aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-10 23:56:09 -0700
committerJakub Konka <kubkon@jakubkonka.com>2022-02-12 11:18:23 +0100
commitba31a9469f48065c9ebf935160faffd0f6c9bfdc (patch)
tree4954ac369623951c5390ab9e2da0e089592f8a4c /src
parentb92e1ab8ccf4e450467dfd5ee8ff9ea87c148c26 (diff)
downloadzig-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.zig28
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