authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-02 19:23:09+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-02 19:23:09+02:00
logb048fa4f1377c84327f74fd4ecd5b03141e68e36
treec677c0659c290668e49245b75cecd296a68a4b9e
parent332a43858a6ba2128d3df9e6bca45a10547ed383

Sema: prevent spurious "depends on itself" errors

Closes #14059

1 files changed, 27 insertions(+), 3 deletions(-)

src/Sema.zig+27-3
......@@ -30337,6 +30337,18 @@ fn resolveTypeFieldsStruct(
3033730337 ty: Type,
3033830338 struct_obj: *Module.Struct,
3033930339) CompileError!void {
30340 switch (sema.mod.declPtr(struct_obj.owner_decl).analysis) {
30341 .file_failure,
30342 .dependency_failure,
30343 .sema_failure,
30344 .sema_failure_retryable,
30345 => {
30346 sema.owner_decl.analysis = .dependency_failure;
30347 sema.owner_decl.generation = sema.mod.generation;
30348 return error.AnalysisFail;
30349 },
30350 else => {},
30351 }
3034030352 switch (struct_obj.status) {
3034130353 .none => {},
3034230354 .field_types_wip => {
......@@ -30357,10 +30369,23 @@ fn resolveTypeFieldsStruct(
3035730369 }
3035830370
3035930371 struct_obj.status = .field_types_wip;
30372 errdefer struct_obj.status = .none;
3036030373 try semaStructFields(sema.mod, struct_obj);
3036130374}
3036230375
3036330376fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) CompileError!void {
30377 switch (sema.mod.declPtr(union_obj.owner_decl).analysis) {
30378 .file_failure,
30379 .dependency_failure,
30380 .sema_failure,
30381 .sema_failure_retryable,
30382 => {
30383 sema.owner_decl.analysis = .dependency_failure;
30384 sema.owner_decl.generation = sema.mod.generation;
30385 return error.AnalysisFail;
30386 },
30387 else => {},
30388 }
3036430389 switch (union_obj.status) {
3036530390 .none => {},
3036630391 .field_types_wip => {
......@@ -30381,6 +30406,7 @@ fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) Compi
3038130406 }
3038230407
3038330408 union_obj.status = .field_types_wip;
30409 errdefer union_obj.status = .none;
3038430410 try semaUnionFields(sema.mod, union_obj);
3038530411 union_obj.status = .have_field_types;
3038630412}
......@@ -30445,9 +30471,7 @@ fn resolveInferredErrorSetTy(
3044530471fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void {
3044630472 const gpa = mod.gpa;
3044730473 const decl_index = struct_obj.owner_decl;
30448 const file_scope = struct_obj.namespace.file_scope;
30449 if (file_scope.status != .success_zir) return error.AnalysisFail;
30450 const zir = file_scope.zir;
30474 const zir = struct_obj.namespace.file_scope.zir;
3045130475 const extended = zir.instructions.items(.data)[struct_obj.zir_index].extended;
3045230476 assert(extended.opcode == .struct_decl);
3045330477 const small = @bitCast(Zir.Inst.StructDecl.Small, extended.small);