@@ -3540,8 +3540,8 @@ pub fn destroyDecl(mod: *Module, decl_index: Decl.Index) void {
3540
3540
if (decl .getInnerNamespace ()) | namespace | {
3541
3541
namespace .destroyDecls (mod );
3542
3542
}
3543
- decl .clearValues (mod );
3544
3543
}
3544
+ decl .clearValues (mod );
3545
3545
decl .dependants .deinit (gpa );
3546
3546
decl .dependencies .deinit (gpa );
3547
3547
decl .clearName (gpa );
@@ -4610,9 +4610,18 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
4610
4610
4611
4611
// We need the memory for the Type to go into the arena for the Decl
4612
4612
var decl_arena = std .heap .ArenaAllocator .init (gpa );
4613
- errdefer decl_arena .deinit ();
4614
4613
const decl_arena_allocator = decl_arena .allocator ();
4615
4614
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
+
4616
4625
var analysis_arena = std .heap .ArenaAllocator .init (gpa );
4617
4626
defer analysis_arena .deinit ();
4618
4627
const analysis_arena_allocator = analysis_arena .allocator ();
@@ -4681,8 +4690,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
4681
4690
// not the struct itself.
4682
4691
try sema .resolveTypeLayout (decl_tv .ty );
4683
4692
4684
- const decl_arena_state = try decl_arena_allocator .create (std .heap .ArenaAllocator .State );
4685
-
4686
4693
if (decl .is_usingnamespace ) {
4687
4694
if (! decl_tv .ty .eql (Type .type , mod )) {
4688
4695
return sema .fail (& block_scope , ty_src , "expected type, found {}" , .{
@@ -4701,8 +4708,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
4701
4708
decl .@"linksection" = null ;
4702
4709
decl .has_tv = true ;
4703
4710
decl .owns_tv = false ;
4704
- decl_arena_state .* = decl_arena .state ;
4705
- decl .value_arena = decl_arena_state ;
4706
4711
decl .analysis = .complete ;
4707
4712
decl .generation = mod .generation ;
4708
4713
@@ -4723,16 +4728,14 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
4723
4728
if (decl .getFunction ()) | prev_func | {
4724
4729
prev_is_inline = prev_func .state == .inline_only ;
4725
4730
}
4726
- decl .clearValues (mod );
4727
4731
}
4732
+ decl .clearValues (mod );
4728
4733
4729
4734
decl .ty = try decl_tv .ty .copy (decl_arena_allocator );
4730
4735
decl .val = try decl_tv .val .copy (decl_arena_allocator );
4731
4736
// linksection, align, and addrspace were already set by Sema
4732
4737
decl .has_tv = true ;
4733
4738
decl .owns_tv = owns_tv ;
4734
- decl_arena_state .* = decl_arena .state ;
4735
- decl .value_arena = decl_arena_state ;
4736
4739
decl .analysis = .complete ;
4737
4740
decl .generation = mod .generation ;
4738
4741
@@ -4767,8 +4770,8 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
4767
4770
var type_changed = true ;
4768
4771
if (decl .has_tv ) {
4769
4772
type_changed = ! decl .ty .eql (decl_tv .ty , mod );
4770
- decl .clearValues (mod );
4771
4773
}
4774
+ decl .clearValues (mod );
4772
4775
4773
4776
decl .owns_tv = false ;
4774
4777
var queue_linker_work = false ;
@@ -4841,8 +4844,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
4841
4844
};
4842
4845
};
4843
4846
decl .has_tv = true ;
4844
- decl_arena_state .* = decl_arena .state ;
4845
- decl .value_arena = decl_arena_state ;
4846
4847
decl .analysis = .complete ;
4847
4848
decl .generation = mod .generation ;
4848
4849
@@ -5447,8 +5448,8 @@ pub fn clearDecl(
5447
5448
if (decl .getInnerNamespace ()) | namespace | {
5448
5449
try namespace .deleteAllDecls (mod , outdated_decls );
5449
5450
}
5450
- decl .clearValues (mod );
5451
5451
}
5452
+ decl .clearValues (mod );
5452
5453
5453
5454
if (decl .deletion_flag ) {
5454
5455
decl .deletion_flag = false ;
0 commit comments