From 769d52774b9d94a5120dc34e2ea03971047d1c7c Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 9 Nov 2019 10:34:16 +0100 Subject: [PATCH] partially port invalid_value lint to diagnostic items --- src/libcore/mem/maybe_uninit.rs | 2 ++ src/libcore/mem/mod.rs | 2 ++ src/librustc_lint/builtin.rs | 21 ++++++++------------- src/libsyntax_pos/symbol.rs | 10 ++++------ 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/libcore/mem/maybe_uninit.rs b/src/libcore/mem/maybe_uninit.rs index 03093139bc2f9..1da368d40a964 100644 --- a/src/libcore/mem/maybe_uninit.rs +++ b/src/libcore/mem/maybe_uninit.rs @@ -254,6 +254,7 @@ impl MaybeUninit { /// [type]: union.MaybeUninit.html #[stable(feature = "maybe_uninit", since = "1.36.0")] #[inline(always)] + #[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "maybe_uninit_uninit")] pub const fn uninit() -> MaybeUninit { MaybeUninit { uninit: () } } @@ -300,6 +301,7 @@ impl MaybeUninit { /// ``` #[stable(feature = "maybe_uninit", since = "1.36.0")] #[inline] + #[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "maybe_uninit_zeroed")] pub fn zeroed() -> MaybeUninit { let mut u = MaybeUninit::::uninit(); unsafe { diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index c7da56aad309a..27cbff144ba91 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -457,6 +457,7 @@ pub const fn needs_drop() -> bool { #[stable(feature = "rust1", since = "1.0.0")] #[allow(deprecated_in_future)] #[allow(deprecated)] +#[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "mem_zeroed")] pub unsafe fn zeroed() -> T { intrinsics::panic_if_uninhabited::(); intrinsics::init() @@ -485,6 +486,7 @@ pub unsafe fn zeroed() -> T { #[stable(feature = "rust1", since = "1.0.0")] #[allow(deprecated_in_future)] #[allow(deprecated)] +#[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "mem_uninitialized")] pub unsafe fn uninitialized() -> T { intrinsics::panic_if_uninhabited::(); intrinsics::uninit() diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 867f5f76b59bc..09cb784b1541a 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -1903,29 +1903,23 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { /// Determine if this expression is a "dangerous initialization". fn is_dangerous_init(cx: &LateContext<'_, '_>, expr: &hir::Expr) -> Option { - const ZEROED_PATH: &[Symbol] = &[sym::core, sym::mem, sym::zeroed]; - const UININIT_PATH: &[Symbol] = &[sym::core, sym::mem, sym::uninitialized]; // `transmute` is inside an anonymous module (the `extern` block?); // `Invalid` represents the empty string and matches that. + // FIXME(#66075): use diagnostic items. Somehow, that does not seem to work + // on intrinsics right now. const TRANSMUTE_PATH: &[Symbol] = &[sym::core, sym::intrinsics, kw::Invalid, sym::transmute]; - const MU_ZEROED_PATH: &[Symbol] = - &[sym::core, sym::mem, sym::maybe_uninit, sym::MaybeUninit, sym::zeroed]; - const MU_UNINIT_PATH: &[Symbol] = - &[sym::core, sym::mem, sym::maybe_uninit, sym::MaybeUninit, sym::uninit]; if let hir::ExprKind::Call(ref path_expr, ref args) = expr.kind { // Find calls to `mem::{uninitialized,zeroed}` methods. if let hir::ExprKind::Path(ref qpath) = path_expr.kind { let def_id = cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id()?; - if cx.match_def_path(def_id, ZEROED_PATH) { + if cx.tcx.is_diagnostic_item(sym::mem_zeroed, def_id) { return Some(InitKind::Zeroed); - } - if cx.match_def_path(def_id, UININIT_PATH) { + } else if cx.tcx.is_diagnostic_item(sym::mem_uninitialized, def_id) { return Some(InitKind::Uninit); - } - if cx.match_def_path(def_id, TRANSMUTE_PATH) { + } else if cx.match_def_path(def_id, TRANSMUTE_PATH) { if is_zero(&args[0]) { return Some(InitKind::Zeroed); } @@ -1940,9 +1934,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { if let hir::ExprKind::Call(ref path_expr, _) = args[0].kind { if let hir::ExprKind::Path(ref qpath) = path_expr.kind { let def_id = cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id()?; - if cx.match_def_path(def_id, MU_ZEROED_PATH) { + + if cx.tcx.is_diagnostic_item(sym::maybe_uninit_zeroed, def_id) { return Some(InitKind::Zeroed); - } else if cx.match_def_path(def_id, MU_UNINIT_PATH) { + } else if cx.tcx.is_diagnostic_item(sym::maybe_uninit_uninit, def_id) { return Some(InitKind::Uninit); } } diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index 64ea82e1bdc53..594fd5621fdb3 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -418,9 +418,10 @@ symbols! { match_beginning_vert, match_default_bindings, may_dangle, - maybe_uninit, - MaybeUninit, - mem, + maybe_uninit_uninit, + maybe_uninit_zeroed, + mem_uninitialized, + mem_zeroed, member_constraints, message, meta, @@ -712,8 +713,6 @@ symbols! { underscore_imports, underscore_lifetimes, uniform_paths, - uninit, - uninitialized, universal_impl_trait, unmarked_api, unreachable_code, @@ -745,7 +744,6 @@ symbols! { windows, windows_subsystem, Yield, - zeroed, } }