From b048fa4f1377c84327f74fd4ecd5b03141e68e36 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Mon, 2 Jan 2023 19:23:09 +0200 Subject: [PATCH] Sema: prevent spurious "depends on itself" errors Closes #14059 --- src/Sema.zig | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 1e12486bde..be51c30307 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -30337,6 +30337,18 @@ fn resolveTypeFieldsStruct( ty: Type, struct_obj: *Module.Struct, ) CompileError!void { + switch (sema.mod.declPtr(struct_obj.owner_decl).analysis) { + .file_failure, + .dependency_failure, + .sema_failure, + .sema_failure_retryable, + => { + sema.owner_decl.analysis = .dependency_failure; + sema.owner_decl.generation = sema.mod.generation; + return error.AnalysisFail; + }, + else => {}, + } switch (struct_obj.status) { .none => {}, .field_types_wip => { @@ -30357,10 +30369,23 @@ fn resolveTypeFieldsStruct( } struct_obj.status = .field_types_wip; + errdefer struct_obj.status = .none; try semaStructFields(sema.mod, struct_obj); } fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) CompileError!void { + switch (sema.mod.declPtr(union_obj.owner_decl).analysis) { + .file_failure, + .dependency_failure, + .sema_failure, + .sema_failure_retryable, + => { + sema.owner_decl.analysis = .dependency_failure; + sema.owner_decl.generation = sema.mod.generation; + return error.AnalysisFail; + }, + else => {}, + } switch (union_obj.status) { .none => {}, .field_types_wip => { @@ -30381,6 +30406,7 @@ fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) Compi } union_obj.status = .field_types_wip; + errdefer union_obj.status = .none; try semaUnionFields(sema.mod, union_obj); union_obj.status = .have_field_types; } @@ -30445,9 +30471,7 @@ fn resolveInferredErrorSetTy( fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void { const gpa = mod.gpa; const decl_index = struct_obj.owner_decl; - const file_scope = struct_obj.namespace.file_scope; - if (file_scope.status != .success_zir) return error.AnalysisFail; - const zir = file_scope.zir; + const zir = struct_obj.namespace.file_scope.zir; const extended = zir.instructions.items(.data)[struct_obj.zir_index].extended; assert(extended.opcode == .struct_decl); const small = @bitCast(Zir.Inst.StructDecl.Small, extended.small);