authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-03-17 02:40:47+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-17 15:55:02-04:00
log71e873703ffc49138d95cb66636856062341c420
tree420e5df26dce2a83d65fb6a26d6268264c47fde4
parent9f2aa3fbeec451021837ca6bca2baa47302f0468

Sema: make @returnAddress return 0 at comptime

See also #14938. Resolves: #14931

3 files changed, 25 insertions(+), 3 deletions(-)

src/Sema.zig+7-3
......@@ -15454,9 +15454,13 @@ fn zirRetAddr(
1545415454 block: *Block,
1545515455 extended: Zir.Inst.Extended.InstData,
1545615456) CompileError!Air.Inst.Ref {
15457 const src = LazySrcLoc.nodeOffset(@bitCast(i32, extended.operand));
15458 try sema.requireRuntimeBlock(block, src, null);
15459 return try block.addNoOp(.ret_addr);
15457 _ = extended;
15458 if (block.is_comptime) {
15459 // TODO: we could give a meaningful lazy value here. #14938
15460 return sema.addIntUnsigned(Type.usize, 0);
15461 } else {
15462 return block.addNoOp(.ret_addr);
15463 }
1546015464}
1546115465
1546215466fn zirFrameAddress(
test/behavior.zig+1
......@@ -191,6 +191,7 @@ test {
191191 _ = @import("behavior/pub_enum.zig");
192192 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
193193 _ = @import("behavior/reflection.zig");
194 _ = @import("behavior/return_address.zig");
194195 _ = @import("behavior/saturating_arithmetic.zig");
195196 _ = @import("behavior/select.zig");
196197 _ = @import("behavior/shuffle.zig");
test/behavior/return_address.zig created+17
......@@ -0,0 +1,17 @@
1const builtin = @import("builtin");
2const testing = @import("std").testing;
3
4fn retAddr() usize {
5 return @returnAddress();
6}
7
8test "return address" {
9 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 _ = retAddr();
15 // TODO: #14938
16 try testing.expectEqual(0, comptime retAddr());
17}