error when using no_mangle on language items

add suggestion on how to add a panic breakpoint

Co-authored-by: Pat Pannuto <pat.pannuto@gmail.com>
delete no_mangle from ui/panic-handler/panic-handler-wrong-location test

issue an error for the usage of #[no_mangle] on internal language items

delete the comments

add newline

rephrase note

Co-authored-by: bjorn3 <17426603+bjorn3@users.noreply.github.com>
update error not to leak implementation details

delete no_mangle_span

Co-authored-by: bjorn3 <17426603+bjorn3@users.noreply.github.com>
delete commented code
This commit is contained in:
Alexandru RADOVICI 2025-04-30 14:52:15 +03:00
parent 49e5e4e3a5
commit 07c7e5ffb3
6 changed files with 86 additions and 1 deletions

View file

@ -87,6 +87,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
let mut link_ordinal_span = None;
let mut no_sanitize_span = None;
let mut mixed_export_name_no_mangle_lint_state = MixedExportNameAndNoMangleState::default();
let mut no_mangle_span = None;
for attr in attrs.iter() {
// In some cases, attribute are only valid on functions, but it's the `check_attr`
@ -139,6 +140,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
}
sym::naked => codegen_fn_attrs.flags |= CodegenFnAttrFlags::NAKED,
sym::no_mangle => {
no_mangle_span = Some(attr.span());
if tcx.opt_item_name(did.to_def_id()).is_some() {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_MANGLE;
mixed_export_name_no_mangle_lint_state.track_no_mangle(
@ -621,6 +623,34 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
}
check_link_name_xor_ordinal(tcx, &codegen_fn_attrs, link_ordinal_span);
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL)
&& codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NO_MANGLE)
{
let lang_item =
lang_items::extract(attrs).map_or(None, |(name, _span)| LangItem::from_name(name));
let mut err = tcx
.dcx()
.struct_span_err(
no_mangle_span.unwrap_or_default(),
"`#[no_mangle]` cannot be used on internal language items",
)
.with_note("Rustc requires this item to have a specific mangled name.")
.with_span_label(tcx.def_span(did), "should be the internal language item");
if let Some(lang_item) = lang_item {
if let Some(link_name) = lang_item.link_name() {
err = err
.with_note("If you are trying to prevent mangling to ease debugging, many")
.with_note(format!(
"debuggers support a command such as `rbreak {link_name}` to"
))
.with_note(format!(
"match `.*{link_name}.*` instead of `break {link_name}` on a specific name"
))
}
}
err.emit();
}
// Any linkage to LLVM intrinsics for now forcibly marks them all as never
// unwinds since LLVM sometimes can't handle codegen which `invoke`s
// intrinsic functions.

View file

@ -0,0 +1,14 @@
// Issue a error when the user uses #[no_mangle] on internal language items
//@ edition:2024
#![feature(rustc_attrs)]
#[rustc_std_internal_symbol]
#[unsafe(no_mangle)] //~ERROR `#[no_mangle]` cannot be used on internal language items
fn internal_lang_function () {
}
fn main() {
}

View file

@ -0,0 +1,12 @@
error: `#[no_mangle]` cannot be used on internal language items
--> $DIR/no-mangle-on-internal-lang-items.rs:7:1
|
LL | #[unsafe(no_mangle)]
| ^^^^^^^^^^^^^^^^^^^^
LL | fn internal_lang_function () {
| ---------------------------- should be the internal language item
|
= note: Rustc requires this item to have a specific mangled name.
error: aborting due to 1 previous error

View file

@ -0,0 +1,14 @@
// Issue an error when the user uses #[no_mangle] on the panic handler
//@ edition:2024
#![crate_type="lib"]
#![no_std]
#![no_main]
use core::panic::PanicInfo;
#[unsafe(no_mangle)] //~ ERROR `#[no_mangle]` cannot be used on internal language items
#[panic_handler]
pub unsafe fn panic_fmt(pi: &PanicInfo) -> ! {
loop {}
}

View file

@ -0,0 +1,16 @@
error: `#[no_mangle]` cannot be used on internal language items
--> $DIR/no-mangle-on-panic-handler.rs:10:1
|
LL | #[unsafe(no_mangle)]
| ^^^^^^^^^^^^^^^^^^^^
LL | #[panic_handler]
LL | pub unsafe fn panic_fmt(pi: &PanicInfo) -> ! {
| -------------------------------------------- should be the internal language item
|
= note: Rustc requires this item to have a specific mangled name.
= note: If you are trying to prevent mangling to ease debugging, many
= note: debuggers support a command such as `rbreak rust_begin_unwind` to
= note: match `.*rust_begin_unwind.*` instead of `break rust_begin_unwind` on a specific name
error: aborting due to 1 previous error

View file

@ -4,7 +4,6 @@
#![no_main]
#[panic_handler] //~ ERROR `panic_impl` lang item must be applied to a function
#[no_mangle]
static X: u32 = 42;
//~? ERROR `#[panic_handler]` function required, but not found