Skip to content

Commit abd005f

Browse files
committed
Sema: do not immediately destroy failed generic instantiation
Closes #12535 Closes #12765 Closes #12927
1 parent daeb992 commit abd005f

File tree

5 files changed

+331
-221
lines changed

5 files changed

+331
-221
lines changed

src/Module.zig

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3540,8 +3540,8 @@ pub fn destroyDecl(mod: *Module, decl_index: Decl.Index) void {
35403540
if (decl.getInnerNamespace()) |namespace| {
35413541
namespace.destroyDecls(mod);
35423542
}
3543-
decl.clearValues(mod);
35443543
}
3544+
decl.clearValues(mod);
35453545
decl.dependants.deinit(gpa);
35463546
decl.dependencies.deinit(gpa);
35473547
decl.clearName(gpa);
@@ -4610,9 +4610,18 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
46104610

46114611
// We need the memory for the Type to go into the arena for the Decl
46124612
var decl_arena = std.heap.ArenaAllocator.init(gpa);
4613-
errdefer decl_arena.deinit();
46144613
const decl_arena_allocator = decl_arena.allocator();
46154614

4615+
const decl_arena_state = blk: {
4616+
errdefer decl_arena.deinit();
4617+
const s = try decl_arena_allocator.create(std.heap.ArenaAllocator.State);
4618+
break :blk s;
4619+
};
4620+
defer {
4621+
decl_arena_state.* = decl_arena.state;
4622+
decl.value_arena = decl_arena_state;
4623+
}
4624+
46164625
var analysis_arena = std.heap.ArenaAllocator.init(gpa);
46174626
defer analysis_arena.deinit();
46184627
const analysis_arena_allocator = analysis_arena.allocator();
@@ -4681,8 +4690,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
46814690
// not the struct itself.
46824691
try sema.resolveTypeLayout(decl_tv.ty);
46834692

4684-
const decl_arena_state = try decl_arena_allocator.create(std.heap.ArenaAllocator.State);
4685-
46864693
if (decl.is_usingnamespace) {
46874694
if (!decl_tv.ty.eql(Type.type, mod)) {
46884695
return sema.fail(&block_scope, ty_src, "expected type, found {}", .{
@@ -4701,8 +4708,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
47014708
decl.@"linksection" = null;
47024709
decl.has_tv = true;
47034710
decl.owns_tv = false;
4704-
decl_arena_state.* = decl_arena.state;
4705-
decl.value_arena = decl_arena_state;
47064711
decl.analysis = .complete;
47074712
decl.generation = mod.generation;
47084713

@@ -4723,16 +4728,14 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
47234728
if (decl.getFunction()) |prev_func| {
47244729
prev_is_inline = prev_func.state == .inline_only;
47254730
}
4726-
decl.clearValues(mod);
47274731
}
4732+
decl.clearValues(mod);
47284733

47294734
decl.ty = try decl_tv.ty.copy(decl_arena_allocator);
47304735
decl.val = try decl_tv.val.copy(decl_arena_allocator);
47314736
// linksection, align, and addrspace were already set by Sema
47324737
decl.has_tv = true;
47334738
decl.owns_tv = owns_tv;
4734-
decl_arena_state.* = decl_arena.state;
4735-
decl.value_arena = decl_arena_state;
47364739
decl.analysis = .complete;
47374740
decl.generation = mod.generation;
47384741

@@ -4767,8 +4770,8 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
47674770
var type_changed = true;
47684771
if (decl.has_tv) {
47694772
type_changed = !decl.ty.eql(decl_tv.ty, mod);
4770-
decl.clearValues(mod);
47714773
}
4774+
decl.clearValues(mod);
47724775

47734776
decl.owns_tv = false;
47744777
var queue_linker_work = false;
@@ -4841,8 +4844,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
48414844
};
48424845
};
48434846
decl.has_tv = true;
4844-
decl_arena_state.* = decl_arena.state;
4845-
decl.value_arena = decl_arena_state;
48464847
decl.analysis = .complete;
48474848
decl.generation = mod.generation;
48484849

@@ -5447,8 +5448,8 @@ pub fn clearDecl(
54475448
if (decl.getInnerNamespace()) |namespace| {
54485449
try namespace.deleteAllDecls(mod, outdated_decls);
54495450
}
5450-
decl.clearValues(mod);
54515451
}
5452+
decl.clearValues(mod);
54525453

54535454
if (decl.deletion_flag) {
54545455
decl.deletion_flag = false;

0 commit comments

Comments
 (0)