@@ -93,17 +93,22 @@ mod boxed_resolver {
93
93
94
94
pub struct BoxedResolver ( Pin < Box < BoxedResolverInner > > ) ;
95
95
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.
100
96
struct BoxedResolverInner {
101
- resolver : Option < Resolver < ' static > > ,
102
- resolver_arenas : ResolverArenas < ' static > ,
103
97
session : Lrc < Session > ,
98
+ resolver_arenas : Option < ResolverArenas < ' static > > ,
99
+ resolver : Option < Resolver < ' static > > ,
104
100
_pin : PhantomPinned ,
105
101
}
106
102
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
+
107
112
impl BoxedResolver {
108
113
pub ( super ) fn new < F > ( session : Lrc < Session > , make_resolver : F ) -> Result < ( ast:: Crate , Self ) >
109
114
where
@@ -114,15 +119,15 @@ mod boxed_resolver {
114
119
{
115
120
let mut boxed_resolver = Box :: new ( BoxedResolverInner {
116
121
session,
117
- resolver_arenas : Resolver :: arenas ( ) ,
122
+ resolver_arenas : Some ( Resolver :: arenas ( ) ) ,
118
123
resolver : None ,
119
124
_pin : PhantomPinned ,
120
125
} ) ;
121
126
unsafe {
122
127
let ( crate_, resolver) = make_resolver (
123
128
std:: mem:: transmute :: < & Session , & Session > ( & boxed_resolver. session ) ,
124
129
std:: mem:: transmute :: < & ResolverArenas < ' _ > , & ResolverArenas < ' _ > > (
125
- & boxed_resolver. resolver_arenas ,
130
+ boxed_resolver. resolver_arenas . as_ref ( ) . unwrap ( ) ,
126
131
) ,
127
132
) ?;
128
133
boxed_resolver. resolver =
0 commit comments