fix const result loc, runtime if cond, else unreachable
Closes #2791. See that issue for more details; I documented the debugging process quite thoroughly on this one.master
parent
ab4cba14c8
commit
4a5b0cde13
|
@ -3522,6 +3522,15 @@ static LLVMValueRef ir_render_store_ptr(CodeGen *g, IrExecutable *executable, Ir
|
||||||
assert(ptr_type->id == ZigTypeIdPointer);
|
assert(ptr_type->id == ZigTypeIdPointer);
|
||||||
if (!type_has_bits(ptr_type))
|
if (!type_has_bits(ptr_type))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
if (instruction->ptr->ref_count == 0) {
|
||||||
|
// In this case, this StorePtr instruction should be elided. Something happened like this:
|
||||||
|
// var t = true;
|
||||||
|
// const x = if (t) Num.Two else unreachable;
|
||||||
|
// The if condition is a runtime value, so the StorePtr for `x = Num.Two` got generated
|
||||||
|
// (this instruction being rendered) but because of `else unreachable` the result ended
|
||||||
|
// up being a comptime const value.
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool have_init_expr = !value_is_all_undef(&instruction->value->value);
|
bool have_init_expr = !value_is_all_undef(&instruction->value->value);
|
||||||
if (have_init_expr) {
|
if (have_init_expr) {
|
||||||
|
|
|
@ -63,3 +63,14 @@ test "labeled break inside comptime if inside runtime if" {
|
||||||
}
|
}
|
||||||
expect(answer == 42);
|
expect(answer == 42);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "const result loc, runtime if cond, else unreachable" {
|
||||||
|
const Num = enum {
|
||||||
|
One,
|
||||||
|
Two,
|
||||||
|
};
|
||||||
|
|
||||||
|
var t = true;
|
||||||
|
const x = if (t) Num.Two else unreachable;
|
||||||
|
if (x != .Two) @compileError("bad");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue