diff --git a/src/librustc/infer/mod.rs b/src/librustc/infer/mod.rs index be9adf7085c..697478015cb 100644 --- a/src/librustc/infer/mod.rs +++ b/src/librustc/infer/mod.rs @@ -34,7 +34,7 @@ use ty::{self, Ty, TyCtxt}; use ty::error::{ExpectedFound, TypeError, UnconstrainedNumeric}; use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use ty::relate::{Relate, RelateResult, TypeRelation}; -use traits::{self, PredicateObligations, ProjectionMode}; +use traits::{self, PredicateObligations, Reveal}; use rustc_data_structures::unify::{self, UnificationTable}; use std::cell::{Cell, RefCell, Ref, RefMut}; use std::fmt; @@ -147,8 +147,8 @@ pub struct InferCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> { // Sadly, the behavior of projection varies a bit depending on the // stage of compilation. The specifics are given in the - // documentation for `ProjectionMode`. - projection_mode: ProjectionMode, + // documentation for `Reveal`. + projection_mode: Reveal, // When an error occurs, we want to avoid reporting "derived" // errors that are due to this original failure. Normally, we @@ -459,7 +459,7 @@ pub struct InferCtxtBuilder<'a, 'gcx: 'a+'tcx, 'tcx: 'a> { arenas: ty::CtxtArenas<'tcx>, tables: Option>>, param_env: Option>, - projection_mode: ProjectionMode, + projection_mode: Reveal, normalize: bool } @@ -467,7 +467,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'gcx> { pub fn infer_ctxt(self, tables: Option>, param_env: Option>, - projection_mode: ProjectionMode) + projection_mode: Reveal) -> InferCtxtBuilder<'a, 'gcx, 'tcx> { InferCtxtBuilder { global_tcx: self, @@ -479,7 +479,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'gcx> { } } - pub fn normalizing_infer_ctxt(self, projection_mode: ProjectionMode) + pub fn normalizing_infer_ctxt(self, projection_mode: Reveal) -> InferCtxtBuilder<'a, 'gcx, 'tcx> { InferCtxtBuilder { global_tcx: self, @@ -509,7 +509,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'gcx> { projection_cache: RefCell::new(traits::ProjectionCache::new()), reported_trait_errors: RefCell::new(FnvHashSet()), normalize: false, - projection_mode: ProjectionMode::AnyFinal, + projection_mode: Reveal::NotSpecializable, tainted_by_errors_flag: Cell::new(false), err_count_on_creation: self.sess.err_count(), obligations_in_snapshot: Cell::new(false), @@ -641,7 +641,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { return value; } - self.infer_ctxt(None, None, ProjectionMode::Any).enter(|infcx| { + self.infer_ctxt(None, None, Reveal::All).enter(|infcx| { value.trans_normalize(&infcx) }) } @@ -659,7 +659,7 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> { return value; } - self.infer_ctxt(None, Some(env.clone()), ProjectionMode::Any).enter(|infcx| { + self.infer_ctxt(None, Some(env.clone()), Reveal::All).enter(|infcx| { value.trans_normalize(&infcx) }) } @@ -736,7 +736,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { Ok(self.tcx.erase_regions(&result)) } - pub fn projection_mode(&self) -> ProjectionMode { + pub fn projection_mode(&self) -> Reveal { self.projection_mode } diff --git a/src/librustc/middle/intrinsicck.rs b/src/librustc/middle/intrinsicck.rs index d753381d71e..15f2f21ef25 100644 --- a/src/librustc/middle/intrinsicck.rs +++ b/src/librustc/middle/intrinsicck.rs @@ -12,7 +12,7 @@ use dep_graph::DepNode; use hir::def::Def; use hir::def_id::DefId; use infer::InferCtxt; -use traits::ProjectionMode; +use traits::Reveal; use ty::{self, Ty, TyCtxt}; use ty::layout::{LayoutError, Pointer, SizeSkeleton}; @@ -36,7 +36,7 @@ struct ItemVisitor<'a, 'tcx: 'a> { impl<'a, 'tcx> ItemVisitor<'a, 'tcx> { fn visit_const(&mut self, item_id: ast::NodeId, expr: &hir::Expr) { let param_env = ty::ParameterEnvironment::for_item(self.tcx, item_id); - self.tcx.infer_ctxt(None, Some(param_env), ProjectionMode::Any).enter(|infcx| { + self.tcx.infer_ctxt(None, Some(param_env), Reveal::All).enter(|infcx| { let mut visitor = ExprVisitor { infcx: &infcx }; @@ -114,7 +114,7 @@ impl<'a, 'gcx, 'tcx> ExprVisitor<'a, 'gcx, 'tcx> { impl<'a, 'tcx, 'v> Visitor<'v> for ItemVisitor<'a, 'tcx> { // const, static and N in [T; N]. fn visit_expr(&mut self, expr: &hir::Expr) { - self.tcx.infer_ctxt(None, None, ProjectionMode::Any).enter(|infcx| { + self.tcx.infer_ctxt(None, None, Reveal::All).enter(|infcx| { let mut visitor = ExprVisitor { infcx: &infcx }; @@ -144,7 +144,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for ItemVisitor<'a, 'tcx> { span_bug!(s, "intrinsicck: closure outside of function") } let param_env = ty::ParameterEnvironment::for_item(self.tcx, id); - self.tcx.infer_ctxt(None, Some(param_env), ProjectionMode::Any).enter(|infcx| { + self.tcx.infer_ctxt(None, Some(param_env), Reveal::All).enter(|infcx| { let mut visitor = ExprVisitor { infcx: &infcx }; diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 1222b5f42a1..f62c9a5d882 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -113,7 +113,7 @@ use dep_graph::DepNode; use hir::def::*; use hir::pat_util; use ty::{self, TyCtxt, ParameterEnvironment}; -use traits::{self, ProjectionMode}; +use traits::{self, Reveal}; use ty::subst::Subst; use lint; use util::nodemap::NodeMap; @@ -1484,7 +1484,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { let param_env = ParameterEnvironment::for_item(self.ir.tcx, id); let t_ret_subst = t_ret.subst(self.ir.tcx, ¶m_env.free_substs); let is_nil = self.ir.tcx.infer_ctxt(None, Some(param_env), - ProjectionMode::Any).enter(|infcx| { + Reveal::All).enter(|infcx| { let cause = traits::ObligationCause::dummy(); traits::fully_normalize(&infcx, cause, &t_ret_subst).unwrap().is_nil() }); diff --git a/src/librustc/traits/mod.rs b/src/librustc/traits/mod.rs index 17aa6544fe7..693b3c2d1c0 100644 --- a/src/librustc/traits/mod.rs +++ b/src/librustc/traits/mod.rs @@ -32,7 +32,7 @@ pub use self::coherence::OrphanCheckErr; pub use self::fulfill::{FulfillmentContext, GlobalFulfilledPredicates, RegionObligation}; pub use self::project::MismatchedProjectionTypes; pub use self::project::{normalize, normalize_projection_type, Normalized}; -pub use self::project::{ProjectionCache, ProjectionCacheSnapshot, ProjectionMode}; +pub use self::project::{ProjectionCache, ProjectionCacheSnapshot, Reveal}; pub use self::object_safety::ObjectSafetyViolation; pub use self::object_safety::MethodViolationCode; pub use self::select::{EvaluationCache, SelectionContext, SelectionCache}; @@ -435,7 +435,7 @@ pub fn normalize_param_env_or_error<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, let elaborated_env = unnormalized_env.with_caller_bounds(predicates); - tcx.infer_ctxt(None, Some(elaborated_env), ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, Some(elaborated_env), Reveal::NotSpecializable).enter(|infcx| { let predicates = match fully_normalize(&infcx, cause, &infcx.parameter_environment.caller_bounds) { Ok(predicates) => predicates, diff --git a/src/librustc/traits/project.rs b/src/librustc/traits/project.rs index 30faf1a5f8b..b43074a68b1 100644 --- a/src/librustc/traits/project.rs +++ b/src/librustc/traits/project.rs @@ -38,7 +38,7 @@ use std::rc::Rc; /// Depending on the stage of compilation, we want projection to be /// more or less conservative. #[derive(Debug, Copy, Clone, PartialEq, Eq)] -pub enum ProjectionMode { +pub enum Reveal { /// FIXME (#32205) /// At coherence-checking time, we're still constructing the /// specialization graph, and thus we only project @@ -67,7 +67,7 @@ pub enum ProjectionMode { /// /// The projection would succeed if `Output` had been defined /// directly in the impl for `u8`. - Topmost, + ExactMatch, /// At type-checking time, we refuse to project any associated /// type that is marked `default`. Non-`default` ("final") types @@ -91,36 +91,12 @@ pub enum ProjectionMode { /// fn main() { /// let <() as Assoc>::Output = true; /// } - AnyFinal, + NotSpecializable, /// At trans time, all projections will succeed. - Any, + All, } -impl ProjectionMode { - pub fn is_topmost(&self) -> bool { - match *self { - ProjectionMode::Topmost => true, - _ => false, - } - } - - pub fn is_any_final(&self) -> bool { - match *self { - ProjectionMode::AnyFinal => true, - _ => false, - } - } - - pub fn is_any(&self) -> bool { - match *self { - ProjectionMode::Any => true, - _ => false, - } - } -} - - pub type PolyProjectionObligation<'tcx> = Obligation<'tcx, ty::PolyProjectionPredicate<'tcx>>; @@ -902,7 +878,7 @@ fn assemble_candidates_from_impls<'cx, 'gcx, 'tcx>( candidate_set.vec.push(ProjectionTyCandidate::Select); } - super::VtableImpl(ref impl_data) if !selcx.projection_mode().is_any() => { + super::VtableImpl(ref impl_data) if selcx.projection_mode() != Reveal::All => { // We have to be careful when projecting out of an // impl because of specialization. If we are not in // trans (i.e., projection mode is not "any"), and the @@ -1008,7 +984,7 @@ fn assemble_candidates_from_impls<'cx, 'gcx, 'tcx>( } super::VtableImpl(_) => { // In trans mode, we can just project out of impls, no prob. - assert!(selcx.projection_mode().is_any()); + assert!(selcx.projection_mode() == Reveal::All); candidate_set.vec.push(ProjectionTyCandidate::Select); } super::VtableParam(..) => { @@ -1332,7 +1308,7 @@ fn confirm_impl_candidate<'cx, 'gcx, 'tcx>( /// starting from the given impl. /// /// Based on the "projection mode", this lookup may in fact only examine the -/// topmost impl. See the comments for `ProjectionMode` for more details. +/// topmost impl. See the comments for `Reveal` for more details. fn assoc_ty_def<'cx, 'gcx, 'tcx>( selcx: &SelectionContext<'cx, 'gcx, 'tcx>, impl_def_id: DefId, @@ -1341,7 +1317,7 @@ fn assoc_ty_def<'cx, 'gcx, 'tcx>( { let trait_def_id = selcx.tcx().impl_trait_ref(impl_def_id).unwrap().def_id; - if selcx.projection_mode().is_topmost() { + if selcx.projection_mode() == Reveal::ExactMatch { let impl_node = specialization_graph::Node::Impl(impl_def_id); for item in impl_node.items(selcx.tcx()) { if let ty::TypeTraitItem(assoc_ty) = item { diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 7a20b43b8f2..028d05731b6 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -23,7 +23,7 @@ use super::{PredicateObligation, TraitObligation, ObligationCause}; use super::{ObligationCauseCode, BuiltinDerivedObligation, ImplDerivedObligation}; use super::{SelectionError, Unimplemented, OutputTypeParameterMismatch}; use super::{ObjectCastObligation, Obligation}; -use super::ProjectionMode; +use super::Reveal; use super::TraitNotObjectSafe; use super::Selection; use super::SelectionResult; @@ -343,7 +343,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { self.infcx } - pub fn projection_mode(&self) -> ProjectionMode { + pub fn projection_mode(&self) -> Reveal { self.infcx.projection_mode() } diff --git a/src/librustc/traits/specialize/mod.rs b/src/librustc/traits/specialize/mod.rs index 9348def1311..38cccb9753d 100644 --- a/src/librustc/traits/specialize/mod.rs +++ b/src/librustc/traits/specialize/mod.rs @@ -25,7 +25,7 @@ use hir::def_id::DefId; use infer::{InferCtxt, TypeOrigin}; use middle::region; use ty::subst::{Subst, Substs}; -use traits::{self, ProjectionMode, ObligationCause, Normalized}; +use traits::{self, Reveal, ObligationCause, Normalized}; use ty::{self, TyCtxt}; use syntax_pos::DUMMY_SP; @@ -151,7 +151,7 @@ pub fn specializes<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, .unwrap() .subst(tcx, &penv.free_substs); - let result = tcx.normalizing_infer_ctxt(ProjectionMode::Topmost).enter(|mut infcx| { + let result = tcx.normalizing_infer_ctxt(Reveal::ExactMatch).enter(|mut infcx| { // Normalize the trait reference, adding any obligations // that arise into the impl1 assumptions. let Normalized { value: impl1_trait_ref, obligations: normalization_obligations } = { diff --git a/src/librustc/traits/specialize/specialization_graph.rs b/src/librustc/traits/specialize/specialization_graph.rs index ae7deb48f86..a47cd23c64a 100644 --- a/src/librustc/traits/specialize/specialization_graph.rs +++ b/src/librustc/traits/specialize/specialization_graph.rs @@ -14,7 +14,7 @@ use std::rc::Rc; use super::{OverlapError, specializes}; use hir::def_id::DefId; -use traits::{self, ProjectionMode}; +use traits::{self, Reveal}; use ty::{self, TyCtxt, ImplOrTraitItem, TraitDef, TypeFoldable}; use ty::fast_reject::{self, SimplifiedType}; use syntax::ast::Name; @@ -111,8 +111,7 @@ impl<'a, 'gcx, 'tcx> Children { let possible_sibling = *slot; let tcx = tcx.global_tcx(); - let (le, ge) = tcx.infer_ctxt(None, None, - ProjectionMode::Topmost).enter(|infcx| { + let (le, ge) = tcx.infer_ctxt(None, None, Reveal::ExactMatch).enter(|infcx| { let overlap = traits::overlapping_impls(&infcx, possible_sibling, impl_def_id); diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index d9ffe36ea47..d9802c48f6c 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -14,7 +14,7 @@ use hir::def_id::DefId; use ty::subst; use infer::InferCtxt; use hir::pat_util; -use traits::{self, ProjectionMode}; +use traits::{self, Reveal}; use ty::{self, Ty, TyCtxt, TypeAndMut, TypeFlags, TypeFoldable}; use ty::{Disr, ParameterEnvironment}; use ty::fold::TypeVisitor; @@ -137,8 +137,7 @@ impl<'tcx> ParameterEnvironment<'tcx> { self_type: Ty<'tcx>, span: Span) -> Result<(),CopyImplementationError> { // FIXME: (@jroesch) float this code up - tcx.infer_ctxt(None, Some(self.clone()), - ProjectionMode::Topmost).enter(|infcx| { + tcx.infer_ctxt(None, Some(self.clone()), Reveal::ExactMatch).enter(|infcx| { let adt = match self_type.sty { ty::TyStruct(struct_def, substs) => { for field in struct_def.all_fields() { @@ -533,7 +532,7 @@ impl<'a, 'tcx> ty::TyS<'tcx> { param_env: &ParameterEnvironment<'tcx>, bound: ty::BuiltinBound, span: Span) -> bool { - tcx.infer_ctxt(None, Some(param_env.clone()), ProjectionMode::Topmost).enter(|infcx| { + tcx.infer_ctxt(None, Some(param_env.clone()), Reveal::ExactMatch).enter(|infcx| { traits::type_known_to_meet_builtin_bound(&infcx, self, bound, span) }) } diff --git a/src/librustc_const_eval/check_match.rs b/src/librustc_const_eval/check_match.rs index 5fe4830c365..3e88dec8cb2 100644 --- a/src/librustc_const_eval/check_match.rs +++ b/src/librustc_const_eval/check_match.rs @@ -25,7 +25,7 @@ use rustc::middle::expr_use_visitor::{LoanCause, MutateMode}; use rustc::middle::expr_use_visitor as euv; use rustc::middle::mem_categorization::{cmt}; use rustc::hir::pat_util::*; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::ty::*; use rustc::ty; use std::cmp::Ordering; @@ -1133,7 +1133,7 @@ fn check_legality_of_move_bindings(cx: &MatchCheckCtxt, let pat_ty = cx.tcx.node_id_to_type(p.id); //FIXME: (@jroesch) this code should be floated up as well cx.tcx.infer_ctxt(None, Some(cx.param_env.clone()), - ProjectionMode::AnyFinal).enter(|infcx| { + Reveal::NotSpecializable).enter(|infcx| { if infcx.type_moves_by_default(pat_ty, pat.span) { check_move(p, sub.as_ref().map(|p| &**p)); } @@ -1149,7 +1149,7 @@ fn check_legality_of_move_bindings(cx: &MatchCheckCtxt, fn check_for_mutation_in_guard<'a, 'tcx>(cx: &'a MatchCheckCtxt<'a, 'tcx>, guard: &hir::Expr) { cx.tcx.infer_ctxt(None, Some(cx.param_env.clone()), - ProjectionMode::AnyFinal).enter(|infcx| { + Reveal::NotSpecializable).enter(|infcx| { let mut checker = MutationChecker { cx: cx, }; diff --git a/src/librustc_const_eval/eval.rs b/src/librustc_const_eval/eval.rs index 9c9453ae3d3..73b54c4374f 100644 --- a/src/librustc_const_eval/eval.rs +++ b/src/librustc_const_eval/eval.rs @@ -24,7 +24,7 @@ use rustc::hir::def_id::DefId; use rustc::hir::pat_util::def_to_path; use rustc::ty::{self, Ty, TyCtxt, subst}; use rustc::ty::util::IntTypeExt; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::util::common::ErrorReported; use rustc::util::nodemap::NodeMap; use rustc::lint; @@ -1055,7 +1055,7 @@ fn resolve_trait_associated_const<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>, trait_ref); tcx.populate_implementations_for_trait_if_necessary(trait_ref.def_id()); - tcx.infer_ctxt(None, None, ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, None, Reveal::NotSpecializable).enter(|infcx| { let mut selcx = traits::SelectionContext::new(&infcx); let obligation = traits::Obligation::new(traits::ObligationCause::dummy(), trait_ref.to_poly_trait_predicate()); @@ -1073,9 +1073,9 @@ fn resolve_trait_associated_const<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>, }; // NOTE: this code does not currently account for specialization, but when - // it does so, it should hook into the ProjectionMode to determine when the + // it does so, it should hook into the Reveal to determine when the // constant should resolve; this will also require plumbing through to this - // function whether we are in "trans mode" to pick the right ProjectionMode + // function whether we are in "trans mode" to pick the right Reveal // when constructing the inference context above. match selection { traits::VtableImpl(ref impl_data) => { diff --git a/src/librustc_driver/test.rs b/src/librustc_driver/test.rs index 2b0bd14d83f..30fe38a0603 100644 --- a/src/librustc_driver/test.rs +++ b/src/librustc_driver/test.rs @@ -22,7 +22,7 @@ use rustc::middle::resolve_lifetime; use rustc::middle::stability; use rustc::ty::subst; use rustc::ty::subst::Subst; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::ty::{self, Ty, TyCtxt, TypeFoldable}; use rustc::infer::{self, InferOk, InferResult, TypeOrigin}; use rustc_metadata::cstore::CStore; @@ -141,7 +141,7 @@ fn test_env(source_string: &str, index, "test_crate", |tcx| { - tcx.infer_ctxt(None, None, ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, None, Reveal::NotSpecializable).enter(|infcx| { body(Env { infcx: &infcx }); let free_regions = FreeRegionMap::new(); diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 49dad2d0f6d..d8ec79fb060 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -35,7 +35,7 @@ use rustc::cfg; use rustc::ty::subst::Substs; use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::adjustment; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::hir::map as hir_map; use util::nodemap::{NodeSet}; use lint::{Level, LateContext, LintContext, LintArray, Lint}; @@ -911,7 +911,7 @@ impl LateLintPass for UnconditionalRecursion { let node_id = tcx.map.as_local_node_id(method.def_id).unwrap(); let param_env = Some(ty::ParameterEnvironment::for_item(tcx, node_id)); - tcx.infer_ctxt(None, param_env, ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, param_env, Reveal::NotSpecializable).enter(|infcx| { let mut selcx = traits::SelectionContext::new(&infcx); match selcx.select(&obligation) { // The method comes from a `T: Trait` bound. diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index f688bd80ee9..09dd8748b30 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -14,7 +14,7 @@ use rustc::hir::def_id::DefId; use rustc::ty::subst::Substs; use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::layout::{Layout, Primitive}; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use middle::const_val::ConstVal; use rustc_const_eval::eval_const_expr_partial; use rustc_const_eval::EvalHint::ExprTypeChecked; @@ -697,7 +697,7 @@ impl LateLintPass for VariantSizeDifferences { if let hir::ItemEnum(ref enum_definition, ref gens) = it.node { if gens.ty_params.is_empty() { // sizes only make sense for non-generic types let t = cx.tcx.node_id_to_type(it.id); - let layout = cx.tcx.normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + let layout = cx.tcx.normalizing_infer_ctxt(Reveal::All).enter(|infcx| { let ty = cx.tcx.erase_regions(&t); ty.layout(&infcx).unwrap_or_else(|e| { bug!("failed to get layout for `{}`: {}", t, e) diff --git a/src/librustc_mir/mir_map.rs b/src/librustc_mir/mir_map.rs index 42a643b8af6..5e92a057da3 100644 --- a/src/librustc_mir/mir_map.rs +++ b/src/librustc_mir/mir_map.rs @@ -27,7 +27,7 @@ use hair::cx::Cx; use rustc::mir::mir_map::MirMap; use rustc::infer::InferCtxtBuilder; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::subst::Substs; use rustc::hir; @@ -103,7 +103,7 @@ impl<'a, 'gcx, 'tcx> BuildMir<'a, 'gcx> { let def_id = self.tcx.map.local_def_id(src.item_id()); CxBuilder { src: src, - infcx: self.tcx.infer_ctxt(None, Some(param_env), ProjectionMode::AnyFinal), + infcx: self.tcx.infer_ctxt(None, Some(param_env), Reveal::NotSpecializable), def_id: def_id, map: self.map } diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index c061f2d5620..7ebc72bcc5f 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -21,7 +21,7 @@ use rustc::hir; use rustc::hir::def_id::DefId; use rustc::hir::intravisit::FnKind; use rustc::hir::map::blocks::FnLikeNode; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::ty::{self, TyCtxt, Ty}; use rustc::ty::cast::CastTy; use rustc::mir::repr::*; @@ -992,7 +992,7 @@ impl<'tcx> MirMapPass<'tcx> for QualifyAndPromoteConstants { // Statics must be Sync. if mode == Mode::Static { let ty = mir.return_ty.unwrap(); - tcx.infer_ctxt(None, None, ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, None, Reveal::NotSpecializable).enter(|infcx| { let cause = traits::ObligationCause::new(mir.span, id, traits::SharedStatic); let mut fulfillment_cx = traits::FulfillmentContext::new(); fulfillment_cx.register_builtin_bound(&infcx, ty, ty::BoundSync, cause); diff --git a/src/librustc_mir/transform/type_check.rs b/src/librustc_mir/transform/type_check.rs index c8556d5e0d8..52f41741b08 100644 --- a/src/librustc_mir/transform/type_check.rs +++ b/src/librustc_mir/transform/type_check.rs @@ -12,7 +12,7 @@ #![allow(unreachable_code)] use rustc::infer::{self, InferCtxt, InferOk}; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::ty::fold::TypeFoldable; use rustc::ty::{self, Ty, TyCtxt}; use rustc::mir::repr::*; @@ -695,7 +695,7 @@ impl<'tcx> MirPass<'tcx> for TypeckMir { return; } let param_env = ty::ParameterEnvironment::for_item(tcx, src.item_id()); - tcx.infer_ctxt(None, Some(param_env), ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, Some(param_env), Reveal::NotSpecializable).enter(|infcx| { let mut checker = TypeChecker::new(&infcx); { let mut verifier = TypeVerifier::new(&mut checker, mir); diff --git a/src/librustc_passes/consts.rs b/src/librustc_passes/consts.rs index fc55118c9f4..37e42cdea1b 100644 --- a/src/librustc_passes/consts.rs +++ b/src/librustc_passes/consts.rs @@ -39,7 +39,7 @@ use rustc::middle::expr_use_visitor as euv; use rustc::middle::mem_categorization as mc; use rustc::middle::mem_categorization::Categorization; use rustc::ty::{self, Ty, TyCtxt}; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::util::common::ErrorReported; use rustc::util::nodemap::NodeMap; use rustc::middle::const_qualif::ConstQualif; @@ -96,7 +96,7 @@ impl<'a, 'gcx> CheckCrateVisitor<'a, 'gcx> { }; self.tcx - .infer_ctxt(None, Some(param_env), ProjectionMode::AnyFinal) + .infer_ctxt(None, Some(param_env), Reveal::NotSpecializable) .enter(|infcx| f(&mut euv::ExprUseVisitor::new(self, &infcx))) } diff --git a/src/librustc_passes/rvalues.rs b/src/librustc_passes/rvalues.rs index 2a5dc50cae9..782ee34edd4 100644 --- a/src/librustc_passes/rvalues.rs +++ b/src/librustc_passes/rvalues.rs @@ -15,7 +15,7 @@ use rustc::dep_graph::DepNode; use rustc::middle::expr_use_visitor as euv; use rustc::middle::mem_categorization as mc; use rustc::ty::{self, TyCtxt, ParameterEnvironment}; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::hir; use rustc::hir::intravisit; @@ -41,7 +41,7 @@ impl<'a, 'tcx, 'v> intravisit::Visitor<'v> for RvalueContext<'a, 'tcx> { // FIXME (@jroesch) change this to be an inference context let param_env = ParameterEnvironment::for_item(self.tcx, fn_id); self.tcx.infer_ctxt(None, Some(param_env.clone()), - ProjectionMode::AnyFinal).enter(|infcx| { + Reveal::NotSpecializable).enter(|infcx| { let mut delegate = RvalueContextDelegate { tcx: infcx.tcx, param_env: ¶m_env diff --git a/src/librustc_trans/_match.rs b/src/librustc_trans/_match.rs index f7fd970f37f..29b3f6ce52f 100644 --- a/src/librustc_trans/_match.rs +++ b/src/librustc_trans/_match.rs @@ -217,7 +217,7 @@ use type_of; use Disr; use value::Value; use rustc::ty::{self, Ty, TyCtxt}; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use session::config::NoDebugInfo; use util::common::indenter; use util::nodemap::FnvHashMap; @@ -1471,7 +1471,7 @@ fn is_discr_reassigned(bcx: Block, discr: &hir::Expr, body: &hir::Expr) -> bool field: field, reassigned: false }; - bcx.tcx().normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + bcx.tcx().normalizing_infer_ctxt(Reveal::All).enter(|infcx| { let mut visitor = euv::ExprUseVisitor::new(&mut rc, &infcx); visitor.walk_expr(body); }); diff --git a/src/librustc_trans/common.rs b/src/librustc_trans/common.rs index b3729cc23f6..dea5a1560e1 100644 --- a/src/librustc_trans/common.rs +++ b/src/librustc_trans/common.rs @@ -40,7 +40,7 @@ use type_::Type; use value::Value; use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::layout::Layout; -use rustc::traits::{self, SelectionContext, ProjectionMode}; +use rustc::traits::{self, SelectionContext, Reveal}; use rustc::ty::fold::TypeFoldable; use rustc::hir; use util::nodemap::NodeMap; @@ -128,7 +128,7 @@ pub fn type_pair_fields<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, ty: Ty<'tcx>) pub fn type_is_imm_pair<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, ty: Ty<'tcx>) -> bool { let tcx = ccx.tcx(); - let layout = tcx.normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + let layout = tcx.normalizing_infer_ctxt(Reveal::All).enter(|infcx| { match ty.layout(&infcx) { Ok(layout) => layout, Err(err) => { @@ -1136,7 +1136,7 @@ pub fn fulfill_obligation<'a, 'tcx>(scx: &SharedCrateContext<'a, 'tcx>, // Do the initial selection for the obligation. This yields the // shallow result we are looking for -- that is, what specific impl. - tcx.normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + tcx.normalizing_infer_ctxt(Reveal::All).enter(|infcx| { let mut selcx = SelectionContext::new(&infcx); let obligation_cause = traits::ObligationCause::misc(span, @@ -1195,7 +1195,7 @@ pub fn normalize_and_test_predicates<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, debug!("normalize_and_test_predicates(predicates={:?})", predicates); - tcx.normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + tcx.normalizing_infer_ctxt(Reveal::All).enter(|infcx| { let mut selcx = SelectionContext::new(&infcx); let mut fulfill_cx = traits::FulfillmentContext::new(); let cause = traits::ObligationCause::dummy(); diff --git a/src/librustc_trans/glue.rs b/src/librustc_trans/glue.rs index 6bc48546dfa..93e5f4ba1e2 100644 --- a/src/librustc_trans/glue.rs +++ b/src/librustc_trans/glue.rs @@ -115,7 +115,7 @@ pub fn get_drop_glue_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, match t.sty { ty::TyBox(typ) if !type_needs_drop(tcx, typ) && type_is_sized(tcx, typ) => { - tcx.normalizing_infer_ctxt(traits::ProjectionMode::Any).enter(|infcx| { + tcx.normalizing_infer_ctxt(traits::Reveal::All).enter(|infcx| { let layout = t.layout(&infcx).unwrap(); if layout.size(&tcx.data_layout).bytes() == 0 { // `Box` does not allocate. diff --git a/src/librustc_trans/meth.rs b/src/librustc_trans/meth.rs index ac6af8d66e1..3d6093d4d69 100644 --- a/src/librustc_trans/meth.rs +++ b/src/librustc_trans/meth.rs @@ -17,7 +17,7 @@ use llvm::{ValueRef, get_params}; use rustc::hir::def_id::DefId; use rustc::ty::subst::{FnSpace, Subst, Substs}; use rustc::ty::subst; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use abi::FnType; use base::*; use build::*; @@ -321,7 +321,7 @@ pub fn get_impl_method<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, match trait_def.ancestors(impl_def_id).fn_defs(tcx, name).next() { Some(node_item) => { - let substs = tcx.normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + let substs = tcx.normalizing_infer_ctxt(Reveal::All).enter(|infcx| { let substs = traits::translate_substs(&infcx, impl_def_id, substs, node_item.node); tcx.lift(&substs).unwrap_or_else(|| { diff --git a/src/librustc_trans/type_of.rs b/src/librustc_trans/type_of.rs index e5acb9b6699..496870d6c27 100644 --- a/src/librustc_trans/type_of.rs +++ b/src/librustc_trans/type_of.rs @@ -16,7 +16,7 @@ use abi::FnType; use adt; use common::*; use machine; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use rustc::ty::{self, Ty, TypeFoldable}; use type_::Type; @@ -123,7 +123,7 @@ pub fn sizing_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Typ cx.llsizingtypes().borrow_mut().insert(t, llsizingty); // FIXME(eddyb) Temporary sanity check for ty::layout. - let layout = cx.tcx().normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| { + let layout = cx.tcx().normalizing_infer_ctxt(Reveal::All).enter(|infcx| { t.layout(&infcx) }); match layout { diff --git a/src/librustc_typeck/check/compare_method.rs b/src/librustc_typeck/check/compare_method.rs index 140fabce76b..e6ddc6ad693 100644 --- a/src/librustc_typeck/check/compare_method.rs +++ b/src/librustc_typeck/check/compare_method.rs @@ -11,7 +11,7 @@ use middle::free_region::FreeRegionMap; use rustc::infer::{self, InferOk, TypeOrigin}; use rustc::ty; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::ty::error::ExpectedFound; use rustc::ty::subst::{self, Subst, Substs, VecPerParamSpace}; use rustc::hir::map::Node; @@ -213,7 +213,7 @@ pub fn compare_impl_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, return; } - tcx.infer_ctxt(None, None, ProjectionMode::AnyFinal).enter(|mut infcx| { + tcx.infer_ctxt(None, None, Reveal::NotSpecializable).enter(|mut infcx| { let mut fulfillment_cx = traits::FulfillmentContext::new(); // Normalize the associated types in the trait_bounds. @@ -433,7 +433,7 @@ pub fn compare_const_impl<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, impl_trait_ref); let tcx = ccx.tcx; - tcx.infer_ctxt(None, None, ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, None, Reveal::NotSpecializable).enter(|infcx| { let mut fulfillment_cx = traits::FulfillmentContext::new(); // The below is for the most part highly similar to the procedure diff --git a/src/librustc_typeck/check/dropck.rs b/src/librustc_typeck/check/dropck.rs index 56e4108153e..0791c76c712 100644 --- a/src/librustc_typeck/check/dropck.rs +++ b/src/librustc_typeck/check/dropck.rs @@ -17,7 +17,7 @@ use rustc::infer; use middle::region; use rustc::ty::subst::{self, Subst}; use rustc::ty::{self, Ty, TyCtxt}; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use util::nodemap::FnvHashSet; use syntax::ast; @@ -84,7 +84,7 @@ fn ensure_drop_params_and_item_params_correspond<'a, 'tcx>( // check that the impl type can be made to match the trait type. let impl_param_env = ty::ParameterEnvironment::for_item(tcx, self_type_node_id); - tcx.infer_ctxt(None, Some(impl_param_env), ProjectionMode::AnyFinal).enter(|infcx| { + tcx.infer_ctxt(None, Some(impl_param_env), Reveal::NotSpecializable).enter(|infcx| { let tcx = infcx.tcx; let mut fulfillment_cx = traits::FulfillmentContext::new(); diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 36fdba37061..f4c8032c1d1 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -89,7 +89,7 @@ use hir::def_id::DefId; use hir::pat_util; use rustc::infer::{self, InferCtxt, InferOk, TypeOrigin, TypeTrace, type_variable}; use rustc::ty::subst::{self, Subst, Substs, VecPerParamSpace, ParamSpace}; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::ty::{GenericPredicates, TypeScheme}; use rustc::ty::{ParamTy, ParameterEnvironment}; use rustc::ty::{LvaluePreference, NoPreference, PreferMutLvalue}; @@ -390,7 +390,7 @@ impl<'a, 'gcx, 'tcx> CrateCtxt<'a, 'gcx> { ccx: self, infcx: self.tcx.infer_ctxt(Some(ty::Tables::empty()), param_env, - ProjectionMode::AnyFinal) + Reveal::NotSpecializable) } } } diff --git a/src/librustc_typeck/coherence/mod.rs b/src/librustc_typeck/coherence/mod.rs index 7a923cd29d0..3e6df0ca5bb 100644 --- a/src/librustc_typeck/coherence/mod.rs +++ b/src/librustc_typeck/coherence/mod.rs @@ -19,7 +19,7 @@ use hir::def_id::DefId; use middle::lang_items::UnsizeTraitLangItem; use rustc::ty::subst::{self, Subst}; use rustc::ty::{self, TyCtxt, TypeFoldable}; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::ty::{ImplOrTraitItemId, ConstTraitItemId}; use rustc::ty::{MethodTraitItemId, TypeTraitItemId, ParameterEnvironment}; use rustc::ty::{Ty, TyBool, TyChar, TyEnum, TyError}; @@ -399,7 +399,7 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> { debug!("check_implementations_of_coerce_unsized: {:?} -> {:?} (free)", source, target); - tcx.infer_ctxt(None, Some(param_env), ProjectionMode::Topmost).enter(|infcx| { + tcx.infer_ctxt(None, Some(param_env), Reveal::ExactMatch).enter(|infcx| { let origin = TypeOrigin::Misc(span); let check_mutbl = |mt_a: ty::TypeAndMut<'gcx>, mt_b: ty::TypeAndMut<'gcx>, mk_ptr: &Fn(Ty<'gcx>) -> Ty<'gcx>| { @@ -536,7 +536,7 @@ fn enforce_trait_manually_implementable(tcx: TyCtxt, sp: Span, trait_def_id: Def pub fn check_coherence(ccx: &CrateCtxt) { let _task = ccx.tcx.dep_graph.in_task(DepNode::Coherence); - ccx.tcx.infer_ctxt(None, None, ProjectionMode::Topmost).enter(|infcx| { + ccx.tcx.infer_ctxt(None, None, Reveal::ExactMatch).enter(|infcx| { CoherenceChecker { crate_context: ccx, inference_context: infcx, diff --git a/src/librustc_typeck/coherence/overlap.rs b/src/librustc_typeck/coherence/overlap.rs index 54bd141304d..46a9ef8d5ba 100644 --- a/src/librustc_typeck/coherence/overlap.rs +++ b/src/librustc_typeck/coherence/overlap.rs @@ -13,7 +13,7 @@ //! constructor provide a method with the same name. use hir::def_id::DefId; -use rustc::traits::{self, ProjectionMode}; +use rustc::traits::{self, Reveal}; use rustc::ty::{self, TyCtxt}; use syntax::ast; use rustc::dep_graph::DepNode; @@ -84,7 +84,7 @@ impl<'cx, 'tcx> OverlapChecker<'cx, 'tcx> { for (i, &impl1_def_id) in impls.iter().enumerate() { for &impl2_def_id in &impls[(i+1)..] { - self.tcx.infer_ctxt(None, None, ProjectionMode::Topmost).enter(|infcx| { + self.tcx.infer_ctxt(None, None, Reveal::ExactMatch).enter(|infcx| { if traits::overlapping_impls(&infcx, impl1_def_id, impl2_def_id).is_some() { self.check_for_common_items_in_impls(impl1_def_id, impl2_def_id) } diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs index a31961a157b..78e8c905ab7 100644 --- a/src/librustc_typeck/lib.rs +++ b/src/librustc_typeck/lib.rs @@ -107,7 +107,7 @@ use hir::map as hir_map; use rustc::infer::TypeOrigin; use rustc::ty::subst::Substs; use rustc::ty::{self, Ty, TyCtxt, TypeFoldable}; -use rustc::traits::ProjectionMode; +use rustc::traits::Reveal; use session::{config, CompileResult}; use util::common::time; @@ -190,7 +190,7 @@ fn require_same_types<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, t1: Ty<'tcx>, t2: Ty<'tcx>) -> bool { - ccx.tcx.infer_ctxt(None, None, ProjectionMode::AnyFinal).enter(|infcx| { + ccx.tcx.infer_ctxt(None, None, Reveal::NotSpecializable).enter(|infcx| { if let Err(err) = infcx.eq_types(false, origin.clone(), t1, t2) { infcx.report_mismatched_types(origin, t1, t2, err); false