AstGen: store void to ptr result loc when there is no else branch

This commit is contained in:
kkHAIKE 2022-09-17 20:16:40 +08:00 committed by Veikka Tuominen
parent 183127733c
commit 4961044ce8
2 changed files with 28 additions and 3 deletions

View File

@ -5570,7 +5570,11 @@ fn ifExpr(
};
} else .{
.src = if_full.ast.then_expr,
.result = .none,
.result = switch (rl) {
// Explicitly store void to ptr result loc if there is no else branch
.ptr, .block_ptr => try rvalue(&else_scope, rl, .void_value, node),
else => .none,
},
};
const break_tag: Zir.Inst.Tag = if (parent_gz.force_comptime) .break_inline else .@"break";

View File

@ -6,11 +6,32 @@ fn g(b: bool) void {
const y = if (b) h: { break :h @as(i32, 1); };
_ = y;
}
export fn entry() void { f(true); g(true); }
fn h() void {
// https://github.com/ziglang/zig/issues/12743
const T = struct { oh_no: *u32 };
var x: T = if (false) {};
_ = x;
}
fn k(b: bool) void {
// block_ptr case
const T = struct { oh_no: u32 };
var x = if (b) blk: {
break :blk if (false) T{ .oh_no = 2 };
} else T{ .oh_no = 1 };
_ = x;
}
export fn entry() void {
f(true);
g(true);
h();
k(true);
}
// error
// backend=stage2
// target=native
//
// :2:21: error: incompatible types: 'i32' and 'void'
// :6:15: error: incompatible types: 'i32' and 'void'
// :12:16: error: expected type 'tmp.h.T', found 'void'
// :11:15: note: struct declared here
// :18:9: error: incompatible types: 'void' and 'tmp.k.T'