diff --git a/src/Sema.zig b/src/Sema.zig index cdbd8f8b41..0afce47e76 100644 --- a/src/Sema.zig +++ b/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( diff --git a/test/behavior.zig b/test/behavior.zig index ed731377d8..b6fe8d120f 100644 --- a/test/behavior.zig +++ b/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"); diff --git a/test/behavior/return_address.zig b/test/behavior/return_address.zig new file mode 100644 index 0000000000..fe48f21ec2 --- /dev/null +++ b/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()); +}