diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index 36f4ad64a42b8..dd0aa848ed2c9 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -41,7 +41,7 @@ pub use rustc_session::lint::builtin::*; use rustc_session::{declare_lint, declare_lint_pass, impl_lint_pass}; use rustc_span::edition::Edition; use rustc_span::source_map::Spanned; -use rustc_span::{BytePos, DUMMY_SP, Ident, InnerSpan, Span, Symbol, kw, sym}; +use rustc_span::{DUMMY_SP, Ident, InnerSpan, Span, Symbol, kw, sym}; use rustc_target::asm::InlineAsmArch; use rustc_trait_selection::infer::{InferCtxtExt, TyCtxtInferExt}; use rustc_trait_selection::traits::misc::type_allowed_to_implement_copy; @@ -997,18 +997,15 @@ impl<'tcx> LateLintPass<'tcx> for InvalidNoMangleItems { self.check_no_mangle_on_generic_fn(cx, attr_span, it.owner_id.def_id); } } - hir::ItemKind::Const(..) => { + hir::ItemKind::Const(ident, generics, ..) => { if find_attr!(attrs, AttributeKind::NoMangle(..)) { - // account for "pub const" (#45562) - let start = cx - .tcx - .sess - .source_map() - .span_to_snippet(it.span) - .map(|snippet| snippet.find("const").unwrap_or(0)) - .unwrap_or(0) as u32; - // `const` is 5 chars - let suggestion = it.span.with_hi(BytePos(it.span.lo().0 + start + 5)); + let suggestion = + if generics.params.is_empty() && generics.where_clause_span.is_empty() { + // account for "pub const" (#45562) + Some(it.span.until(ident.span)) + } else { + None + }; // Const items do not refer to a particular location in memory, and therefore // don't have anything to attach a symbol to diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs index 096299c16e0fe..130c0762eb402 100644 --- a/compiler/rustc_lint/src/lints.rs +++ b/compiler/rustc_lint/src/lints.rs @@ -229,8 +229,8 @@ pub(crate) struct BuiltinNoMangleGeneric { #[derive(LintDiagnostic)] #[diag(lint_builtin_const_no_mangle)] pub(crate) struct BuiltinConstNoMangle { - #[suggestion(code = "pub static", applicability = "machine-applicable")] - pub suggestion: Span, + #[suggestion(code = "pub static ", applicability = "machine-applicable")] + pub suggestion: Option, } #[derive(LintDiagnostic)] diff --git a/tests/ui/issues/issue-45562.stderr b/tests/ui/issues/issue-45562.stderr index 55d35f76a0198..3372986af9373 100644 --- a/tests/ui/issues/issue-45562.stderr +++ b/tests/ui/issues/issue-45562.stderr @@ -2,7 +2,7 @@ error: const items should never be `#[no_mangle]` --> $DIR/issue-45562.rs:5:14 | LL | #[no_mangle] pub const RAH: usize = 5; - | ---------^^^^^^^^^^^^^^^^ + | ----------^^^^^^^^^^^^^^^ | | | help: try a static value: `pub static` | diff --git a/tests/ui/lint/lint-unexported-no-mangle.stderr b/tests/ui/lint/lint-unexported-no-mangle.stderr index 0efec51abaf6d..cb9477cfe16fb 100644 --- a/tests/ui/lint/lint-unexported-no-mangle.stderr +++ b/tests/ui/lint/lint-unexported-no-mangle.stderr @@ -31,7 +31,7 @@ error: const items should never be `#[no_mangle]` --> $DIR/lint-unexported-no-mangle.rs:9:1 | LL | const FOO: u64 = 1; - | -----^^^^^^^^^^^^^^ + | ------^^^^^^^^^^^^^ | | | help: try a static value: `pub static` | @@ -41,7 +41,7 @@ error: const items should never be `#[no_mangle]` --> $DIR/lint-unexported-no-mangle.rs:12:1 | LL | pub const PUB_FOO: u64 = 1; - | ---------^^^^^^^^^^^^^^^^^^ + | ----------^^^^^^^^^^^^^^^^^ | | | help: try a static value: `pub static` diff --git a/tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.rs b/tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.rs new file mode 100644 index 0000000000000..8dcc741b71b13 --- /dev/null +++ b/tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.rs @@ -0,0 +1,24 @@ +//! Ensure the `no_mangle_const_items` lint triggers but does not offer a `pub static` +//! suggestion for consts that have generics or a where-clause. +//! regression test for + +#![feature(generic_const_items)] +#![allow(incomplete_features)] +#![deny(no_mangle_const_items)] +trait Trait { + const ASSOC: u32; +} + +#[unsafe(no_mangle)] +const WHERE_BOUND: u32 = <&'static ()>::ASSOC where for<'a> &'a (): Trait; +//~^ ERROR: const items should never be `#[no_mangle]` + +#[no_mangle] +const _: () = () where; +//~^ ERROR: const items should never be `#[no_mangle]` + +#[unsafe(no_mangle)] +pub const GENERIC: usize = N; +//~^ ERROR: const items should never be `#[no_mangle]` + +fn main() {} diff --git a/tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.stderr b/tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.stderr new file mode 100644 index 0000000000000..a131015fd9694 --- /dev/null +++ b/tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.stderr @@ -0,0 +1,26 @@ +error: const items should never be `#[no_mangle]` + --> $DIR/no-mangle-generic-const-suggestion-suppressed.rs:13:1 + | +LL | const WHERE_BOUND: u32 = <&'static ()>::ASSOC where for<'a> &'a (): Trait; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/no-mangle-generic-const-suggestion-suppressed.rs:7:9 + | +LL | #![deny(no_mangle_const_items)] + | ^^^^^^^^^^^^^^^^^^^^^ + +error: const items should never be `#[no_mangle]` + --> $DIR/no-mangle-generic-const-suggestion-suppressed.rs:17:1 + | +LL | const _: () = () where; + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error: const items should never be `#[no_mangle]` + --> $DIR/no-mangle-generic-const-suggestion-suppressed.rs:21:1 + | +LL | pub const GENERIC: usize = N; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors + diff --git a/tests/ui/lint/suggestions.stderr b/tests/ui/lint/suggestions.stderr index c35e92f59809a..c6a7de51da2e6 100644 --- a/tests/ui/lint/suggestions.stderr +++ b/tests/ui/lint/suggestions.stderr @@ -52,7 +52,7 @@ error: const items should never be `#[no_mangle]` --> $DIR/suggestions.rs:6:14 | LL | #[no_mangle] const DISCOVERY: usize = 1; - | -----^^^^^^^^^^^^^^^^^^^^^^ + | ------^^^^^^^^^^^^^^^^^^^^^ | | | help: try a static value: `pub static` | @@ -81,7 +81,7 @@ error: const items should never be `#[no_mangle]` --> $DIR/suggestions.rs:22:18 | LL | #[no_mangle] pub const DAUNTLESS: bool = true; - | ---------^^^^^^^^^^^^^^^^^^^^^^^^ + | ----------^^^^^^^^^^^^^^^^^^^^^^^ | | | help: try a static value: `pub static` @@ -97,7 +97,7 @@ error: const items should never be `#[no_mangle]` --> $DIR/suggestions.rs:31:18 | LL | #[no_mangle] pub(crate) const VETAR: bool = true; - | ----------------^^^^^^^^^^^^^^^^^^^^ + | -----------------^^^^^^^^^^^^^^^^^^^ | | | help: try a static value: `pub static`