diff --git a/clippy_lints/src/cyclomatic_complexity.rs b/clippy_lints/src/cyclomatic_complexity.rs index ed836af4403..a62b38dea32 100644 --- a/clippy_lints/src/cyclomatic_complexity.rs +++ b/clippy_lints/src/cyclomatic_complexity.rs @@ -136,9 +136,12 @@ impl<'a, 'tcx> Visitor<'tcx> for CCHelper<'a, 'tcx> { walk_expr(self, e); let ty = self.cx.tables.node_id_to_type(callee.id); match ty.sty { - ty::TyFnDef(_, _, ty) | - ty::TyFnPtr(ty) if ty.skip_binder().output().sty == ty::TyNever => { - self.divergence += 1; + ty::TyFnDef(..) | + ty::TyFnPtr(_) => { + let sig = ty.fn_sig(self.cx.tcx); + if sig.skip_binder().output().sty == ty::TyNever { + self.divergence += 1; + } }, _ => (), } diff --git a/clippy_lints/src/eta_reduction.rs b/clippy_lints/src/eta_reduction.rs index d2b07661d5b..04511667e23 100644 --- a/clippy_lints/src/eta_reduction.rs +++ b/clippy_lints/src/eta_reduction.rs @@ -64,10 +64,11 @@ fn check_closure(cx: &LateContext, expr: &Expr) { let fn_ty = cx.tables.expr_ty(caller); match fn_ty.sty { // Is it an unsafe function? They don't implement the closure traits - ty::TyFnDef(_, _, fn_ty) | - ty::TyFnPtr(fn_ty) => { - if fn_ty.skip_binder().unsafety == Unsafety::Unsafe || - fn_ty.skip_binder().output().sty == ty::TyNever { + ty::TyFnDef(..) | + ty::TyFnPtr(_) => { + let sig = fn_ty.fn_sig(cx.tcx); + if sig.skip_binder().unsafety == Unsafety::Unsafe || + sig.skip_binder().output().sty == ty::TyNever { return; } }, diff --git a/clippy_lints/src/eval_order_dependence.rs b/clippy_lints/src/eval_order_dependence.rs index 36cae6968d4..134a02997bf 100644 --- a/clippy_lints/src/eval_order_dependence.rs +++ b/clippy_lints/src/eval_order_dependence.rs @@ -126,10 +126,12 @@ impl<'a, 'tcx> Visitor<'tcx> for DivergenceVisitor<'a, 'tcx> { match e.node { ExprAgain(_) | ExprBreak(_, _) | ExprRet(_) => self.report_diverging_sub_expr(e), ExprCall(ref func, _) => { - match self.cx.tables.expr_ty(func).sty { - ty::TyFnDef(_, _, fn_ty) | - ty::TyFnPtr(fn_ty) => { - if let ty::TyNever = self.cx.tcx.erase_late_bound_regions(&fn_ty).output().sty { + let typ = self.cx.tables.expr_ty(func); + match typ.sty { + ty::TyFnDef(..) | + ty::TyFnPtr(_) => { + let sig = typ.fn_sig(self.cx.tcx); + if let ty::TyNever = self.cx.tcx.erase_late_bound_regions(&sig).output().sty { self.report_diverging_sub_expr(e); } }, diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 463358c99b4..79d47b1e7da 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -176,7 +176,7 @@ impl<'a, 'tcx> hir::intravisit::Visitor<'tcx> for DerefVisitor<'a, 'tcx> { hir::ExprCall(ref f, ref args) => { let ty = self.cx.tables.expr_ty(f); - if type_is_unsafe_function(ty) { + if type_is_unsafe_function(self.cx, ty) { for arg in args { self.check_arg(arg); } @@ -186,7 +186,7 @@ impl<'a, 'tcx> hir::intravisit::Visitor<'tcx> for DerefVisitor<'a, 'tcx> { let def_id = self.cx.tables.type_dependent_defs[&expr.id].def_id(); let base_type = self.cx.tcx.type_of(def_id); - if type_is_unsafe_function(base_type) { + if type_is_unsafe_function(self.cx, base_type) { for arg in args { self.check_arg(arg); } diff --git a/clippy_lints/src/len_zero.rs b/clippy_lints/src/len_zero.rs index 266e61d90b0..91db5bbdba6 100644 --- a/clippy_lints/src/len_zero.rs +++ b/clippy_lints/src/len_zero.rs @@ -94,8 +94,7 @@ fn check_trait_items(cx: &LateContext, item: &Item, trait_items: &[TraitItemRef] has_self && { let did = cx.tcx.hir.local_def_id(item.id.node_id); - let impl_ty = cx.tcx.type_of(did); - impl_ty.fn_sig().inputs().skip_binder().len() == 1 + cx.tcx.fn_sig(did).inputs().skip_binder().len() == 1 } } else { false @@ -121,8 +120,7 @@ fn check_impl_items(cx: &LateContext, item: &Item, impl_items: &[ImplItemRef]) { has_self && { let did = cx.tcx.hir.local_def_id(item.id.node_id); - let impl_ty = cx.tcx.type_of(did); - impl_ty.fn_sig().inputs().skip_binder().len() == 1 + cx.tcx.fn_sig(did).inputs().skip_binder().len() == 1 } } else { false @@ -184,7 +182,7 @@ fn has_is_empty(cx: &LateContext, expr: &Expr) -> bool { fn is_is_empty(cx: &LateContext, item: &ty::AssociatedItem) -> bool { if let ty::AssociatedKind::Method = item.kind { if item.name == "is_empty" { - let sig = cx.tcx.type_of(item.def_id).fn_sig(); + let sig = cx.tcx.fn_sig(item.def_id); let ty = sig.skip_binder(); ty.inputs().len() == 1 } else { diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 8ef9c1d35f9..ce81d810161 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -741,7 +741,7 @@ fn check_for_loop_arg(cx: &LateContext, pat: &Pat, arg: &Expr, expr: &Expr) { let substs = cx.tables.node_substs(arg.id); let method_type = cx.tcx.type_of(def_id).subst(cx.tcx, substs); - let fn_arg_tys = method_type.fn_sig().inputs(); + let fn_arg_tys = method_type.fn_sig(cx.tcx).inputs(); assert_eq!(fn_arg_tys.skip_binder().len(), 1); if fn_arg_tys.skip_binder()[0].is_region_ptr() { lint_iter_method(cx, args, arg, &method_name); diff --git a/clippy_lints/src/mut_reference.rs b/clippy_lints/src/mut_reference.rs index 034e49a016c..672acbee8ec 100644 --- a/clippy_lints/src/mut_reference.rs +++ b/clippy_lints/src/mut_reference.rs @@ -55,11 +55,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnnecessaryMutPassed { } } -fn check_arguments(cx: &LateContext, arguments: &[Expr], type_definition: Ty, name: &str) { +fn check_arguments<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, arguments: &[Expr], type_definition: Ty<'tcx>, name: &str) { match type_definition.sty { - ty::TyFnDef(_, _, fn_type) | - ty::TyFnPtr(fn_type) => { - let parameters = fn_type.skip_binder().inputs(); + ty::TyFnDef(..) | + ty::TyFnPtr(_) => { + let parameters = type_definition.fn_sig(cx.tcx).skip_binder().inputs(); for (argument, parameter) in arguments.iter().zip(parameters.iter()) { match parameter.sty { ty::TyRef(_, ty::TypeAndMut { mutbl: MutImmutable, .. }) | diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs index b8aacb3b418..286083d6849 100644 --- a/clippy_lints/src/needless_pass_by_value.rs +++ b/clippy_lints/src/needless_pass_by_value.rs @@ -95,7 +95,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessPassByValue { ctx }; - let fn_sig = cx.tcx.type_of(fn_def_id).fn_sig(); + let fn_sig = cx.tcx.fn_sig(fn_def_id); let fn_sig = cx.tcx.erase_late_bound_regions(&fn_sig); for ((input, &ty), arg) in decl.inputs.iter().zip(fn_sig.inputs()).zip(&body.arguments) { diff --git a/clippy_lints/src/ptr.rs b/clippy_lints/src/ptr.rs index c4cd1b4bab0..f7017dfc5c3 100644 --- a/clippy_lints/src/ptr.rs +++ b/clippy_lints/src/ptr.rs @@ -113,7 +113,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PointerPass { fn check_fn(cx: &LateContext, decl: &FnDecl, fn_id: NodeId) { let fn_def_id = cx.tcx.hir.local_def_id(fn_id); - let sig = cx.tcx.type_of(fn_def_id).fn_sig(); + let sig = cx.tcx.fn_sig(fn_def_id); let fn_ty = sig.skip_binder(); for (arg, ty) in decl.inputs.iter().zip(fn_ty.inputs()) { diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs index c2cbd4d4cd0..c1b3f1419af 100644 --- a/clippy_lints/src/utils/mod.rs +++ b/clippy_lints/src/utils/mod.rs @@ -764,7 +764,7 @@ pub fn camel_case_from(s: &str) -> usize { /// Convenience function to get the return type of a function pub fn return_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, fn_item: NodeId) -> Ty<'tcx> { let fn_def_id = cx.tcx.hir.local_def_id(fn_item); - let ret_ty = cx.tcx.type_of(fn_def_id).fn_sig().output(); + let ret_ty = cx.tcx.fn_sig(fn_def_id).output(); cx.tcx.erase_late_bound_regions(&ret_ty) } @@ -776,10 +776,10 @@ pub fn same_tys<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, a: Ty<'tcx>, b: Ty<'tcx>) } /// Return whether the given type is an `unsafe` function. -pub fn type_is_unsafe_function(ty: Ty) -> bool { +pub fn type_is_unsafe_function<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>) -> bool { match ty.sty { - ty::TyFnDef(_, _, f) | - ty::TyFnPtr(f) => f.unsafety() == Unsafety::Unsafe, + ty::TyFnDef(..) | + ty::TyFnPtr(_) => ty.fn_sig(cx.tcx).unsafety() == Unsafety::Unsafe, _ => false, } }