authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-24 18:20:03-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-24 18:20:03-07:00
loga4ff94804cfcdee49fb9c70812c15ff7d2829ee5
tree34b3ed6ff9b836a5160f74216da68d008f010042
parent1f16b07d6fe43f96287b6cca8e8b58996199481f

Sema: additional check for one-possible-value types in analyzeLoad

This is needed because pointers to zero-bit types are not necessarily comptime known, but when doing a load, only the element type having one possible value is relevant.

1 files changed, 5 insertions(+), 0 deletions(-)

src/Sema.zig+5
...@@ -20950,6 +20950,11 @@ fn analyzeLoad(...@@ -20950,6 +20950,11 @@ fn analyzeLoad(
20950 .Pointer => ptr_ty.childType(),20950 .Pointer => ptr_ty.childType(),
20951 else => return sema.fail(block, ptr_src, "expected pointer, found '{}'", .{ptr_ty.fmt(sema.mod)}),20951 else => return sema.fail(block, ptr_src, "expected pointer, found '{}'", .{ptr_ty.fmt(sema.mod)}),
20952 };20952 };
20953
20954 if (try sema.typeHasOnePossibleValue(block, src, elem_ty)) |opv| {
20955 return sema.addConstant(elem_ty, opv);
20956 }
20957
20953 if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| {20958 if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| {
20954 if (try sema.pointerDeref(block, ptr_src, ptr_val, ptr_ty)) |elem_val| {20959 if (try sema.pointerDeref(block, ptr_src, ptr_val, ptr_ty)) |elem_val| {
20955 return sema.addConstant(elem_ty, elem_val);20960 return sema.addConstant(elem_ty, elem_val);