mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-27 23:20:39 +00:00
Auto merge of #10679 - y21:better-const-ctx-check, r=Jarcho
use `is_inside_const_context` for `in_constant` util fn Fixes #10452. This PR improves the `in_constant` util function to detect more cases of const contexts. Previously this function would not detect cases like expressions in array length position or expression in an inline const block `const { .. }`. changelog: [`bool_to_int_with_if`]: recognize array length operand as being in a const context and don't suggest `usize::from` there
This commit is contained in:
commit
496c11005c
4 changed files with 21 additions and 31 deletions
|
@ -86,10 +86,10 @@ use rustc_hir::hir_id::{HirIdMap, HirIdSet};
|
||||||
use rustc_hir::intravisit::{walk_expr, FnKind, Visitor};
|
use rustc_hir::intravisit::{walk_expr, FnKind, Visitor};
|
||||||
use rustc_hir::LangItem::{OptionNone, ResultErr, ResultOk};
|
use rustc_hir::LangItem::{OptionNone, ResultErr, ResultOk};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
self as hir, def, Arm, ArrayLen, BindingAnnotation, Block, BlockCheckMode, Body, Closure, Constness, Destination,
|
self as hir, def, Arm, ArrayLen, BindingAnnotation, Block, BlockCheckMode, Body, Closure, Destination, Expr,
|
||||||
Expr, ExprKind, FnDecl, HirId, Impl, ImplItem, ImplItemKind, ImplItemRef, IsAsync, Item, ItemKind, LangItem, Local,
|
ExprKind, FnDecl, HirId, Impl, ImplItem, ImplItemKind, ImplItemRef, IsAsync, Item, ItemKind, LangItem, Local,
|
||||||
MatchSource, Mutability, Node, OwnerId, Param, Pat, PatKind, Path, PathSegment, PrimTy, QPath, Stmt, StmtKind,
|
MatchSource, Mutability, Node, OwnerId, Param, Pat, PatKind, Path, PathSegment, PrimTy, QPath, Stmt, StmtKind,
|
||||||
TraitItem, TraitItemKind, TraitItemRef, TraitRef, TyKind, UnOp,
|
TraitItem, TraitItemRef, TraitRef, TyKind, UnOp,
|
||||||
};
|
};
|
||||||
use rustc_lexer::{tokenize, TokenKind};
|
use rustc_lexer::{tokenize, TokenKind};
|
||||||
use rustc_lint::{LateContext, Level, Lint, LintContext};
|
use rustc_lint::{LateContext, Level, Lint, LintContext};
|
||||||
|
@ -197,31 +197,7 @@ pub fn find_binding_init<'tcx>(cx: &LateContext<'tcx>, hir_id: HirId) -> Option<
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub fn in_constant(cx: &LateContext<'_>, id: HirId) -> bool {
|
pub fn in_constant(cx: &LateContext<'_>, id: HirId) -> bool {
|
||||||
let parent_id = cx.tcx.hir().get_parent_item(id).def_id;
|
cx.tcx.hir().is_inside_const_context(id)
|
||||||
match cx.tcx.hir().get_by_def_id(parent_id) {
|
|
||||||
Node::Item(&Item {
|
|
||||||
kind: ItemKind::Const(..) | ItemKind::Static(..) | ItemKind::Enum(..),
|
|
||||||
..
|
|
||||||
})
|
|
||||||
| Node::TraitItem(&TraitItem {
|
|
||||||
kind: TraitItemKind::Const(..),
|
|
||||||
..
|
|
||||||
})
|
|
||||||
| Node::ImplItem(&ImplItem {
|
|
||||||
kind: ImplItemKind::Const(..),
|
|
||||||
..
|
|
||||||
})
|
|
||||||
| Node::AnonConst(_) => true,
|
|
||||||
Node::Item(&Item {
|
|
||||||
kind: ItemKind::Fn(ref sig, ..),
|
|
||||||
..
|
|
||||||
})
|
|
||||||
| Node::ImplItem(&ImplItem {
|
|
||||||
kind: ImplItemKind::Fn(ref sig, _),
|
|
||||||
..
|
|
||||||
}) => sig.header.constness == Constness::Const,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if a `Res` refers to a constructor of a `LangItem`
|
/// Checks if a `Res` refers to a constructor of a `LangItem`
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//@run-rustfix
|
//@run-rustfix
|
||||||
|
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains, inline_const)]
|
||||||
#![warn(clippy::bool_to_int_with_if)]
|
#![warn(clippy::bool_to_int_with_if)]
|
||||||
#![allow(unused, dead_code, clippy::unnecessary_operation, clippy::no_effect)]
|
#![allow(unused, dead_code, clippy::unnecessary_operation, clippy::no_effect)]
|
||||||
|
|
||||||
|
@ -79,6 +79,13 @@ fn main() {
|
||||||
|
|
||||||
pub const SHOULD_NOT_LINT: usize = if true { 1 } else { 0 };
|
pub const SHOULD_NOT_LINT: usize = if true { 1 } else { 0 };
|
||||||
|
|
||||||
|
// https://github.com/rust-lang/rust-clippy/issues/10452
|
||||||
|
let should_not_lint = [(); if true { 1 } else { 0 }];
|
||||||
|
|
||||||
|
let should_not_lint = const {
|
||||||
|
if true { 1 } else { 0 }
|
||||||
|
};
|
||||||
|
|
||||||
some_fn(a);
|
some_fn(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//@run-rustfix
|
//@run-rustfix
|
||||||
|
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains, inline_const)]
|
||||||
#![warn(clippy::bool_to_int_with_if)]
|
#![warn(clippy::bool_to_int_with_if)]
|
||||||
#![allow(unused, dead_code, clippy::unnecessary_operation, clippy::no_effect)]
|
#![allow(unused, dead_code, clippy::unnecessary_operation, clippy::no_effect)]
|
||||||
|
|
||||||
|
@ -111,6 +111,13 @@ fn main() {
|
||||||
|
|
||||||
pub const SHOULD_NOT_LINT: usize = if true { 1 } else { 0 };
|
pub const SHOULD_NOT_LINT: usize = if true { 1 } else { 0 };
|
||||||
|
|
||||||
|
// https://github.com/rust-lang/rust-clippy/issues/10452
|
||||||
|
let should_not_lint = [(); if true { 1 } else { 0 }];
|
||||||
|
|
||||||
|
let should_not_lint = const {
|
||||||
|
if true { 1 } else { 0 }
|
||||||
|
};
|
||||||
|
|
||||||
some_fn(a);
|
some_fn(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ LL | | };
|
||||||
= note: `!b as i32` or `(!b).into()` can also be valid options
|
= note: `!b as i32` or `(!b).into()` can also be valid options
|
||||||
|
|
||||||
error: boolean to int conversion using if
|
error: boolean to int conversion using if
|
||||||
--> $DIR/bool_to_int_with_if.rs:119:5
|
--> $DIR/bool_to_int_with_if.rs:126:5
|
||||||
|
|
|
|
||||||
LL | if a { 1 } else { 0 }
|
LL | if a { 1 } else { 0 }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ help: replace with from: `u8::from(a)`
|
| ^^^^^^^^^^^^^^^^^^^^^ help: replace with from: `u8::from(a)`
|
||||||
|
|
Loading…
Reference in a new issue