aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-03-23 19:58:13 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-03-23 19:58:13 -0700
commitaca42c62598523b92de7a51d3d84f2f2e5146536 (patch)
tree18914e86afb1bfcbbd940198087e2c30782eecea /src/value.zig
parent74ccd0c40b6871093f52769d342c1316e9ded0c0 (diff)
downloadzig-aca42c62598523b92de7a51d3d84f2f2e5146536.tar.gz
zig-aca42c62598523b92de7a51d3d84f2f2e5146536.zip
Sema: fix comptime elem_ptr compare fixed address
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/value.zig b/src/value.zig
index 24f6b1df75..be5794d6ae 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -1008,7 +1008,7 @@ pub const Value = extern union {
space: *BigIntSpace,
target: Target,
sema_kit: ?Module.WipAnalysis,
- ) !BigIntConst {
+ ) Module.CompileError!BigIntConst {
switch (val.tag()) {
.zero,
.bool_false,
@@ -1035,6 +1035,14 @@ pub const Value = extern union {
return BigIntMutable.init(&space.limbs, x).toConst();
},
+ .elem_ptr => {
+ const elem_ptr = val.castTag(.elem_ptr).?.data;
+ const array_addr = (try elem_ptr.array_ptr.getUnsignedIntAdvanced(target, sema_kit)).?;
+ const elem_size = elem_ptr.elem_ty.abiSize(target);
+ const new_addr = array_addr + elem_size * elem_ptr.index;
+ return BigIntMutable.init(&space.limbs, new_addr).toConst();
+ },
+
else => unreachable,
}
}
@@ -1815,7 +1823,10 @@ pub const Value = extern union {
return orderAgainstZeroAdvanced(lhs, null) catch unreachable;
}
- pub fn orderAgainstZeroAdvanced(lhs: Value, sema_kit: ?Module.WipAnalysis) !std.math.Order {
+ pub fn orderAgainstZeroAdvanced(
+ lhs: Value,
+ sema_kit: ?Module.WipAnalysis,
+ ) Module.CompileError!std.math.Order {
return switch (lhs.tag()) {
.zero,
.bool_false,
@@ -1851,6 +1862,21 @@ pub const Value = extern union {
.float_80 => std.math.order(lhs.castTag(.float_80).?.data, 0),
.float_128 => std.math.order(lhs.castTag(.float_128).?.data, 0),
+ .elem_ptr => {
+ const elem_ptr = lhs.castTag(.elem_ptr).?.data;
+ switch (try elem_ptr.array_ptr.orderAgainstZeroAdvanced(sema_kit)) {
+ .lt => unreachable,
+ .gt => return .gt,
+ .eq => {
+ if (elem_ptr.index == 0) {
+ return .eq;
+ } else {
+ return .gt;
+ }
+ },
+ }
+ },
+
else => unreachable,
};
}