about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRémy Rakic <remy.rakic+github@gmail.com>2024-12-29 23:54:57 +0000
committerRémy Rakic <remy.rakic+github@gmail.com>2024-12-30 06:51:16 +0000
commitfbf48c177bfa1034af688ae7050357523fe033aa (patch)
tree5a82ad99b2ad2b5160b6c5f3c86e05f89b407296
parent50c152f34766b8624e18dbec2f3b3366456a79c6 (diff)
downloadrust-fbf48c177bfa1034af688ae7050357523fe033aa.tar.gz
rust-fbf48c177bfa1034af688ae7050357523fe033aa.zip
simplify `add_extra_drop_facts`
this is mostly to remove imports of the polonius legacy module

also what is going on in this function, what the...
-rw-r--r--compiler/rustc_borrowck/src/facts.rs2
-rw-r--r--compiler/rustc_borrowck/src/polonius/legacy/location.rs9
-rw-r--r--compiler/rustc_borrowck/src/type_check/liveness/trace.rs34
3 files changed, 20 insertions, 25 deletions
diff --git a/compiler/rustc_borrowck/src/facts.rs b/compiler/rustc_borrowck/src/facts.rs
index 8181616d4cf..17cb4670060 100644
--- a/compiler/rustc_borrowck/src/facts.rs
+++ b/compiler/rustc_borrowck/src/facts.rs
@@ -246,6 +246,6 @@ impl FactCell for RegionVid {
 
 impl FactCell for LocationIndex {
     fn to_string(&self, location_table: &LocationTable) -> String {
-        format!("{:?}", location_table.to_location(*self))
+        format!("{:?}", location_table.to_rich_location(*self))
     }
 }
diff --git a/compiler/rustc_borrowck/src/polonius/legacy/location.rs b/compiler/rustc_borrowck/src/polonius/legacy/location.rs
index fbe5f94ed42..4cb1202033c 100644
--- a/compiler/rustc_borrowck/src/polonius/legacy/location.rs
+++ b/compiler/rustc_borrowck/src/polonius/legacy/location.rs
@@ -65,7 +65,7 @@ impl LocationTable {
         LocationIndex::from_usize(start_index + statement_index * 2 + 1)
     }
 
-    pub fn to_location(&self, index: LocationIndex) -> RichLocation {
+    pub fn to_rich_location(&self, index: LocationIndex) -> RichLocation {
         let point_index = index.index();
 
         // Find the basic block. We have a vector with the
@@ -97,6 +97,13 @@ impl LocationTable {
             RichLocation::Mid(Location { block, statement_index })
         }
     }
+
+    pub fn to_location(&self, index: LocationIndex) -> Location {
+        match self.to_rich_location(index) {
+            RichLocation::Start(location) => location,
+            RichLocation::Mid(location) => location,
+        }
+    }
 }
 
 impl LocationIndex {
diff --git a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs
index bd969ba96f2..c7a2d32b31d 100644
--- a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs
+++ b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs
@@ -16,7 +16,6 @@ use rustc_trait_selection::traits::query::type_op::{DropckOutlives, TypeOp, Type
 use tracing::debug;
 
 use crate::polonius;
-use crate::polonius::legacy::RichLocation;
 use crate::region_infer::values::{self, LiveLoans};
 use crate::type_check::liveness::local_use_map::LocalUseMap;
 use crate::type_check::{NormalizeLocation, TypeChecker};
@@ -211,7 +210,7 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
     ///
     /// Add facts for all locals with free regions, since regions may outlive
     /// the function body only at certain nodes in the CFG.
-    fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) -> Option<()> {
+    fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) {
         // This collect is more necessary than immediately apparent
         // because these facts go into `add_drop_live_facts_for()`,
         // which also writes to `all_facts`, and so this is genuinely
@@ -221,41 +220,30 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
         // and probably maybe plausibly does not need to go back in.
         // It may be necessary to just pick out the parts of
         // `add_drop_live_facts_for()` that make sense.
+        let Some(facts) = self.cx.typeck.all_facts.as_ref() else { return };
         let facts_to_add: Vec<_> = {
-            let drop_used = &self.cx.typeck.all_facts.as_ref()?.var_dropped_at;
-
             let relevant_live_locals: FxIndexSet<_> =
                 relevant_live_locals.iter().copied().collect();
 
-            drop_used
+            facts
+                .var_dropped_at
                 .iter()
-                .filter_map(|(local, location_index)| {
-                    let local_ty = self.cx.body.local_decls[*local].ty;
-                    if relevant_live_locals.contains(local) || !local_ty.has_free_regions() {
+                .filter_map(|&(local, location_index)| {
+                    let local_ty = self.cx.body.local_decls[local].ty;
+                    if relevant_live_locals.contains(&local) || !local_ty.has_free_regions() {
                         return None;
                     }
 
-                    let location = match self.cx.typeck.location_table.to_location(*location_index)
-                    {
-                        RichLocation::Start(l) => l,
-                        RichLocation::Mid(l) => l,
-                    };
-
-                    Some((*local, local_ty, location))
+                    let location = self.cx.typeck.location_table.to_location(location_index);
+                    Some((local, local_ty, location))
                 })
                 .collect()
         };
 
-        // FIXME: these locations seem to have a special meaning (e.g. everywhere, at the end,
-        // ...), but I don't know which one. Please help me rename it to something descriptive!
-        // Also, if this IntervalSet is used in many places, it maybe should have a newtype'd
-        // name with a description of what it means for future mortals passing by.
-        let locations = IntervalSet::new(self.cx.elements.num_points());
-
+        let live_at = IntervalSet::new(self.cx.elements.num_points());
         for (local, local_ty, location) in facts_to_add {
-            self.cx.add_drop_live_facts_for(local, local_ty, &[location], &locations);
+            self.cx.add_drop_live_facts_for(local, local_ty, &[location], &live_at);
         }
-        Some(())
     }
 
     /// Clear the value of fields that are "per local variable".