Use diagnostic items for intrinsics::transmute, TryInto
This commit is contained in:
@@ -12,11 +12,12 @@ mod useless_transmute;
|
|||||||
mod utils;
|
mod utils;
|
||||||
mod wrong_transmute;
|
mod wrong_transmute;
|
||||||
|
|
||||||
use clippy_utils::{in_constant, match_def_path, paths};
|
use clippy_utils::in_constant;
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_hir::{Expr, ExprKind};
|
use rustc_hir::{Expr, ExprKind};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
|
use rustc_span::symbol::sym;
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// **What it does:** Checks for transmutes that can't ever be correct on any
|
/// **What it does:** Checks for transmutes that can't ever be correct on any
|
||||||
@@ -328,7 +329,7 @@ impl<'tcx> LateLintPass<'tcx> for Transmute {
|
|||||||
if let ExprKind::Call(path_expr, args) = e.kind;
|
if let ExprKind::Call(path_expr, args) = e.kind;
|
||||||
if let ExprKind::Path(ref qpath) = path_expr.kind;
|
if let ExprKind::Path(ref qpath) = path_expr.kind;
|
||||||
if let Some(def_id) = cx.qpath_res(qpath, path_expr.hir_id).opt_def_id();
|
if let Some(def_id) = cx.qpath_res(qpath, path_expr.hir_id).opt_def_id();
|
||||||
if match_def_path(cx, def_id, &paths::TRANSMUTE);
|
if cx.tcx.is_diagnostic_item(sym::transmute, def_id);
|
||||||
then {
|
then {
|
||||||
// Avoid suggesting from/to bits and dereferencing raw pointers in const contexts.
|
// Avoid suggesting from/to bits and dereferencing raw pointers in const contexts.
|
||||||
// See https://github.com/rust-lang/rust/issues/73736 for progress on making them `const fn`.
|
// See https://github.com/rust-lang/rust/issues/73736 for progress on making them `const fn`.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use clippy_utils::consts::{constant_context, Constant};
|
use clippy_utils::consts::{constant_context, Constant};
|
||||||
use clippy_utils::diagnostics::span_lint;
|
use clippy_utils::diagnostics::span_lint;
|
||||||
use clippy_utils::{is_expr_diagnostic_item, is_expr_path_def_path, paths};
|
use clippy_utils::is_expr_diagnostic_item;
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_ast::LitKind;
|
use rustc_ast::LitKind;
|
||||||
use rustc_hir::{Expr, ExprKind};
|
use rustc_hir::{Expr, ExprKind};
|
||||||
@@ -39,7 +39,7 @@ impl<'tcx> LateLintPass<'tcx> for TransmutingNull {
|
|||||||
|
|
||||||
if_chain! {
|
if_chain! {
|
||||||
if let ExprKind::Call(func, [arg]) = expr.kind;
|
if let ExprKind::Call(func, [arg]) = expr.kind;
|
||||||
if is_expr_path_def_path(cx, func, &paths::TRANSMUTE);
|
if is_expr_diagnostic_item(cx, func, sym::transmute);
|
||||||
|
|
||||||
then {
|
then {
|
||||||
// Catching transmute over constants that resolve to `null`.
|
// Catching transmute over constants that resolve to `null`.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use clippy_utils::diagnostics::{span_lint_and_help, span_lint_and_sugg};
|
|||||||
use clippy_utils::source::{snippet, snippet_with_macro_callsite};
|
use clippy_utils::source::{snippet, snippet_with_macro_callsite};
|
||||||
use clippy_utils::sugg::Sugg;
|
use clippy_utils::sugg::Sugg;
|
||||||
use clippy_utils::ty::{is_type_diagnostic_item, same_type_and_consts};
|
use clippy_utils::ty::{is_type_diagnostic_item, same_type_and_consts};
|
||||||
use clippy_utils::{get_parent_expr, is_trait_method, match_def_path, match_trait_method, paths};
|
use clippy_utils::{get_parent_expr, is_trait_method, match_def_path, paths};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::{Expr, ExprKind, HirId, MatchSource};
|
use rustc_hir::{Expr, ExprKind, HirId, MatchSource};
|
||||||
@@ -104,7 +104,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if_chain! {
|
if_chain! {
|
||||||
if match_trait_method(cx, e, &paths::TRY_INTO_TRAIT) && name.ident.name == sym::try_into;
|
if is_trait_method(cx, e, sym::try_into_trait) && name.ident.name == sym::try_into;
|
||||||
let a = cx.typeck_results().expr_ty(e);
|
let a = cx.typeck_results().expr_ty(e);
|
||||||
let b = cx.typeck_results().expr_ty(&args[0]);
|
let b = cx.typeck_results().expr_ty(&args[0]);
|
||||||
if is_type_diagnostic_item(cx, a, sym::result_type);
|
if is_type_diagnostic_item(cx, a, sym::result_type);
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ pub const REGEX_BYTES_NEW: [&str; 4] = ["regex", "re_bytes", "Regex", "new"];
|
|||||||
pub const REGEX_BYTES_SET_NEW: [&str; 5] = ["regex", "re_set", "bytes", "RegexSet", "new"];
|
pub const REGEX_BYTES_SET_NEW: [&str; 5] = ["regex", "re_set", "bytes", "RegexSet", "new"];
|
||||||
pub const REGEX_NEW: [&str; 4] = ["regex", "re_unicode", "Regex", "new"];
|
pub const REGEX_NEW: [&str; 4] = ["regex", "re_unicode", "Regex", "new"];
|
||||||
pub const REGEX_SET_NEW: [&str; 5] = ["regex", "re_set", "unicode", "RegexSet", "new"];
|
pub const REGEX_SET_NEW: [&str; 5] = ["regex", "re_set", "unicode", "RegexSet", "new"];
|
||||||
|
/// Preferably use the diagnostic item `sym::result_type` where possible
|
||||||
pub const RESULT: [&str; 3] = ["core", "result", "Result"];
|
pub const RESULT: [&str; 3] = ["core", "result", "Result"];
|
||||||
pub const RESULT_ERR: [&str; 4] = ["core", "result", "Result", "Err"];
|
pub const RESULT_ERR: [&str; 4] = ["core", "result", "Result", "Err"];
|
||||||
pub const RESULT_OK: [&str; 4] = ["core", "result", "Result", "Ok"];
|
pub const RESULT_OK: [&str; 4] = ["core", "result", "Result", "Ok"];
|
||||||
@@ -180,9 +181,8 @@ pub const SYM_MODULE: [&str; 3] = ["rustc_span", "symbol", "sym"];
|
|||||||
pub const SYNTAX_CONTEXT: [&str; 3] = ["rustc_span", "hygiene", "SyntaxContext"];
|
pub const SYNTAX_CONTEXT: [&str; 3] = ["rustc_span", "hygiene", "SyntaxContext"];
|
||||||
pub const TO_OWNED_METHOD: [&str; 4] = ["alloc", "borrow", "ToOwned", "to_owned"];
|
pub const TO_OWNED_METHOD: [&str; 4] = ["alloc", "borrow", "ToOwned", "to_owned"];
|
||||||
pub const TO_STRING_METHOD: [&str; 4] = ["alloc", "string", "ToString", "to_string"];
|
pub const TO_STRING_METHOD: [&str; 4] = ["alloc", "string", "ToString", "to_string"];
|
||||||
pub const TRANSMUTE: [&str; 4] = ["core", "intrinsics", "", "transmute"];
|
|
||||||
pub const TRY_FROM: [&str; 4] = ["core", "convert", "TryFrom", "try_from"];
|
pub const TRY_FROM: [&str; 4] = ["core", "convert", "TryFrom", "try_from"];
|
||||||
pub const TRY_INTO_TRAIT: [&str; 3] = ["core", "convert", "TryInto"];
|
|
||||||
pub const VEC: [&str; 3] = ["alloc", "vec", "Vec"];
|
pub const VEC: [&str; 3] = ["alloc", "vec", "Vec"];
|
||||||
pub const VEC_AS_MUT_SLICE: [&str; 4] = ["alloc", "vec", "Vec", "as_mut_slice"];
|
pub const VEC_AS_MUT_SLICE: [&str; 4] = ["alloc", "vec", "Vec", "as_mut_slice"];
|
||||||
pub const VEC_AS_SLICE: [&str; 4] = ["alloc", "vec", "Vec", "as_slice"];
|
pub const VEC_AS_SLICE: [&str; 4] = ["alloc", "vec", "Vec", "as_slice"];
|
||||||
|
|||||||
Reference in New Issue
Block a user