]> git.lizzy.rs Git - rust.git/commitdiff
replace `usize` with `RegionIndex` in indices map
authorNiko Matsakis <niko@alum.mit.edu>
Mon, 6 Nov 2017 09:04:45 +0000 (04:04 -0500)
committerNiko Matsakis <niko@alum.mit.edu>
Thu, 16 Nov 2017 10:57:45 +0000 (05:57 -0500)
src/librustc_mir/lib.rs
src/librustc_mir/transform/nll/free_regions.rs
src/librustc_mir/transform/nll/region_infer.rs
src/librustc_mir/transform/nll/renumber.rs

index 5e65398e2b90993773109383c413ff4fbb5914b4..af309342dc522af1edc9b58d0cf0de0940e3d48c 100644 (file)
@@ -23,6 +23,7 @@
 #![feature(core_intrinsics)]
 #![feature(decl_macro)]
 #![feature(i128_type)]
+#![feature(match_default_bindings)]
 #![feature(rustc_diagnostic_macros)]
 #![feature(placement_in_syntax)]
 #![feature(collection_placement)]
index 554d212880ea9e9e5a3f199869e7b7a4cd4b93f3..36c14b55568fd38173245b0a8b2860e0b12c1aa5 100644 (file)
 use rustc::ty;
 use rustc::ty::subst::Substs;
 use rustc::util::nodemap::FxHashMap;
+use rustc_data_structures::indexed_vec::Idx;
+
+use super::RegionIndex;
 
 #[derive(Debug)]
 pub struct FreeRegions<'tcx> {
     /// Given a free region defined on this function (either early- or
-    /// late-bound), this maps it to its internal region index. The
-    /// corresponding variable will be "capped" so that it cannot
-    /// grow.
-    pub indices: FxHashMap<ty::Region<'tcx>, usize>,
+    /// late-bound), this maps it to its internal region index. When
+    /// the region context is created, the first N variables will be
+    /// created based on these indices.
+    pub indices: FxHashMap<ty::Region<'tcx>, RegionIndex>,
 
     /// The map from the typeck tables telling us how to relate free regions.
     pub free_region_map: &'tcx FreeRegionMap<'tcx>,
@@ -78,9 +81,9 @@ pub fn free_regions<'a, 'gcx, 'tcx>(
 }
 
 fn insert_free_region<'tcx>(
-    free_regions: &mut FxHashMap<ty::Region<'tcx>, usize>,
+    free_regions: &mut FxHashMap<ty::Region<'tcx>, RegionIndex>,
     region: ty::Region<'tcx>,
 ) {
-    let len = free_regions.len();
-    free_regions.entry(region).or_insert(len);
+    let next = RegionIndex::new(free_regions.len());
+    free_regions.entry(region).or_insert(next);
 }
index 553d5ad4a320ab687aea1c9d8f6a115b2914f7a2..f5731255449eca6b1a05e890fc363c01e5f30c0b 100644 (file)
@@ -13,7 +13,7 @@
 use rustc::infer::InferCtxt;
 use rustc::mir::{Location, Mir};
 use rustc::ty;
-use rustc_data_structures::indexed_vec::{Idx, IndexVec};
+use rustc_data_structures::indexed_vec::IndexVec;
 use rustc_data_structures::fx::FxHashSet;
 use std::collections::BTreeSet;
 use std::fmt;
@@ -151,15 +151,13 @@ pub fn new(
     /// is just itself. R1 (`'b`) in contrast also outlives `'a` and
     /// hence contains R0 and R1.
     fn init_free_regions(&mut self, free_regions: &FreeRegions<'tcx>, mir: &Mir<'tcx>) {
-        let &FreeRegions {
-            ref indices,
-            ref free_region_map,
+        let FreeRegions {
+            indices,
+            free_region_map,
         } = free_regions;
 
         // For each free region X:
-        for (free_region, index) in indices {
-            let variable = RegionIndex::new(*index);
-
+        for (free_region, &variable) in indices {
             self.free_regions.push(variable);
 
             // Initialize the name and a few other details.
@@ -184,7 +182,7 @@ fn init_free_regions(&mut self, free_regions: &FreeRegions<'tcx>, mir: &Mir<'tcx
             // Go through each region Y that outlives X (i.e., where
             // Y: X is true). Add `end(X)` into the set for `Y`.
             for superregion in free_region_map.regions_that_outlive(&free_region) {
-                let superregion_index = RegionIndex::new(indices[superregion]);
+                let superregion_index = indices[superregion];
                 self.definitions[superregion_index]
                     .value
                     .add_free_region(variable);
index a3ff7a041ca0714bd2d963274d377cd4ab03f18b..c0d6e0cbe657b58dc7c1046ee046c9507ff02a13 100644 (file)
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-use rustc_data_structures::indexed_vec::Idx;
+use rustc_data_structures::indexed_vec::{Idx, IndexVec};
 use rustc::ty::subst::{Kind, Substs};
 use rustc::ty::{self, ClosureSubsts, RegionKind, RegionVid, Ty, TypeFoldable};
 use rustc::mir::{BasicBlock, Local, Location, Mir, Rvalue, Statement, StatementKind};
@@ -17,6 +17,7 @@
 use syntax_pos::DUMMY_SP;
 use std::collections::HashMap;
 
+use super::RegionIndex;
 use super::free_regions::FreeRegions;
 
 /// Replaces all free regions appearing in the MIR with fresh
@@ -51,7 +52,7 @@ struct NLLVisitor<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> {
     num_region_variables: usize,
     infcx: &'a InferCtxt<'a, 'gcx, 'tcx>,
     free_regions: &'a FreeRegions<'tcx>,
-    free_region_inference_vars: Vec<ty::Region<'tcx>>,
+    free_region_inference_vars: IndexVec<RegionIndex, ty::Region<'tcx>>,
     arg_count: usize,
 }