@@ -93,17 +93,22 @@ mod boxed_resolver {
9393
9494 pub struct BoxedResolver ( Pin < Box < BoxedResolverInner > > ) ;
9595
96- // Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
97- // then resolver_arenas and finally session.
98- // The drop order is defined to be from top to bottom in RFC1857, so there is no need for
99- // ManuallyDrop for as long as the fields are not reordered.
10096 struct BoxedResolverInner {
101- resolver : Option < Resolver < ' static > > ,
102- resolver_arenas : ResolverArenas < ' static > ,
10397 session : Lrc < Session > ,
98+ resolver_arenas : Option < ResolverArenas < ' static > > ,
99+ resolver : Option < Resolver < ' static > > ,
104100 _pin : PhantomPinned ,
105101 }
106102
103+ // Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
104+ // then resolver_arenas and finally session.
105+ impl Drop for BoxedResolverInner {
106+ fn drop ( & mut self ) {
107+ self . resolver . take ( ) ;
108+ self . resolver_arenas . take ( ) ;
109+ }
110+ }
111+
107112 impl BoxedResolver {
108113 pub ( super ) fn new < F > ( session : Lrc < Session > , make_resolver : F ) -> Result < ( ast:: Crate , Self ) >
109114 where
@@ -114,15 +119,15 @@ mod boxed_resolver {
114119 {
115120 let mut boxed_resolver = Box :: new ( BoxedResolverInner {
116121 session,
117- resolver_arenas : Resolver :: arenas ( ) ,
122+ resolver_arenas : Some ( Resolver :: arenas ( ) ) ,
118123 resolver : None ,
119124 _pin : PhantomPinned ,
120125 } ) ;
121126 unsafe {
122127 let ( crate_, resolver) = make_resolver (
123128 std:: mem:: transmute :: < & Session , & Session > ( & boxed_resolver. session ) ,
124129 std:: mem:: transmute :: < & ResolverArenas < ' _ > , & ResolverArenas < ' _ > > (
125- & boxed_resolver. resolver_arenas ,
130+ boxed_resolver. resolver_arenas . as_ref ( ) . unwrap ( ) ,
126131 ) ,
127132 ) ?;
128133 boxed_resolver. resolver =
0 commit comments