mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-15 01:55:03 +00:00
Auto merge of #6034 - rail-rain:fix_fp_in_indexing_slicing, r=flip1995
Treat refs to arrays the same as owned arrays in `indexing_slicing` and `out_of_bounds_indexing` Fixes #6021 ...and remove `walk_ptrs_ty` in favour of `peel_refs`, which came in 2019. --- changelog: Fix a false positive in `indexing_slicing` and `out_of_bounds_indexing` where references to arrays weren't treated as arrays.
This commit is contained in:
commit
5af88e3c2d
@ -1,6 +1,5 @@
|
|||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
contains_name, get_pat_name, match_type, paths, single_segment_path, snippet_with_applicability,
|
contains_name, get_pat_name, match_type, paths, single_segment_path, snippet_with_applicability, span_lint_and_sugg,
|
||||||
span_lint_and_sugg, walk_ptrs_ty,
|
|
||||||
};
|
};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::ast::UintTy;
|
use rustc_ast::ast::UintTy;
|
||||||
@ -53,7 +52,7 @@ impl<'tcx> LateLintPass<'tcx> for ByteCount {
|
|||||||
if let ExprKind::Binary(ref op, ref l, ref r) = body.value.kind;
|
if let ExprKind::Binary(ref op, ref l, ref r) = body.value.kind;
|
||||||
if op.node == BinOpKind::Eq;
|
if op.node == BinOpKind::Eq;
|
||||||
if match_type(cx,
|
if match_type(cx,
|
||||||
walk_ptrs_ty(cx.typeck_results().expr_ty(&filter_args[0])),
|
cx.typeck_results().expr_ty(&filter_args[0]).peel_refs(),
|
||||||
&paths::SLICE_ITER);
|
&paths::SLICE_ITER);
|
||||||
then {
|
then {
|
||||||
let needle = match get_path_name(l) {
|
let needle = match get_path_name(l) {
|
||||||
@ -63,7 +62,7 @@ impl<'tcx> LateLintPass<'tcx> for ByteCount {
|
|||||||
_ => { return; }
|
_ => { return; }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if ty::Uint(UintTy::U8) != *walk_ptrs_ty(cx.typeck_results().expr_ty(needle)).kind() {
|
if ty::Uint(UintTy::U8) != *cx.typeck_results().expr_ty(needle).peel_refs().kind() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let haystack = if let ExprKind::MethodCall(ref path, _, ref args, _) =
|
let haystack = if let ExprKind::MethodCall(ref path, _, ref args, _) =
|
||||||
|
@ -7,7 +7,7 @@ use rustc_span::source_map::Spanned;
|
|||||||
|
|
||||||
use crate::consts::{constant, Constant};
|
use crate::consts::{constant, Constant};
|
||||||
use crate::utils::paths;
|
use crate::utils::paths;
|
||||||
use crate::utils::{match_type, snippet_with_applicability, span_lint_and_sugg, walk_ptrs_ty};
|
use crate::utils::{match_type, snippet_with_applicability, span_lint_and_sugg};
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// **What it does:** Checks for calculation of subsecond microseconds or milliseconds
|
/// **What it does:** Checks for calculation of subsecond microseconds or milliseconds
|
||||||
@ -43,7 +43,7 @@ impl<'tcx> LateLintPass<'tcx> for DurationSubsec {
|
|||||||
if_chain! {
|
if_chain! {
|
||||||
if let ExprKind::Binary(Spanned { node: BinOpKind::Div, .. }, ref left, ref right) = expr.kind;
|
if let ExprKind::Binary(Spanned { node: BinOpKind::Div, .. }, ref left, ref right) = expr.kind;
|
||||||
if let ExprKind::MethodCall(ref method_path, _ , ref args, _) = left.kind;
|
if let ExprKind::MethodCall(ref method_path, _ , ref args, _) = left.kind;
|
||||||
if match_type(cx, walk_ptrs_ty(cx.typeck_results().expr_ty(&args[0])), &paths::DURATION);
|
if match_type(cx, cx.typeck_results().expr_ty(&args[0]).peel_refs(), &paths::DURATION);
|
||||||
if let Some((Constant::Int(divisor), _)) = constant(cx, cx.typeck_results(), right);
|
if let Some((Constant::Int(divisor), _)) = constant(cx, cx.typeck_results(), right);
|
||||||
then {
|
then {
|
||||||
let suggested_fn = match (method_path.ident.as_str().as_ref(), divisor) {
|
let suggested_fn = match (method_path.ident.as_str().as_ref(), divisor) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::utils::SpanlessEq;
|
use crate::utils::SpanlessEq;
|
||||||
use crate::utils::{get_item_name, higher, is_type_diagnostic_item, match_type, paths, snippet, snippet_opt};
|
use crate::utils::{get_item_name, higher, is_type_diagnostic_item, match_type, paths, snippet, snippet_opt};
|
||||||
use crate::utils::{snippet_with_applicability, span_lint_and_then, walk_ptrs_ty};
|
use crate::utils::{snippet_with_applicability, span_lint_and_then};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
|
use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
|
||||||
@ -106,7 +106,7 @@ fn check_cond<'a>(cx: &LateContext<'_>, check: &'a Expr<'a>) -> Option<(&'static
|
|||||||
if let ExprKind::AddrOf(BorrowKind::Ref, _, ref key) = params[1].kind;
|
if let ExprKind::AddrOf(BorrowKind::Ref, _, ref key) = params[1].kind;
|
||||||
then {
|
then {
|
||||||
let map = ¶ms[0];
|
let map = ¶ms[0];
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(map));
|
let obj_ty = cx.typeck_results().expr_ty(map).peel_refs();
|
||||||
|
|
||||||
return if match_type(cx, obj_ty, &paths::BTREEMAP) {
|
return if match_type(cx, obj_ty, &paths::BTREEMAP) {
|
||||||
Some(("BTreeMap", map, key))
|
Some(("BTreeMap", map, key))
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
use crate::utils::paths::{BEGIN_PANIC, BEGIN_PANIC_FMT, FROM_TRAIT};
|
use crate::utils::paths::{BEGIN_PANIC, BEGIN_PANIC_FMT, FROM_TRAIT};
|
||||||
use crate::utils::{
|
use crate::utils::{is_expn_of, is_type_diagnostic_item, match_def_path, method_chain_args, span_lint_and_then};
|
||||||
is_expn_of, is_type_diagnostic_item, match_def_path, method_chain_args, span_lint_and_then, walk_ptrs_ty,
|
|
||||||
};
|
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
@ -96,7 +94,7 @@ fn lint_impl_body<'tcx>(cx: &LateContext<'tcx>, impl_span: Span, impl_items: &[h
|
|||||||
|
|
||||||
// check for `unwrap`
|
// check for `unwrap`
|
||||||
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
|
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
|
||||||
let reciever_ty = walk_ptrs_ty(self.typeck_results.expr_ty(&arglists[0][0]));
|
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
|
||||||
if is_type_diagnostic_item(self.lcx, reciever_ty, sym!(option_type))
|
if is_type_diagnostic_item(self.lcx, reciever_ty, sym!(option_type))
|
||||||
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym!(result_type))
|
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym!(result_type))
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::utils::paths;
|
use crate::utils::paths;
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
is_expn_of, is_type_diagnostic_item, last_path_segment, match_def_path, match_function_call, snippet,
|
is_expn_of, is_type_diagnostic_item, last_path_segment, match_def_path, match_function_call, snippet,
|
||||||
span_lint_and_then, walk_ptrs_ty,
|
span_lint_and_then,
|
||||||
};
|
};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::ast::LitKind;
|
use rustc_ast::ast::LitKind;
|
||||||
@ -90,7 +90,7 @@ fn on_argumentv1_new<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, arms: &
|
|||||||
if let PatKind::Tuple(ref pats, None) = arms[0].pat.kind;
|
if let PatKind::Tuple(ref pats, None) = arms[0].pat.kind;
|
||||||
if pats.len() == 1;
|
if pats.len() == 1;
|
||||||
then {
|
then {
|
||||||
let ty = walk_ptrs_ty(cx.typeck_results().pat_ty(&pats[0]));
|
let ty = cx.typeck_results().pat_ty(&pats[0]).peel_refs();
|
||||||
if *ty.kind() != rustc_middle::ty::Str && !is_type_diagnostic_item(cx, ty, sym!(string_type)) {
|
if *ty.kind() != rustc_middle::ty::Str && !is_type_diagnostic_item(cx, ty, sym!(string_type)) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ declare_lint_pass!(IndexingSlicing => [INDEXING_SLICING, OUT_OF_BOUNDS_INDEXING]
|
|||||||
impl<'tcx> LateLintPass<'tcx> for IndexingSlicing {
|
impl<'tcx> LateLintPass<'tcx> for IndexingSlicing {
|
||||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
||||||
if let ExprKind::Index(ref array, ref index) = &expr.kind {
|
if let ExprKind::Index(ref array, ref index) = &expr.kind {
|
||||||
let ty = cx.typeck_results().expr_ty(array);
|
let ty = cx.typeck_results().expr_ty(array).peel_refs();
|
||||||
if let Some(range) = higher::range(index) {
|
if let Some(range) = higher::range(index) {
|
||||||
// Ranged indexes, i.e., &x[n..m], &x[n..], &x[..n] and &x[..]
|
// Ranged indexes, i.e., &x[n..m], &x[n..], &x[..n] and &x[..]
|
||||||
if let ty::Array(_, s) = ty.kind() {
|
if let ty::Array(_, s) = ty.kind() {
|
||||||
|
@ -5,7 +5,7 @@ use rustc_session::{declare_lint_pass, declare_tool_lint};
|
|||||||
|
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
get_trait_def_id, implements_trait, is_type_diagnostic_item, paths, return_ty, span_lint_and_help,
|
get_trait_def_id, implements_trait, is_type_diagnostic_item, paths, return_ty, span_lint_and_help,
|
||||||
trait_ref_of_method, walk_ptrs_ty,
|
trait_ref_of_method,
|
||||||
};
|
};
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
@ -125,7 +125,7 @@ fn show_lint(cx: &LateContext<'_>, item: &ImplItem<'_>) {
|
|||||||
// Get the real type of 'self'
|
// Get the real type of 'self'
|
||||||
let fn_def_id = cx.tcx.hir().local_def_id(item.hir_id);
|
let fn_def_id = cx.tcx.hir().local_def_id(item.hir_id);
|
||||||
let self_type = cx.tcx.fn_sig(fn_def_id).input(0);
|
let self_type = cx.tcx.fn_sig(fn_def_id).input(0);
|
||||||
let self_type = walk_ptrs_ty(self_type.skip_binder());
|
let self_type = self_type.skip_binder().peel_refs();
|
||||||
|
|
||||||
// Emit either a warning or an error
|
// Emit either a warning or an error
|
||||||
if implements_trait(cx, self_type, display_trait_id, &[]) {
|
if implements_trait(cx, self_type, display_trait_id, &[]) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::utils::{get_item_name, snippet_with_applicability, span_lint, span_lint_and_sugg, walk_ptrs_ty};
|
use crate::utils::{get_item_name, snippet_with_applicability, span_lint, span_lint_and_sugg};
|
||||||
use rustc_ast::ast::LitKind;
|
use rustc_ast::ast::LitKind;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -285,7 +285,7 @@ fn has_is_empty(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let ty = &walk_ptrs_ty(cx.typeck_results().expr_ty(expr));
|
let ty = &cx.typeck_results().expr_ty(expr).peel_refs();
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::Dynamic(ref tt, ..) => tt.principal().map_or(false, |principal| {
|
ty::Dynamic(ref tt, ..) => tt.principal().map_or(false, |principal| {
|
||||||
cx.tcx
|
cx.tcx
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
use crate::utils::walk_ptrs_ty;
|
|
||||||
use crate::utils::{is_type_diagnostic_item, is_type_lang_item, snippet, span_lint_and_sugg};
|
use crate::utils::{is_type_diagnostic_item, is_type_lang_item, snippet, span_lint_and_sugg};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -90,12 +89,12 @@ fn is_vec_indexing<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Opti
|
|||||||
|
|
||||||
fn is_vector(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
fn is_vector(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
let ty = cx.typeck_results().expr_ty(expr);
|
let ty = cx.typeck_results().expr_ty(expr);
|
||||||
let ty = walk_ptrs_ty(ty);
|
let ty = ty.peel_refs();
|
||||||
is_type_diagnostic_item(cx, ty, sym!(vec_type))
|
is_type_diagnostic_item(cx, ty, sym!(vec_type))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_full_range(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
fn is_full_range(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
let ty = cx.typeck_results().expr_ty(expr);
|
let ty = cx.typeck_results().expr_ty(expr);
|
||||||
let ty = walk_ptrs_ty(ty);
|
let ty = ty.peel_refs();
|
||||||
is_type_lang_item(cx, ty, LangItem::RangeFull)
|
is_type_lang_item(cx, ty, LangItem::RangeFull)
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ use crate::utils::{
|
|||||||
expr_block, get_arg_name, get_parent_expr, in_macro, indent_of, is_allowed, is_expn_of, is_refutable,
|
expr_block, get_arg_name, get_parent_expr, in_macro, indent_of, is_allowed, is_expn_of, is_refutable,
|
||||||
is_type_diagnostic_item, is_wild, match_qpath, match_type, match_var, multispan_sugg, remove_blocks, snippet,
|
is_type_diagnostic_item, is_wild, match_qpath, match_type, match_var, multispan_sugg, remove_blocks, snippet,
|
||||||
snippet_block, snippet_with_applicability, span_lint_and_help, span_lint_and_note, span_lint_and_sugg,
|
snippet_block, snippet_with_applicability, span_lint_and_help, span_lint_and_note, span_lint_and_sugg,
|
||||||
span_lint_and_then, walk_ptrs_ty,
|
span_lint_and_then,
|
||||||
};
|
};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::ast::LitKind;
|
use rustc_ast::ast::LitKind;
|
||||||
@ -794,7 +794,7 @@ fn check_overlapping_arms<'tcx>(cx: &LateContext<'tcx>, ex: &'tcx Expr<'_>, arms
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn check_wild_err_arm(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>]) {
|
fn check_wild_err_arm(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>]) {
|
||||||
let ex_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(ex));
|
let ex_ty = cx.typeck_results().expr_ty(ex).peel_refs();
|
||||||
if is_type_diagnostic_item(cx, ex_ty, sym!(result_type)) {
|
if is_type_diagnostic_item(cx, ex_ty, sym!(result_type)) {
|
||||||
for arm in arms {
|
for arm in arms {
|
||||||
if let PatKind::TupleStruct(ref path, ref inner, _) = arm.pat.kind {
|
if let PatKind::TupleStruct(ref path, ref inner, _) = arm.pat.kind {
|
||||||
|
@ -32,8 +32,8 @@ use crate::utils::{
|
|||||||
is_copy, is_expn_of, is_type_diagnostic_item, iter_input_pats, last_path_segment, match_def_path, match_qpath,
|
is_copy, is_expn_of, is_type_diagnostic_item, iter_input_pats, last_path_segment, match_def_path, match_qpath,
|
||||||
match_trait_method, match_type, match_var, method_calls, method_chain_args, paths, remove_blocks, return_ty,
|
match_trait_method, match_type, match_var, method_calls, method_chain_args, paths, remove_blocks, return_ty,
|
||||||
single_segment_path, snippet, snippet_with_applicability, snippet_with_macro_callsite, span_lint,
|
single_segment_path, snippet, snippet_with_applicability, snippet_with_macro_callsite, span_lint,
|
||||||
span_lint_and_help, span_lint_and_note, span_lint_and_sugg, span_lint_and_then, sugg, walk_ptrs_ty,
|
span_lint_and_help, span_lint_and_note, span_lint_and_sugg, span_lint_and_then, sugg, walk_ptrs_ty_depth,
|
||||||
walk_ptrs_ty_depth, SpanlessEq,
|
SpanlessEq,
|
||||||
};
|
};
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
@ -1774,7 +1774,7 @@ fn lint_or_fun_call<'tcx>(
|
|||||||
) {
|
) {
|
||||||
if let hir::ExprKind::MethodCall(ref path, _, ref args, _) = &arg.kind {
|
if let hir::ExprKind::MethodCall(ref path, _, ref args, _) = &arg.kind {
|
||||||
if path.ident.as_str() == "len" {
|
if path.ident.as_str() == "len" {
|
||||||
let ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&args[0]));
|
let ty = cx.typeck_results().expr_ty(&args[0]).peel_refs();
|
||||||
|
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::Slice(_) | ty::Array(_, _) => return,
|
ty::Slice(_) | ty::Array(_, _) => return,
|
||||||
@ -1881,7 +1881,7 @@ fn lint_expect_fun_call(
|
|||||||
&& (method_name.ident.name == sym!(as_str) || method_name.ident.name == sym!(as_ref))
|
&& (method_name.ident.name == sym!(as_str) || method_name.ident.name == sym!(as_ref))
|
||||||
&& {
|
&& {
|
||||||
let arg_type = cx.typeck_results().expr_ty(&call_args[0]);
|
let arg_type = cx.typeck_results().expr_ty(&call_args[0]);
|
||||||
let base_type = walk_ptrs_ty(arg_type);
|
let base_type = arg_type.peel_refs();
|
||||||
*base_type.kind() == ty::Str || is_type_diagnostic_item(cx, base_type, sym!(string_type))
|
*base_type.kind() == ty::Str || is_type_diagnostic_item(cx, base_type, sym!(string_type))
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -2142,7 +2142,7 @@ fn lint_clone_on_copy(cx: &LateContext<'_>, expr: &hir::Expr<'_>, arg: &hir::Exp
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn lint_clone_on_ref_ptr(cx: &LateContext<'_>, expr: &hir::Expr<'_>, arg: &hir::Expr<'_>) {
|
fn lint_clone_on_ref_ptr(cx: &LateContext<'_>, expr: &hir::Expr<'_>, arg: &hir::Expr<'_>) {
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(arg));
|
let obj_ty = cx.typeck_results().expr_ty(arg).peel_refs();
|
||||||
|
|
||||||
if let ty::Adt(_, subst) = obj_ty.kind() {
|
if let ty::Adt(_, subst) = obj_ty.kind() {
|
||||||
let caller_type = if is_type_diagnostic_item(cx, obj_ty, sym::Rc) {
|
let caller_type = if is_type_diagnostic_item(cx, obj_ty, sym::Rc) {
|
||||||
@ -2173,7 +2173,7 @@ fn lint_string_extend(cx: &LateContext<'_>, expr: &hir::Expr<'_>, args: &[hir::E
|
|||||||
let arg = &args[1];
|
let arg = &args[1];
|
||||||
if let Some(arglists) = method_chain_args(arg, &["chars"]) {
|
if let Some(arglists) = method_chain_args(arg, &["chars"]) {
|
||||||
let target = &arglists[0][0];
|
let target = &arglists[0][0];
|
||||||
let self_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(target));
|
let self_ty = cx.typeck_results().expr_ty(target).peel_refs();
|
||||||
let ref_str = if *self_ty.kind() == ty::Str {
|
let ref_str = if *self_ty.kind() == ty::Str {
|
||||||
""
|
""
|
||||||
} else if is_type_diagnostic_item(cx, self_ty, sym!(string_type)) {
|
} else if is_type_diagnostic_item(cx, self_ty, sym!(string_type)) {
|
||||||
@ -2201,7 +2201,7 @@ fn lint_string_extend(cx: &LateContext<'_>, expr: &hir::Expr<'_>, args: &[hir::E
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn lint_extend(cx: &LateContext<'_>, expr: &hir::Expr<'_>, args: &[hir::Expr<'_>]) {
|
fn lint_extend(cx: &LateContext<'_>, expr: &hir::Expr<'_>, args: &[hir::Expr<'_>]) {
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&args[0]));
|
let obj_ty = cx.typeck_results().expr_ty(&args[0]).peel_refs();
|
||||||
if is_type_diagnostic_item(cx, obj_ty, sym!(string_type)) {
|
if is_type_diagnostic_item(cx, obj_ty, sym!(string_type)) {
|
||||||
lint_string_extend(cx, expr, args);
|
lint_string_extend(cx, expr, args);
|
||||||
}
|
}
|
||||||
@ -2384,7 +2384,7 @@ fn lint_iter_next<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>, iter_
|
|||||||
}
|
}
|
||||||
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(caller_expr), sym!(vec_type))
|
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(caller_expr), sym!(vec_type))
|
||||||
|| matches!(
|
|| matches!(
|
||||||
&walk_ptrs_ty(cx.typeck_results().expr_ty(caller_expr)).kind(),
|
&cx.typeck_results().expr_ty(caller_expr).peel_refs().kind(),
|
||||||
ty::Array(_, _)
|
ty::Array(_, _)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -2587,7 +2587,7 @@ fn derefs_to_slice<'tcx>(
|
|||||||
|
|
||||||
/// lint use of `unwrap()` for `Option`s and `Result`s
|
/// lint use of `unwrap()` for `Option`s and `Result`s
|
||||||
fn lint_unwrap(cx: &LateContext<'_>, expr: &hir::Expr<'_>, unwrap_args: &[hir::Expr<'_>]) {
|
fn lint_unwrap(cx: &LateContext<'_>, expr: &hir::Expr<'_>, unwrap_args: &[hir::Expr<'_>]) {
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&unwrap_args[0]));
|
let obj_ty = cx.typeck_results().expr_ty(&unwrap_args[0]).peel_refs();
|
||||||
|
|
||||||
let mess = if is_type_diagnostic_item(cx, obj_ty, sym!(option_type)) {
|
let mess = if is_type_diagnostic_item(cx, obj_ty, sym!(option_type)) {
|
||||||
Some((UNWRAP_USED, "an Option", "None"))
|
Some((UNWRAP_USED, "an Option", "None"))
|
||||||
@ -2615,7 +2615,7 @@ fn lint_unwrap(cx: &LateContext<'_>, expr: &hir::Expr<'_>, unwrap_args: &[hir::E
|
|||||||
|
|
||||||
/// lint use of `expect()` for `Option`s and `Result`s
|
/// lint use of `expect()` for `Option`s and `Result`s
|
||||||
fn lint_expect(cx: &LateContext<'_>, expr: &hir::Expr<'_>, expect_args: &[hir::Expr<'_>]) {
|
fn lint_expect(cx: &LateContext<'_>, expr: &hir::Expr<'_>, expect_args: &[hir::Expr<'_>]) {
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&expect_args[0]));
|
let obj_ty = cx.typeck_results().expr_ty(&expect_args[0]).peel_refs();
|
||||||
|
|
||||||
let mess = if is_type_diagnostic_item(cx, obj_ty, sym!(option_type)) {
|
let mess = if is_type_diagnostic_item(cx, obj_ty, sym!(option_type)) {
|
||||||
Some((EXPECT_USED, "an Option", "None"))
|
Some((EXPECT_USED, "an Option", "None"))
|
||||||
@ -3134,7 +3134,7 @@ fn lint_chars_cmp(
|
|||||||
if segment.ident.name == sym!(Some);
|
if segment.ident.name == sym!(Some);
|
||||||
then {
|
then {
|
||||||
let mut applicability = Applicability::MachineApplicable;
|
let mut applicability = Applicability::MachineApplicable;
|
||||||
let self_ty = walk_ptrs_ty(cx.typeck_results().expr_ty_adjusted(&args[0][0]));
|
let self_ty = cx.typeck_results().expr_ty_adjusted(&args[0][0]).peel_refs();
|
||||||
|
|
||||||
if *self_ty.kind() != ty::Str {
|
if *self_ty.kind() != ty::Str {
|
||||||
return false;
|
return false;
|
||||||
|
@ -17,7 +17,7 @@ use crate::utils::sugg::Sugg;
|
|||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
get_item_name, get_parent_expr, higher, implements_trait, in_constant, is_integer_const, iter_input_pats,
|
get_item_name, get_parent_expr, higher, implements_trait, in_constant, is_integer_const, iter_input_pats,
|
||||||
last_path_segment, match_qpath, match_trait_method, paths, snippet, snippet_opt, span_lint, span_lint_and_sugg,
|
last_path_segment, match_qpath, match_trait_method, paths, snippet, snippet_opt, span_lint, span_lint_and_sugg,
|
||||||
span_lint_and_then, span_lint_hir_and_then, walk_ptrs_ty, SpanlessEq,
|
span_lint_and_then, span_lint_hir_and_then, SpanlessEq,
|
||||||
};
|
};
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
@ -561,7 +561,7 @@ fn is_signum(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn is_float(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
fn is_float(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
let value = &walk_ptrs_ty(cx.typeck_results().expr_ty(expr)).kind();
|
let value = &cx.typeck_results().expr_ty(expr).peel_refs().kind();
|
||||||
|
|
||||||
if let ty::Array(arr_ty, _) = value {
|
if let ty::Array(arr_ty, _) = value {
|
||||||
return matches!(arr_ty.kind(), ty::Float(_));
|
return matches!(arr_ty.kind(), ty::Float(_));
|
||||||
@ -571,7 +571,7 @@ fn is_float(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn is_array(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
fn is_array(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||||
matches!(&walk_ptrs_ty(cx.typeck_results().expr_ty(expr)).kind(), ty::Array(_, _))
|
matches!(&cx.typeck_results().expr_ty(expr).peel_refs().kind(), ty::Array(_, _))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left: bool) {
|
fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left: bool) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::utils::{match_def_path, paths, span_lint, trait_ref_of_method, walk_ptrs_ty};
|
use crate::utils::{match_def_path, paths, span_lint, trait_ref_of_method};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_middle::ty::{Adt, Array, RawPtr, Ref, Slice, Tuple, Ty, TypeAndMut};
|
use rustc_middle::ty::{Adt, Array, RawPtr, Ref, Slice, Tuple, Ty, TypeAndMut};
|
||||||
@ -98,7 +98,7 @@ fn check_sig<'tcx>(cx: &LateContext<'tcx>, item_hir_id: hir::HirId, decl: &hir::
|
|||||||
// We want to lint 1. sets or maps with 2. not immutable key types and 3. no unerased
|
// We want to lint 1. sets or maps with 2. not immutable key types and 3. no unerased
|
||||||
// generics (because the compiler cannot ensure immutability for unknown types).
|
// generics (because the compiler cannot ensure immutability for unknown types).
|
||||||
fn check_ty<'tcx>(cx: &LateContext<'tcx>, span: Span, ty: Ty<'tcx>) {
|
fn check_ty<'tcx>(cx: &LateContext<'tcx>, span: Span, ty: Ty<'tcx>) {
|
||||||
let ty = walk_ptrs_ty(ty);
|
let ty = ty.peel_refs();
|
||||||
if let Adt(def, substs) = ty.kind() {
|
if let Adt(def, substs) = ty.kind() {
|
||||||
if [&paths::HASHMAP, &paths::BTREEMAP, &paths::HASHSET, &paths::BTREESET]
|
if [&paths::HASHMAP, &paths::BTREEMAP, &paths::HASHSET, &paths::BTREESET]
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::utils::{match_type, paths, span_lint, walk_ptrs_ty};
|
use crate::utils::{match_type, paths, span_lint};
|
||||||
use rustc_ast::ast::LitKind;
|
use rustc_ast::ast::LitKind;
|
||||||
use rustc_hir::{Expr, ExprKind};
|
use rustc_hir::{Expr, ExprKind};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
@ -30,7 +30,7 @@ declare_lint_pass!(OpenOptions => [NONSENSICAL_OPEN_OPTIONS]);
|
|||||||
impl<'tcx> LateLintPass<'tcx> for OpenOptions {
|
impl<'tcx> LateLintPass<'tcx> for OpenOptions {
|
||||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
|
fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
|
||||||
if let ExprKind::MethodCall(ref path, _, ref arguments, _) = e.kind {
|
if let ExprKind::MethodCall(ref path, _, ref arguments, _) = e.kind {
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&arguments[0]));
|
let obj_ty = cx.typeck_results().expr_ty(&arguments[0]).peel_refs();
|
||||||
if path.ident.name == sym!(open) && match_type(cx, obj_ty, &paths::OPEN_OPTIONS) {
|
if path.ident.name == sym!(open) && match_type(cx, obj_ty, &paths::OPEN_OPTIONS) {
|
||||||
let mut options = Vec::new();
|
let mut options = Vec::new();
|
||||||
get_open_options(cx, &arguments[0], &mut options);
|
get_open_options(cx, &arguments[0], &mut options);
|
||||||
@ -58,7 +58,7 @@ enum OpenOption {
|
|||||||
|
|
||||||
fn get_open_options(cx: &LateContext<'_>, argument: &Expr<'_>, options: &mut Vec<(OpenOption, Argument)>) {
|
fn get_open_options(cx: &LateContext<'_>, argument: &Expr<'_>, options: &mut Vec<(OpenOption, Argument)>) {
|
||||||
if let ExprKind::MethodCall(ref path, _, ref arguments, _) = argument.kind {
|
if let ExprKind::MethodCall(ref path, _, ref arguments, _) = argument.kind {
|
||||||
let obj_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&arguments[0]));
|
let obj_ty = cx.typeck_results().expr_ty(&arguments[0]).peel_refs();
|
||||||
|
|
||||||
// Only proceed if this is a call on some object of type std::fs::OpenOptions
|
// Only proceed if this is a call on some object of type std::fs::OpenOptions
|
||||||
if match_type(cx, obj_ty, &paths::OPEN_OPTIONS) && arguments.len() >= 2 {
|
if match_type(cx, obj_ty, &paths::OPEN_OPTIONS) && arguments.len() >= 2 {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::utils::{match_type, paths, span_lint_and_sugg, walk_ptrs_ty};
|
use crate::utils::{match_type, paths, span_lint_and_sugg};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::ast::LitKind;
|
use rustc_ast::ast::LitKind;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -46,7 +46,7 @@ impl<'tcx> LateLintPass<'tcx> for PathBufPushOverwrite {
|
|||||||
if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind;
|
if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind;
|
||||||
if path.ident.name == sym!(push);
|
if path.ident.name == sym!(push);
|
||||||
if args.len() == 2;
|
if args.len() == 2;
|
||||||
if match_type(cx, walk_ptrs_ty(cx.typeck_results().expr_ty(&args[0])), &paths::PATH_BUF);
|
if match_type(cx, cx.typeck_results().expr_ty(&args[0]).peel_refs(), &paths::PATH_BUF);
|
||||||
if let Some(get_index_arg) = args.get(1);
|
if let Some(get_index_arg) = args.get(1);
|
||||||
if let ExprKind::Lit(ref lit) = get_index_arg.kind;
|
if let ExprKind::Lit(ref lit) = get_index_arg.kind;
|
||||||
if let LitKind::Str(ref path_lit, _) = lit.node;
|
if let LitKind::Str(ref path_lit, _) = lit.node;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::consts::{constant_context, Constant};
|
use crate::consts::{constant_context, Constant};
|
||||||
use crate::utils::{in_macro, is_type_diagnostic_item, snippet, span_lint_and_sugg, walk_ptrs_ty};
|
use crate::utils::{in_macro, is_type_diagnostic_item, snippet, span_lint_and_sugg};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::{Expr, ExprKind};
|
use rustc_hir::{Expr, ExprKind};
|
||||||
@ -44,7 +44,7 @@ impl<'tcx> LateLintPass<'tcx> for RepeatOnce {
|
|||||||
if let Some(Constant::Int(1)) = constant_context(cx, cx.typeck_results()).expr(&count);
|
if let Some(Constant::Int(1)) = constant_context(cx, cx.typeck_results()).expr(&count);
|
||||||
if !in_macro(receiver.span);
|
if !in_macro(receiver.span);
|
||||||
then {
|
then {
|
||||||
let ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&receiver));
|
let ty = cx.typeck_results().expr_ty(&receiver).peel_refs();
|
||||||
if ty.is_str() {
|
if ty.is_str() {
|
||||||
span_lint_and_sugg(
|
span_lint_and_sugg(
|
||||||
cx,
|
cx,
|
||||||
|
@ -8,7 +8,7 @@ use rustc_span::source_map::Spanned;
|
|||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
|
|
||||||
use crate::utils::SpanlessEq;
|
use crate::utils::SpanlessEq;
|
||||||
use crate::utils::{get_parent_expr, is_allowed, is_type_diagnostic_item, span_lint, span_lint_and_sugg, walk_ptrs_ty};
|
use crate::utils::{get_parent_expr, is_allowed, is_type_diagnostic_item, span_lint, span_lint_and_sugg};
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// **What it does:** Checks for string appends of the form `x = x + y` (without
|
/// **What it does:** Checks for string appends of the form `x = x + y` (without
|
||||||
@ -134,7 +134,7 @@ impl<'tcx> LateLintPass<'tcx> for StringAdd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn is_string(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
|
fn is_string(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
|
||||||
is_type_diagnostic_item(cx, walk_ptrs_ty(cx.typeck_results().expr_ty(e)), sym!(string_type))
|
is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(e).peel_refs(), sym!(string_type))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_add(cx: &LateContext<'_>, src: &Expr<'_>, target: &Expr<'_>) -> bool {
|
fn is_add(cx: &LateContext<'_>, src: &Expr<'_>, target: &Expr<'_>) -> bool {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
use crate::utils::sugg::Sugg;
|
use crate::utils::sugg::Sugg;
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
differing_macro_contexts, eq_expr_value, is_type_diagnostic_item, snippet_with_applicability, span_lint_and_then,
|
differing_macro_contexts, eq_expr_value, is_type_diagnostic_item, snippet_with_applicability, span_lint_and_then,
|
||||||
walk_ptrs_ty,
|
|
||||||
};
|
};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -194,7 +193,7 @@ fn check_for_slice<'a>(cx: &LateContext<'_>, lhs1: &'a Expr<'_>, lhs2: &'a Expr<
|
|||||||
if let ExprKind::Index(ref lhs1, ref idx1) = lhs1.kind {
|
if let ExprKind::Index(ref lhs1, ref idx1) = lhs1.kind {
|
||||||
if let ExprKind::Index(ref lhs2, ref idx2) = lhs2.kind {
|
if let ExprKind::Index(ref lhs2, ref idx2) = lhs2.kind {
|
||||||
if eq_expr_value(cx, lhs1, lhs2) {
|
if eq_expr_value(cx, lhs1, lhs2) {
|
||||||
let ty = walk_ptrs_ty(cx.typeck_results().expr_ty(lhs1));
|
let ty = cx.typeck_results().expr_ty(lhs1).peel_refs();
|
||||||
|
|
||||||
if matches!(ty.kind(), ty::Slice(_))
|
if matches!(ty.kind(), ty::Slice(_))
|
||||||
|| matches!(ty.kind(), ty::Array(_, _))
|
|| matches!(ty.kind(), ty::Array(_, _))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::utils::{is_type_diagnostic_item, method_chain_args, return_ty, span_lint_and_then, walk_ptrs_ty};
|
use crate::utils::{is_type_diagnostic_item, method_chain_args, return_ty, span_lint_and_then};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
@ -81,7 +81,7 @@ impl<'a, 'tcx> Visitor<'tcx> for FindExpectUnwrap<'a, 'tcx> {
|
|||||||
fn visit_expr(&mut self, expr: &'tcx Expr<'_>) {
|
fn visit_expr(&mut self, expr: &'tcx Expr<'_>) {
|
||||||
// check for `expect`
|
// check for `expect`
|
||||||
if let Some(arglists) = method_chain_args(expr, &["expect"]) {
|
if let Some(arglists) = method_chain_args(expr, &["expect"]) {
|
||||||
let reciever_ty = walk_ptrs_ty(self.typeck_results.expr_ty(&arglists[0][0]));
|
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
|
||||||
if is_type_diagnostic_item(self.lcx, reciever_ty, sym!(option_type))
|
if is_type_diagnostic_item(self.lcx, reciever_ty, sym!(option_type))
|
||||||
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym!(result_type))
|
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym!(result_type))
|
||||||
{
|
{
|
||||||
@ -91,7 +91,7 @@ impl<'a, 'tcx> Visitor<'tcx> for FindExpectUnwrap<'a, 'tcx> {
|
|||||||
|
|
||||||
// check for `unwrap`
|
// check for `unwrap`
|
||||||
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
|
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
|
||||||
let reciever_ty = walk_ptrs_ty(self.typeck_results.expr_ty(&arglists[0][0]));
|
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
|
||||||
if is_type_diagnostic_item(self.lcx, reciever_ty, sym!(option_type))
|
if is_type_diagnostic_item(self.lcx, reciever_ty, sym!(option_type))
|
||||||
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym!(result_type))
|
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym!(result_type))
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
is_expn_of, match_def_path, match_qpath, match_type, method_calls, path_to_res, paths, qpath_res, run_lints,
|
is_expn_of, match_def_path, match_qpath, match_type, method_calls, path_to_res, paths, qpath_res, run_lints,
|
||||||
snippet, span_lint, span_lint_and_help, span_lint_and_sugg, walk_ptrs_ty, SpanlessEq,
|
snippet, span_lint, span_lint_and_help, span_lint_and_sugg, SpanlessEq,
|
||||||
};
|
};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::ast::{Crate as AstCrate, ItemKind, LitKind, NodeId};
|
use rustc_ast::ast::{Crate as AstCrate, ItemKind, LitKind, NodeId};
|
||||||
@ -427,7 +427,7 @@ impl<'tcx> LateLintPass<'tcx> for CompilerLintFunctions {
|
|||||||
if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind;
|
if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind;
|
||||||
let fn_name = path.ident;
|
let fn_name = path.ident;
|
||||||
if let Some(sugg) = self.map.get(&*fn_name.as_str());
|
if let Some(sugg) = self.map.get(&*fn_name.as_str());
|
||||||
let ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&args[0]));
|
let ty = cx.typeck_results().expr_ty(&args[0]).peel_refs();
|
||||||
if match_type(cx, ty, &paths::EARLY_CONTEXT)
|
if match_type(cx, ty, &paths::EARLY_CONTEXT)
|
||||||
|| match_type(cx, ty, &paths::LATE_CONTEXT);
|
|| match_type(cx, ty, &paths::LATE_CONTEXT);
|
||||||
then {
|
then {
|
||||||
@ -460,7 +460,7 @@ impl<'tcx> LateLintPass<'tcx> for OuterExpnDataPass {
|
|||||||
let args = arg_lists[1];
|
let args = arg_lists[1];
|
||||||
if args.len() == 1;
|
if args.len() == 1;
|
||||||
let self_arg = &args[0];
|
let self_arg = &args[0];
|
||||||
let self_ty = walk_ptrs_ty(cx.typeck_results().expr_ty(self_arg));
|
let self_ty = cx.typeck_results().expr_ty(self_arg).peel_refs();
|
||||||
if match_type(cx, self_ty, &paths::SYNTAX_CONTEXT);
|
if match_type(cx, self_ty, &paths::SYNTAX_CONTEXT);
|
||||||
then {
|
then {
|
||||||
span_lint_and_sugg(
|
span_lint_and_sugg(
|
||||||
|
@ -754,14 +754,6 @@ pub fn walk_ptrs_hir_ty<'tcx>(ty: &'tcx hir::Ty<'tcx>) -> &'tcx hir::Ty<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the base type for references and raw pointers.
|
|
||||||
pub fn walk_ptrs_ty(ty: Ty<'_>) -> Ty<'_> {
|
|
||||||
match ty.kind() {
|
|
||||||
ty::Ref(_, ty, _) => walk_ptrs_ty(ty),
|
|
||||||
_ => ty,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the base type for references and raw pointers, and count reference
|
/// Returns the base type for references and raw pointers, and count reference
|
||||||
/// depth.
|
/// depth.
|
||||||
pub fn walk_ptrs_ty_depth(ty: Ty<'_>) -> (Ty<'_>, usize) {
|
pub fn walk_ptrs_ty_depth(ty: Ty<'_>) -> (Ty<'_>, usize) {
|
||||||
|
@ -15,7 +15,8 @@ fn main() {
|
|||||||
x[3]; // Ok, should not produce stderr.
|
x[3]; // Ok, should not produce stderr.
|
||||||
|
|
||||||
let y = &x;
|
let y = &x;
|
||||||
y[0];
|
y[0]; // Ok, referencing shouldn't affect this lint. See the issue 6021
|
||||||
|
y[4]; // Ok, rustc will handle references too.
|
||||||
|
|
||||||
let v = vec![0; 5];
|
let v = vec![0; 5];
|
||||||
v[0];
|
v[0];
|
||||||
|
@ -8,15 +8,7 @@ LL | x[index];
|
|||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
||||||
|
|
||||||
error: indexing may panic.
|
error: indexing may panic.
|
||||||
--> $DIR/indexing_slicing_index.rs:18:5
|
--> $DIR/indexing_slicing_index.rs:22:5
|
||||||
|
|
|
||||||
LL | y[0];
|
|
||||||
| ^^^^
|
|
||||||
|
|
|
||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
|
||||||
|
|
||||||
error: indexing may panic.
|
|
||||||
--> $DIR/indexing_slicing_index.rs:21:5
|
|
||||||
|
|
|
|
||||||
LL | v[0];
|
LL | v[0];
|
||||||
| ^^^^
|
| ^^^^
|
||||||
@ -24,7 +16,7 @@ LL | v[0];
|
|||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
||||||
|
|
||||||
error: indexing may panic.
|
error: indexing may panic.
|
||||||
--> $DIR/indexing_slicing_index.rs:22:5
|
--> $DIR/indexing_slicing_index.rs:23:5
|
||||||
|
|
|
|
||||||
LL | v[10];
|
LL | v[10];
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
@ -32,7 +24,7 @@ LL | v[10];
|
|||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
||||||
|
|
||||||
error: indexing may panic.
|
error: indexing may panic.
|
||||||
--> $DIR/indexing_slicing_index.rs:23:5
|
--> $DIR/indexing_slicing_index.rs:24:5
|
||||||
|
|
|
|
||||||
LL | v[1 << 3];
|
LL | v[1 << 3];
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
@ -40,7 +32,7 @@ LL | v[1 << 3];
|
|||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
||||||
|
|
||||||
error: indexing may panic.
|
error: indexing may panic.
|
||||||
--> $DIR/indexing_slicing_index.rs:29:5
|
--> $DIR/indexing_slicing_index.rs:30:5
|
||||||
|
|
|
|
||||||
LL | v[N];
|
LL | v[N];
|
||||||
| ^^^^
|
| ^^^^
|
||||||
@ -48,12 +40,12 @@ LL | v[N];
|
|||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
||||||
|
|
||||||
error: indexing may panic.
|
error: indexing may panic.
|
||||||
--> $DIR/indexing_slicing_index.rs:30:5
|
--> $DIR/indexing_slicing_index.rs:31:5
|
||||||
|
|
|
|
||||||
LL | v[M];
|
LL | v[M];
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
= help: Consider using `.get(n)` or `.get_mut(n)` instead
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
@ -71,29 +71,17 @@ LL | &x[1..][..5];
|
|||||||
|
|
|
|
||||||
= help: Consider using `.get(..n)`or `.get_mut(..n)` instead
|
= help: Consider using `.get(..n)`or `.get_mut(..n)` instead
|
||||||
|
|
||||||
error: slicing may panic.
|
error: range is out of bounds
|
||||||
--> $DIR/indexing_slicing_slice.rs:24:6
|
--> $DIR/indexing_slicing_slice.rs:25:12
|
||||||
|
|
|
||||||
LL | &y[1..2];
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= help: Consider using `.get(n..m)` or `.get_mut(n..m)` instead
|
|
||||||
|
|
||||||
error: slicing may panic.
|
|
||||||
--> $DIR/indexing_slicing_slice.rs:25:6
|
|
||||||
|
|
|
|
||||||
LL | &y[0..=4];
|
LL | &y[0..=4];
|
||||||
| ^^^^^^^^
|
| ^
|
||||||
|
|
|
||||||
= help: Consider using `.get(n..m)` or `.get_mut(n..m)` instead
|
|
||||||
|
|
||||||
error: slicing may panic.
|
error: range is out of bounds
|
||||||
--> $DIR/indexing_slicing_slice.rs:26:6
|
--> $DIR/indexing_slicing_slice.rs:26:11
|
||||||
|
|
|
|
||||||
LL | &y[..=4];
|
LL | &y[..=4];
|
||||||
| ^^^^^^^
|
| ^
|
||||||
|
|
|
||||||
= help: Consider using `.get(..n)`or `.get_mut(..n)` instead
|
|
||||||
|
|
||||||
error: slicing may panic.
|
error: slicing may panic.
|
||||||
--> $DIR/indexing_slicing_slice.rs:31:6
|
--> $DIR/indexing_slicing_slice.rs:31:6
|
||||||
@ -133,5 +121,5 @@ LL | &v[..100];
|
|||||||
|
|
|
|
||||||
= help: Consider using `.get(..n)`or `.get_mut(..n)` instead
|
= help: Consider using `.get(..n)`or `.get_mut(..n)` instead
|
||||||
|
|
||||||
error: aborting due to 17 previous errors
|
error: aborting due to 16 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user