diff --git a/src/AstGen.zig b/src/AstGen.zig index ab5befa4ba40d470a2ef9dff5b37e44e7e920e7e..2fa2960ce15052d96c06c6e17f9108e65d7d4e0f 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -9875,6 +9875,9 @@ const GenZir = struct { errdefer as_scope.unstack(); as_scope.rl_ptr = try as_scope.addBin(.coerce_result_ptr, dest_type, result_ptr); + // `rl_ty_inst` needs to be set in case the stores to `rl_ptr` are eliminated. + as_scope.rl_ty_inst = dest_type; + return as_scope; } diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index b45f5a0b4938e6dfc8969466133b84a28d18c503..dc0e5aaf308f908240f00213458c99f3f3553291 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -1062,3 +1062,15 @@ comptime { s = S{ .a = 1 }; assert(s.a == 1); } + +test "switch inside @as gets correct type" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + var a: u32 = 0; + var b: [2]u32 = undefined; + b[0] = @as(u32, switch (a) { + 1 => 1, + else => 0, + }); +}