From cf7fe00d9181240a0e9aee8e33294817b3625bf8 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 10 Nov 2017 10:01:22 +0100 Subject: [PATCH] Make RegionVid use newtype_index! Closes #45843 --- .../infer/lexical_region_resolve/mod.rs | 18 ++++++++-------- src/librustc/infer/region_constraints/mod.rs | 4 ++-- src/librustc/infer/unify_key.rs | 6 +++--- src/librustc/ty/sty.rs | 21 +++++-------------- src/librustc/util/ppaux.rs | 4 ++-- 5 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/librustc/infer/lexical_region_resolve/mod.rs b/src/librustc/infer/lexical_region_resolve/mod.rs index 0692d284d7c16..5a4f2157298b0 100644 --- a/src/librustc/infer/lexical_region_resolve/mod.rs +++ b/src/librustc/infer/lexical_region_resolve/mod.rs @@ -171,7 +171,7 @@ impl<'cx, 'gcx, 'tcx> LexicalResolver<'cx, 'gcx, 'tcx> { for (r, vid) in seeds { // While all things transitively reachable in the graph // from the variable (`'0` in the example above). - let seed_index = NodeIndex(vid.index as usize); + let seed_index = NodeIndex(vid.index() as usize); for succ_index in graph.depth_traverse(seed_index, OUTGOING) { let succ_index = succ_index.0; @@ -512,16 +512,16 @@ impl<'cx, 'gcx, 'tcx> LexicalResolver<'cx, 'gcx, 'tcx> { match *constraint { Constraint::VarSubVar(a_id, b_id) => { graph.add_edge( - NodeIndex(a_id.index as usize), - NodeIndex(b_id.index as usize), + NodeIndex(a_id.index() as usize), + NodeIndex(b_id.index() as usize), *constraint, ); } Constraint::RegSubVar(_, b_id) => { - graph.add_edge(dummy_source, NodeIndex(b_id.index as usize), *constraint); + graph.add_edge(dummy_source, NodeIndex(b_id.index() as usize), *constraint); } Constraint::VarSubReg(a_id, _) => { - graph.add_edge(NodeIndex(a_id.index as usize), dummy_sink, *constraint); + graph.add_edge(NodeIndex(a_id.index() as usize), dummy_sink, *constraint); } Constraint::RegSubReg(..) => { // this would be an edge from `dummy_source` to @@ -630,9 +630,9 @@ impl<'cx, 'gcx, 'tcx> LexicalResolver<'cx, 'gcx, 'tcx> { let node_idx = state.stack.pop().unwrap(); // check whether we've visited this node on some previous walk - if dup_vec[node_idx.index as usize] == u32::MAX { - dup_vec[node_idx.index as usize] = orig_node_idx.index; - } else if dup_vec[node_idx.index as usize] != orig_node_idx.index { + if dup_vec[node_idx.index() as usize] == u32::MAX { + dup_vec[node_idx.index() as usize] = orig_node_idx.index() as u32; + } else if dup_vec[node_idx.index() as usize] != orig_node_idx.index() as u32 { state.dup_found = true; } @@ -659,7 +659,7 @@ impl<'cx, 'gcx, 'tcx> LexicalResolver<'cx, 'gcx, 'tcx> { ) { debug!("process_edges(source_vid={:?}, dir={:?})", source_vid, dir); - let source_node_index = NodeIndex(source_vid.index as usize); + let source_node_index = NodeIndex(source_vid.index() as usize); for (_, edge) in graph.adjacent_edges(source_node_index, dir) { match edge.data { Constraint::VarSubVar(from_vid, to_vid) => { diff --git a/src/librustc/infer/region_constraints/mod.rs b/src/librustc/infer/region_constraints/mod.rs index 02f2c27303f51..f02bf3115dc37 100644 --- a/src/librustc/infer/region_constraints/mod.rs +++ b/src/librustc/infer/region_constraints/mod.rs @@ -16,7 +16,7 @@ use self::CombineMapType::*; use super::{MiscVariable, RegionVariableOrigin, SubregionOrigin}; use super::unify_key; -use rustc_data_structures::indexed_vec::IndexVec; +use rustc_data_structures::indexed_vec::{IndexVec, Idx}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::unify::{self, UnificationTable}; use ty::{self, Ty, TyCtxt}; @@ -363,7 +363,7 @@ impl<'tcx> RegionConstraintCollector<'tcx> { } AddVar(vid) => { self.var_origins.pop().unwrap(); - assert_eq!(self.var_origins.len(), vid.index as usize); + assert_eq!(self.var_origins.len(), vid.index() as usize); } AddConstraint(ref constraint) => { self.data.constraints.remove(constraint); diff --git a/src/librustc/infer/unify_key.rs b/src/librustc/infer/unify_key.rs index d7e3a53ff25c9..99b11794cc5b5 100644 --- a/src/librustc/infer/unify_key.rs +++ b/src/librustc/infer/unify_key.rs @@ -33,7 +33,7 @@ pub struct RegionVidKey { impl Combine for RegionVidKey { fn combine(&self, other: &RegionVidKey) -> RegionVidKey { - let min_vid = if self.min_vid.index < other.min_vid.index { + let min_vid = if self.min_vid.index() < other.min_vid.index() { self.min_vid } else { other.min_vid @@ -45,8 +45,8 @@ impl Combine for RegionVidKey { impl UnifyKey for ty::RegionVid { type Value = RegionVidKey; - fn index(&self) -> u32 { self.index } - fn from_index(i: u32) -> ty::RegionVid { ty::RegionVid { index: i } } + fn index(&self) -> u32 { self.0 } + fn from_index(i: u32) -> ty::RegionVid { ty::RegionVid(i) } fn tag(_: Option) -> &'static str { "RegionVid" } } diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index cf834a3d2d492..11b9fdae30b60 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -894,22 +894,11 @@ pub struct FloatVid { pub index: u32, } -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, RustcEncodable, RustcDecodable, Hash, Copy)] -pub struct RegionVid { - pub index: u32, -} - -// FIXME: We could convert this to use `newtype_index!` -impl Idx for RegionVid { - fn new(value: usize) -> Self { - assert!(value < ::std::u32::MAX as usize); - RegionVid { index: value as u32 } - } - - fn index(self) -> usize { - self.index as usize - } -} +newtype_index!(RegionVid + { + pub idx + DEBUG_FORMAT = custom, + }); #[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable)] pub struct SkolemizedRegionVid { diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index acb929981fbf2..89d8902940a24 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -726,7 +726,7 @@ define_print! { } } ty::ReVar(region_vid) if cx.identify_regions => { - write!(f, "'{}rv", region_vid.index) + write!(f, "'{}rv", region_vid.index()) } ty::ReScope(_) | ty::ReVar(_) | @@ -850,7 +850,7 @@ impl fmt::Debug for ty::FloatVid { impl fmt::Debug for ty::RegionVid { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "'_#{}r", self.index) + write!(f, "'_#{}r", self.index()) } }