about summary refs log tree commit diff
path: root/compiler/rustc_interface
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2021-06-09 14:47:01 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2021-06-09 14:47:01 +0200
commite1aa45b64d29ef03511c4fbd359ee42c6bb342ba (patch)
treeed1bdfe3253c16b952439b8a7475c2f472e29c92 /compiler/rustc_interface
parent2bf839e87086d1d636b22a938845bd5c33a39ca1 (diff)
downloadrust-e1aa45b64d29ef03511c4fbd359ee42c6bb342ba.tar.gz
rust-e1aa45b64d29ef03511c4fbd359ee42c6bb342ba.zip
Use explicit drop impl
Diffstat (limited to 'compiler/rustc_interface')
-rw-r--r--compiler/rustc_interface/src/passes.rs21
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 =