mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
rustc: rename ProjectionMode and its variant to be more memorable.
This commit is contained in:
parent
8787a12334
commit
d1d16c94c5
@ -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<RefCell<ty::Tables<'tcx>>>,
|
||||
param_env: Option<ty::ParameterEnvironment<'gcx>>,
|
||||
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<ty::Tables<'tcx>>,
|
||||
param_env: Option<ty::ParameterEnvironment<'gcx>>,
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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()
|
||||
});
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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 } = {
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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) => {
|
||||
|
@ -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<F>(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();
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)))
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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();
|
||||
|
@ -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<ZeroSizeType>` does not allocate.
|
||||
|
@ -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(|| {
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user