use hir::def_id::{DefId, LOCAL_CRATE};
use rustc::{infer, traits};
use rustc::ty::{self, TyCtxt, LvaluePreference, Ty};
+use rustc::ty::subst::Subst;
+use syntax::abi;
use syntax::symbol::Symbol;
use syntax_pos::Span;
})
.next();
let callee_ty = autoderef.unambiguous_final_ty();
- autoderef.finalize(LvaluePreference::NoPreference, Some(callee_expr));
+ autoderef.finalize(LvaluePreference::NoPreference, &[callee_expr]);
let output = match result {
None => {
// If the callee is a bare function or a closure, then we're all set.
match self.structurally_resolved_type(callee_expr.span, adjusted_ty).sty {
ty::TyFnDef(..) | ty::TyFnPtr(_) => {
- self.write_autoderef_adjustment(callee_expr.id, autoderefs, adjusted_ty);
+ self.apply_autoderef_adjustment(callee_expr.id, autoderefs, adjusted_ty);
return Some(CallStep::Builtin);
}
// haven't yet decided on whether the closure is fn vs
// fnmut vs fnonce. If so, we have to defer further processing.
if self.closure_kind(def_id).is_none() {
- let closure_ty = self.closure_type(def_id, substs);
+ let closure_ty = self.closure_type(def_id).subst(self.tcx, substs.substs);
let fn_sig = self.replace_late_bound_regions_with_fresh_var(call_expr.span,
infer::FnCall,
- &closure_ty.sig)
+ &closure_ty)
.0;
self.record_deferred_call_resolution(def_id,
Box::new(CallResolution {
arg_exprs: &'gcx [hir::Expr],
expected: Expectation<'tcx>)
-> Ty<'tcx> {
- let error_fn_sig;
-
let (fn_sig, def_span) = match callee_ty.sty {
- ty::TyFnDef(def_id, .., &ty::BareFnTy {ref sig, ..}) => {
+ ty::TyFnDef(def_id, .., sig) => {
(sig, self.tcx.hir.span_if_local(def_id))
}
- ty::TyFnPtr(&ty::BareFnTy {ref sig, ..}) => (sig, None),
+ ty::TyFnPtr(sig) => (sig, None),
ref t => {
let mut unit_variant = None;
if let &ty::TyAdt(adt_def, ..) = t {
// This is the "default" function signature, used in case of error.
// In that case, we check each argument against "error" in order to
// set up all the node type bindings.
- error_fn_sig = ty::Binder(self.tcx.mk_fn_sig(
+ (ty::Binder(self.tcx.mk_fn_sig(
self.err_args(arg_exprs.len()).into_iter(),
self.tcx.types.err,
false,
- ));
-
- (&error_fn_sig, None)
+ hir::Unsafety::Normal,
+ abi::Abi::Rust
+ )), None)
}
};
// previously appeared within a `Binder<>` and hence would not
// have been normalized before.
let fn_sig =
- self.replace_late_bound_regions_with_fresh_var(call_expr.span, infer::FnCall, fn_sig)
+ self.replace_late_bound_regions_with_fresh_var(call_expr.span, infer::FnCall, &fn_sig)
.0;
let fn_sig = self.normalize_associated_types_in(call_expr.span, &fn_sig);
// Call the generic checker.
let expected_arg_tys =
- self.expected_types_for_fn_args(call_expr.span,
+ self.expected_inputs_for_expected_output(call_expr.span,
expected,
fn_sig.output(),
fn_sig.inputs());
// do know the types expected for each argument and the return
// type.
- let expected_arg_tys = self.expected_types_for_fn_args(call_expr.span,
+ let expected_arg_tys = self.expected_inputs_for_expected_output(call_expr.span,
expected,
fn_sig.output().clone(),
fn_sig.inputs());
// (This always bites me, should find a way to
// refactor it.)
let method_sig = fcx.tcx
- .no_late_bound_regions(method_callee.ty.fn_sig())
+ .no_late_bound_regions(&method_callee.ty.fn_sig())
.unwrap();
debug!("attempt_resolution: method_callee={:?}", method_callee);