Rollup merge of #149544 - reddevilmidzy:where, r=fmease

Only apply `no_mangle_const_items`'s suggestion to plain const items

resolve: rust-lang/rust#149511
This commit is contained in:
Matthias Krüger 2025-12-04 09:22:11 +01:00 committed by GitHub
commit 5c9a4eed87
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 67 additions and 20 deletions

View file

@ -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

View file

@ -228,8 +228,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<Span>,
}
#[derive(LintDiagnostic)]

View file

@ -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`
|

View file

@ -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`

View file

@ -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 <https://github.com/rust-lang/rust/issues/149511>
#![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<const N: usize>: usize = N;
//~^ ERROR: const items should never be `#[no_mangle]`
fn main() {}

View file

@ -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<const N: usize>: usize = N;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 3 previous errors

View file

@ -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`