diff options
Diffstat (limited to 'compiler/rustc_interface/src')
| -rw-r--r-- | compiler/rustc_interface/src/passes.rs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 62abc5e6964..6bd8fc9e5ee 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -93,17 +93,22 @@ mod boxed_resolver { pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>); - // Note: Drop order is important to prevent dangling references. Resolver must be dropped first, - // then resolver_arenas and finally session. - // The drop order is defined to be from top to bottom in RFC1857, so there is no need for - // ManuallyDrop for as long as the fields are not reordered. struct BoxedResolverInner { - resolver: Option<Resolver<'static>>, - resolver_arenas: ResolverArenas<'static>, session: Lrc<Session>, + resolver_arenas: Option<ResolverArenas<'static>>, + resolver: Option<Resolver<'static>>, _pin: PhantomPinned, } + // Note: Drop order is important to prevent dangling references. Resolver must be dropped first, + // then resolver_arenas and finally session. + impl Drop for BoxedResolverInner { + fn drop(&mut self) { + self.resolver.take(); + self.resolver_arenas.take(); + } + } + impl BoxedResolver { pub(super) fn new<F>(session: Lrc<Session>, make_resolver: F) -> Result<(ast::Crate, Self)> where @@ -114,7 +119,7 @@ mod boxed_resolver { { let mut boxed_resolver = Box::new(BoxedResolverInner { session, - resolver_arenas: Resolver::arenas(), + resolver_arenas: Some(Resolver::arenas()), resolver: None, _pin: PhantomPinned, }); @@ -122,7 +127,7 @@ mod boxed_resolver { let (crate_, resolver) = make_resolver( std::mem::transmute::<&Session, &Session>(&boxed_resolver.session), std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>( - &boxed_resolver.resolver_arenas, + boxed_resolver.resolver_arenas.as_ref().unwrap(), ), )?; boxed_resolver.resolver = |
