parent
1661947014
commit
b8dad48435
15 changed files with 93 additions and 50 deletions
|
|
@ -15,10 +15,10 @@ use middle::pat_util::{PatIdMap, pat_id_map, pat_is_binding};
|
|||
use middle::pat_util::pat_is_resolved_const;
|
||||
use middle::privacy::{AllPublic, LastMod};
|
||||
use middle::subst::Substs;
|
||||
use middle::ty::{self, Ty, HasTypeFlags};
|
||||
use middle::ty::{self, Ty, HasTypeFlags, LvaluePreference};
|
||||
use check::{check_expr, check_expr_has_type, check_expr_with_expectation};
|
||||
use check::{check_expr_coercable_to_type, demand, FnCtxt, Expectation};
|
||||
use check::{check_expr_with_lvalue_pref, LvaluePreference};
|
||||
use check::{check_expr_with_lvalue_pref};
|
||||
use check::{instantiate_path, resolve_ty_and_def_ufcs, structurally_resolved_type};
|
||||
use require_same_types;
|
||||
use util::nodemap::FnvHashMap;
|
||||
|
|
@ -292,7 +292,7 @@ pub fn check_pat<'a, 'tcx>(pcx: &pat_ctxt<'a, 'tcx>,
|
|||
let region = fcx.infcx().next_region_var(infer::PatternRegion(pat.span));
|
||||
tcx.mk_ref(tcx.mk_region(region), ty::TypeAndMut {
|
||||
ty: tcx.mk_slice(inner_ty),
|
||||
mutbl: expected_ty.builtin_deref(true).map(|mt| mt.mutbl)
|
||||
mutbl: expected_ty.builtin_deref(true, ty::NoPreference).map(|mt| mt.mutbl)
|
||||
.unwrap_or(hir::MutImmutable)
|
||||
})
|
||||
}
|
||||
|
|
@ -310,7 +310,7 @@ pub fn check_pat<'a, 'tcx>(pcx: &pat_ctxt<'a, 'tcx>,
|
|||
}
|
||||
if let Some(ref slice) = *slice {
|
||||
let region = fcx.infcx().next_region_var(infer::PatternRegion(pat.span));
|
||||
let mutbl = expected_ty.builtin_deref(true)
|
||||
let mutbl = expected_ty.builtin_deref(true, ty::NoPreference)
|
||||
.map_or(hir::MutImmutable, |mt| mt.mutbl);
|
||||
|
||||
let slice_ty = tcx.mk_ref(tcx.mk_region(region), ty::TypeAndMut {
|
||||
|
|
@ -399,7 +399,7 @@ pub fn check_dereferencable<'a, 'tcx>(pcx: &pat_ctxt<'a, 'tcx>,
|
|||
let tcx = pcx.fcx.ccx.tcx;
|
||||
if pat_is_binding(&tcx.def_map, inner) {
|
||||
let expected = fcx.infcx().shallow_resolve(expected);
|
||||
expected.builtin_deref(true).map_or(true, |mt| match mt.ty.sty {
|
||||
expected.builtin_deref(true, ty::NoPreference).map_or(true, |mt| match mt.ty.sty {
|
||||
ty::TyTrait(_) => {
|
||||
// This is "x = SomeTrait" being reduced from
|
||||
// "let &x = &SomeTrait" or "let box x = Box<SomeTrait>", an error.
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ use super::err_args;
|
|||
use super::Expectation;
|
||||
use super::expected_types_for_fn_args;
|
||||
use super::FnCtxt;
|
||||
use super::LvaluePreference;
|
||||
use super::method;
|
||||
use super::structurally_resolved_type;
|
||||
use super::TupleArgumentsFlag;
|
||||
|
|
@ -28,7 +27,7 @@ use super::write_call;
|
|||
use CrateCtxt;
|
||||
use middle::def_id::{DefId, LOCAL_CRATE};
|
||||
use middle::infer;
|
||||
use middle::ty::{self, Ty};
|
||||
use middle::ty::{self, LvaluePreference, Ty};
|
||||
use syntax::codemap::Span;
|
||||
use syntax::parse::token;
|
||||
use syntax::ptr::P;
|
||||
|
|
|
|||
|
|
@ -60,13 +60,13 @@
|
|||
//! sort of a minor point so I've opted to leave it for later---after all
|
||||
//! we may want to adjust precisely when coercions occur.
|
||||
|
||||
use check::{autoderef, FnCtxt, LvaluePreference, UnresolvedTypeAction};
|
||||
use check::{autoderef, FnCtxt, UnresolvedTypeAction};
|
||||
|
||||
use middle::infer::{self, Coercion};
|
||||
use middle::traits::{self, ObligationCause};
|
||||
use middle::traits::{predicate_for_trait_def, report_selection_error};
|
||||
use middle::ty::{AutoDerefRef, AdjustDerefRef};
|
||||
use middle::ty::{self, TypeAndMut, Ty, TypeError};
|
||||
use middle::ty::{self, LvaluePreference, TypeAndMut, Ty, TypeError};
|
||||
use middle::ty_relate::RelateResult;
|
||||
use util::common::indent;
|
||||
|
||||
|
|
|
|||
|
|
@ -10,12 +10,12 @@
|
|||
|
||||
use super::probe;
|
||||
|
||||
use check::{self, FnCtxt, NoPreference, PreferMutLvalue, callee, demand};
|
||||
use check::{self, FnCtxt, callee, demand};
|
||||
use check::UnresolvedTypeAction;
|
||||
use middle::def_id::DefId;
|
||||
use middle::subst::{self};
|
||||
use middle::traits;
|
||||
use middle::ty::{self, Ty};
|
||||
use middle::ty::{self, NoPreference, PreferMutLvalue, Ty};
|
||||
use middle::ty_fold::TypeFoldable;
|
||||
use middle::infer;
|
||||
use middle::infer::InferCtxt;
|
||||
|
|
@ -534,7 +534,7 @@ impl<'a,'tcx> ConfirmContext<'a,'tcx> {
|
|||
}
|
||||
Some(ty::AutoPtr(_, _)) => {
|
||||
(adr.autoderefs, adr.unsize.map(|target| {
|
||||
target.builtin_deref(false)
|
||||
target.builtin_deref(false, NoPreference)
|
||||
.expect("fixup: AutoPtr is not &T").ty
|
||||
}))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,13 +14,13 @@ use super::{CandidateSource, ImplSource, TraitSource};
|
|||
use super::suggest;
|
||||
|
||||
use check;
|
||||
use check::{FnCtxt, NoPreference, UnresolvedTypeAction};
|
||||
use check::{FnCtxt, UnresolvedTypeAction};
|
||||
use middle::def_id::DefId;
|
||||
use middle::fast_reject;
|
||||
use middle::subst;
|
||||
use middle::subst::Subst;
|
||||
use middle::traits;
|
||||
use middle::ty::{self, RegionEscape, Ty, ToPolyTraitRef, TraitRef};
|
||||
use middle::ty::{self, NoPreference, RegionEscape, Ty, ToPolyTraitRef, TraitRef};
|
||||
use middle::ty::HasTypeFlags;
|
||||
use middle::ty_fold::TypeFoldable;
|
||||
use middle::infer;
|
||||
|
|
|
|||
|
|
@ -324,7 +324,7 @@ fn type_derefs_to_local<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
|||
}
|
||||
|
||||
check::autoderef(fcx, span, rcvr_ty, None,
|
||||
check::UnresolvedTypeAction::Ignore, check::NoPreference,
|
||||
check::UnresolvedTypeAction::Ignore, ty::NoPreference,
|
||||
|ty, _| {
|
||||
if is_local(ty) {
|
||||
Some(())
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@ type parameter).
|
|||
|
||||
*/
|
||||
|
||||
pub use self::LvaluePreference::*;
|
||||
pub use self::Expectation::*;
|
||||
pub use self::compare_method::{compare_impl_method, compare_const_impl};
|
||||
use self::TupleArgumentsFlag::*;
|
||||
|
|
@ -95,6 +94,7 @@ use middle::subst::{self, Subst, Substs, VecPerParamSpace, ParamSpace, TypeSpace
|
|||
use middle::traits::{self, report_fulfillment_errors};
|
||||
use middle::ty::{FnSig, GenericPredicates, TypeScheme};
|
||||
use middle::ty::{Disr, ParamTy, ParameterEnvironment};
|
||||
use middle::ty::{LvaluePreference, NoPreference, PreferMutLvalue};
|
||||
use middle::ty::{self, HasTypeFlags, RegionEscape, ToPolyTraitRef, Ty};
|
||||
use middle::ty::{MethodCall, MethodCallee};
|
||||
use middle::ty_fold::{TypeFolder, TypeFoldable};
|
||||
|
|
@ -2086,21 +2086,6 @@ impl<'a, 'tcx> RegionScope for FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub enum LvaluePreference {
|
||||
PreferMutLvalue,
|
||||
NoPreference
|
||||
}
|
||||
|
||||
impl LvaluePreference {
|
||||
pub fn from_mutbl(m: hir::Mutability) -> Self {
|
||||
match m {
|
||||
hir::MutMutable => PreferMutLvalue,
|
||||
hir::MutImmutable => NoPreference,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether `autoderef` requires types to resolve.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub enum UnresolvedTypeAction {
|
||||
|
|
@ -2156,7 +2141,7 @@ pub fn autoderef<'a, 'tcx, T, F>(fcx: &FnCtxt<'a, 'tcx>,
|
|||
}
|
||||
|
||||
// Otherwise, deref if type is derefable:
|
||||
let mt = match resolved_t.builtin_deref(false) {
|
||||
let mt = match resolved_t.builtin_deref(false, lvalue_pref) {
|
||||
Some(mt) => Some(mt),
|
||||
None => {
|
||||
let method_call =
|
||||
|
|
@ -2245,7 +2230,7 @@ fn make_overloaded_lvalue_return_type<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
|||
}
|
||||
|
||||
// method returns &T, but the type as visible to user is T, so deref
|
||||
ret_ty.builtin_deref(true)
|
||||
ret_ty.builtin_deref(true, NoPreference)
|
||||
}
|
||||
None => None,
|
||||
}
|
||||
|
|
@ -3293,7 +3278,7 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
|
|||
}
|
||||
hir::UnDeref => {
|
||||
oprnd_t = structurally_resolved_type(fcx, expr.span, oprnd_t);
|
||||
oprnd_t = match oprnd_t.builtin_deref(true) {
|
||||
oprnd_t = match oprnd_t.builtin_deref(true, NoPreference) {
|
||||
Some(mt) => mt.ty,
|
||||
None => match try_overloaded_deref(fcx, expr.span,
|
||||
Some(MethodCall::expr(expr.id)),
|
||||
|
|
|
|||
|
|
@ -17,12 +17,11 @@ use super::{
|
|||
demand,
|
||||
method,
|
||||
FnCtxt,
|
||||
PreferMutLvalue,
|
||||
structurally_resolved_type,
|
||||
};
|
||||
use middle::def_id::DefId;
|
||||
use middle::traits;
|
||||
use middle::ty::{Ty, HasTypeFlags};
|
||||
use middle::ty::{Ty, HasTypeFlags, PreferMutLvalue};
|
||||
use syntax::ast;
|
||||
use syntax::parse::token;
|
||||
use rustc_front::hir;
|
||||
|
|
|
|||
|
|
@ -1031,7 +1031,7 @@ fn constrain_autoderefs<'a, 'tcx>(rcx: &mut Rcx<'a, 'tcx>,
|
|||
r_deref_expr, *r_ptr);
|
||||
}
|
||||
|
||||
match derefd_ty.builtin_deref(true) {
|
||||
match derefd_ty.builtin_deref(true, ty::NoPreference) {
|
||||
Some(mt) => derefd_ty = mt.ty,
|
||||
/* if this type can't be dereferenced, then there's already an error
|
||||
in the session saying so. Just bail out for now */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue