@@ -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