Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 9 additions & 12 deletions compiler/rustc_lint/src/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_lint/src/lints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Span>,
}

#[derive(LintDiagnostic)]
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/issues/issue-45562.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`
|
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/lint/lint-unexported-no-mangle.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`
|
Expand All @@ -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`

Expand Down
24 changes: 24 additions & 0 deletions tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.rs
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you potentially rename it to something like tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.rs (i.e., adding generic, otherwise the name is too generic nondescript)?

Original file line number Diff line number Diff line change
@@ -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() {}
26 changes: 26 additions & 0 deletions tests/ui/lint/no-mangle-generic-const-suggestion-suppressed.stderr
Original file line number Diff line number Diff line change
@@ -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

6 changes: 3 additions & 3 deletions tests/ui/lint/suggestions.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`
|
Expand Down Expand Up @@ -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`

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

Expand Down
Loading