Commit 71e873703f

mlugg <mlugg@mlugg.co.uk>
2023-03-17 03:40:47
Sema: make @returnAddress return 0 at comptime
See also #14938. Resolves: #14931
1 parent 9f2aa3f
Changed files (3)
src/Sema.zig
@@ -15454,9 +15454,13 @@ fn zirRetAddr(
     block: *Block,
     extended: Zir.Inst.Extended.InstData,
 ) CompileError!Air.Inst.Ref {
-    const src = LazySrcLoc.nodeOffset(@bitCast(i32, extended.operand));
-    try sema.requireRuntimeBlock(block, src, null);
-    return try block.addNoOp(.ret_addr);
+    _ = extended;
+    if (block.is_comptime) {
+        // TODO: we could give a meaningful lazy value here. #14938
+        return sema.addIntUnsigned(Type.usize, 0);
+    } else {
+        return block.addNoOp(.ret_addr);
+    }
 }
 
 fn zirFrameAddress(
test/behavior/return_address.zig
@@ -0,0 +1,17 @@
+const builtin = @import("builtin");
+const testing = @import("std").testing;
+
+fn retAddr() usize {
+    return @returnAddress();
+}
+
+test "return address" {
+    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+    _ = retAddr();
+    // TODO: #14938
+    try testing.expectEqual(0, comptime retAddr());
+}
test/behavior.zig
@@ -191,6 +191,7 @@ test {
     _ = @import("behavior/pub_enum.zig");
     _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
     _ = @import("behavior/reflection.zig");
+    _ = @import("behavior/return_address.zig");
     _ = @import("behavior/saturating_arithmetic.zig");
     _ = @import("behavior/select.zig");
     _ = @import("behavior/shuffle.zig");