From 517a959f5bac41ba50d89fc0aecd336772ca0018 Mon Sep 17 00:00:00 2001 From: Cai Congcong Date: Sun, 29 Mar 2026 22:17:10 +0800 Subject: [PATCH] fix ICE when no mangle generic --- src/shims/foreign_items.rs | 6 +++++- tests/pass/issues/issue-154385-no-mangle-generic.rs | 9 +++++++++ tests/pass/issues/issue-154385-no-mangle-generic.stdout | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tests/pass/issues/issue-154385-no-mangle-generic.rs create mode 100644 tests/pass/issues/issue-154385-no-mangle-generic.stdout diff --git a/src/shims/foreign_items.rs b/src/shims/foreign_items.rs index 1c2fdfeea4..ea33d1ebec 100644 --- a/src/shims/foreign_items.rs +++ b/src/shims/foreign_items.rs @@ -157,7 +157,11 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { { return interp_ok(()); } - + if tcx.generics_of(def_id).requires_monomorphization(tcx) { + // Skip generic functions: while they can have #[no_mangle] (resulting in a compiler warning), + // foreign items cannot be generic, so this definition cannot match the foreign item we're looking for. + return interp_ok(()); + } let instance = Instance::mono(tcx, def_id); let symbol_name = tcx.symbol_name(instance).name; let is_weak = attrs.linkage == Some(Linkage::WeakAny); diff --git a/tests/pass/issues/issue-154385-no-mangle-generic.rs b/tests/pass/issues/issue-154385-no-mangle-generic.rs new file mode 100644 index 0000000000..0989cdd86a --- /dev/null +++ b/tests/pass/issues/issue-154385-no-mangle-generic.rs @@ -0,0 +1,9 @@ +fn main() { + foo(1234); +} + +#[allow(no_mangle_generic_items)] +#[unsafe(no_mangle)] +fn foo(value: T) { + println!("{value:?}"); +} diff --git a/tests/pass/issues/issue-154385-no-mangle-generic.stdout b/tests/pass/issues/issue-154385-no-mangle-generic.stdout new file mode 100644 index 0000000000..81c545efeb --- /dev/null +++ b/tests/pass/issues/issue-154385-no-mangle-generic.stdout @@ -0,0 +1 @@ +1234