aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-01-06 18:21:21 +0200
committerVeikka Tuominen <git@vexu.eu>2023-01-10 18:38:44 +0200
commitfd6b79e67f0cf91a72c121fc6fd484a03f487506 (patch)
tree41f1130e26e352a696d4dbfa4d65d48a04e34495 /src
parentf7ade7e63bfe63258807df6a97e222072cde1a35 (diff)
downloadzig-fd6b79e67f0cf91a72c121fc6fd484a03f487506.tar.gz
zig-fd6b79e67f0cf91a72c121fc6fd484a03f487506.zip
Sema: restore status on layout resolution failure
`resolveTypeFields` and `resolveTypeFully` already do this. Closes #14059
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 95de857616..6fa2f92dd7 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -29847,6 +29847,11 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void {
},
.have_layout, .fully_resolved_wip, .fully_resolved => return,
}
+ const prev_status = struct_obj.status;
+ errdefer if (struct_obj.status == .layout_wip) {
+ struct_obj.status = prev_status;
+ };
+
struct_obj.status = .layout_wip;
for (struct_obj.fields.values()) |field, i| {
sema.resolveTypeLayout(field.ty) catch |err| switch (err) {
@@ -30026,6 +30031,11 @@ fn resolveUnionLayout(sema: *Sema, ty: Type) CompileError!void {
},
.have_layout, .fully_resolved_wip, .fully_resolved => return,
}
+ const prev_status = union_obj.status;
+ errdefer if (union_obj.status == .layout_wip) {
+ union_obj.status = prev_status;
+ };
+
union_obj.status = .layout_wip;
for (union_obj.fields.values()) |field, i| {
sema.resolveTypeLayout(field.ty) catch |err| switch (err) {