Combining a no-harness test with a panic=abort key in the Cargo.toml leads to duplicate lang item errors if compiled with cargo test -Zbuild-std=core.
Steps to Reproduce
Make a folder with the following two files:
Cargo.toml
[package]
name = "test"
edition = "2024"
[profile.dev]
panic = "abort"
[[bin]]
name = "test"
path = "main.rs"
main.rs
Bash
rustup install nightly-2025-01-13
cargo +nightly-2025-01-13 build -Zbuild-std
Result
Compiling tmp v0.0.0 (/home/rchatham/Documents/programming/rust-wasm-eh-test-2)
error[E0152]: duplicate lang item in crate `core`: `sized`
|
= note: the lang item is first defined in crate `core` (which `std` depends on)
= note: first definition in `core` loaded from /home/rchatham/Documents/programming/rust-wasm-eh-test-2/target/wasm32-unknown-emscripten/debug/deps/libcore-05cdacbb5559ef58.rlib, /home/rchatham/Documents/programming/rust-wasm-eh-test-2/target/wasm32-unknown-emscripten/debug/deps/libcore-05cdacbb5559ef58.rmeta
= note: second definition in `core` loaded from /home/rchatham/.rustup/toolchains/nightly-2025-01-13-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libcore-9c3bca22b80bc54a.rlib
For more information about this error, try `rustc --explain E0152`.
error: could not compile `test` (bin "test") due to 1 previous error
Original MRE from the issue author
-
Create a new cargo project with the following contents:
Cargo.toml:
[package]
name = "playground"
version = "0.1.0"
authors = ["Philipp Oppermann <dev@phil-opp.com>"]
edition = "2018"
[lib]
harness = false
[dependencies]
[profile.dev]
panic = "abort" # it works if this line is removed
src/lib.rs:
#![no_std]
#![cfg_attr(test, no_main)]
#[cfg(test)]
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
target.json:
{
"llvm-target": "x86_64-unknown-none",
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
"arch": "x86_64",
"target-endian": "little",
"target-pointer-width": "64",
"target-c-int-width": "32",
"os": "none",
"executables": true,
"linker-flavor": "ld.lld",
"linker": "rust-lld",
"panic-strategy": "abort",
"disable-redzone": true,
"features": "-mmx,-sse,+soft-float"
}
-
Run cargo test --target target.json -Z build-std=core --no-run
The following error occurs:
Details
cargo test --target target.json -Z build-std=core
Compiling playground v0.1.0 (…)
error: duplicate lang item in crate `core`: `bool`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `char`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `str`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `slice`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `slice_u8`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `const_ptr`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `mut_ptr`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i8`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i16`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i32`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i64`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i128`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `isize`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `u8`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `u16`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `u32`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `u64`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `u128`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `usize`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `f32`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `f64`.
|
error: duplicate lang item in crate `core`: `bool`.
= note: first defined in crate `core`.
|
error: duplicate lang item in crate `core`: `sized`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `char`.
|
error: duplicate lang item in crate `core`: `unsize`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `str`.
|
error: duplicate lang item in crate `core`: `copy`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `slice`.
|
error: duplicate lang item in crate `core`: `clone`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `slice_u8`.
|
error: duplicate lang item in crate `core`: `sync`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `const_ptr`.
|
error: duplicate lang item in crate `core`: `freeze`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `mut_ptr`.
|
error: duplicate lang item in crate `core`: `drop`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i8`.
|
error: duplicate lang item in crate `core`: `coerce_unsized`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i16`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `dispatch_from_dyn`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `i32`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `add`.
|
error: duplicate lang item in crate `core`: `i64`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `sub`.
|
error: duplicate lang item in crate `core`: `i128`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `mul`.
|
error: duplicate lang item in crate `core`: `isize`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `div`.
|
error: duplicate lang item in crate `core`: `u8`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `rem`.
|
error: duplicate lang item in crate `core`: `u16`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `neg`.
|
error: duplicate lang item in crate `core`: `u32`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `not`.
|
error: duplicate lang item in crate `core`: `u64`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitxor`.
|
error: duplicate lang item in crate `core`: `u128`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitand`.
|
error: duplicate lang item in crate `core`: `usize`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitor`.
error: duplicate lang item in crate `core`: `f32`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `shl`.
error: duplicate lang item in crate `core`: `f64`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `shr`.
error: duplicate lang item in crate `core`: `sized`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `add_assign`.
error: duplicate lang item in crate `core`: `unsize`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `sub_assign`.
error: duplicate lang item in crate `core`: `copy`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `mul_assign`.
error: duplicate lang item in crate `core`: `clone`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `div_assign`.
error: duplicate lang item in crate `core`: `sync`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `rem_assign`.
error: duplicate lang item in crate `core`: `freeze`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitxor_assign`.
error: duplicate lang item in crate `core`: `drop`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitand_assign`.
error: duplicate lang item in crate `core`: `coerce_unsized`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitor_assign`.
error: duplicate lang item in crate `core`: `dispatch_from_dyn`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `shl_assign`.
error: duplicate lang item in crate `core`: `add`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `sub`.
error: duplicate lang item in crate `core`: `shr_assign`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `index`.
error: duplicate lang item in crate `core`: `mul`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `index_mut`.
error: duplicate lang item in crate `core`: `div`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `rem`.
error: duplicate lang item in crate `core`: `unsafe_cell`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `neg`.
|
error: duplicate lang item in crate `core`: `va_list`.
= note: first defined in crate `core`.
|
error: duplicate lang item in crate `core`: `not`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitxor`.
|
error: duplicate lang item in crate `core`: `deref`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitand`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `deref_mut`.
error: duplicate lang item in crate `core`: `bitor`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `receiver`.
error: duplicate lang item in crate `core`: `shl`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `fn`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `fn_mut`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `fn_once`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `future_trait`.
error: duplicate lang item in crate `core`: `shr`.
|
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `add_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `sub_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `mul_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `div_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `rem_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitxor_assign`.
error: duplicate lang item in crate `core`: `generator_state`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitand_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `bitor_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `shl_assign`.
|
= note: first defined in crate `core`.
|
error: duplicate lang item in crate `core`: `shr_assign`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `index`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `index_mut`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `unsafe_cell`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `generator`.
error: duplicate lang item in crate `core`: `va_list`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `deref`.
|
error: duplicate lang item in crate `core`: `unpin`.
= note: first defined in crate `core`.
|
error: duplicate lang item in crate `core`: `deref_mut`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `receiver`.
error: duplicate lang item in crate `core`: `pin`.
|
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `fn`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `eq`.
error: duplicate lang item in crate `core`: `fn_mut`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `fn_once`.
|
error: duplicate lang item in crate `core`: `partial_ord`.
= note: first defined in crate `core`.
|
error: duplicate lang item in crate `core`: `future_trait`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `generator_state`.
|
error: duplicate lang item in crate `core`: `ord`.
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `generator`.
|
error: duplicate lang item in crate `core`: `panic`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `unpin`.
|
error: duplicate lang item in crate `core`: `panic_bounds_check`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `pin`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `eq`.
error: duplicate lang item in crate `core`: `panic_info`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `partial_ord`.
error: duplicate lang item in crate `core`: `drop_in_place`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `ord`.
error: duplicate lang item in crate `core`: `alloc_layout`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `panic`.
error: duplicate lang item in crate `core`: `phantom_data`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `panic_bounds_check`.
error: duplicate lang item in crate `core`: `manually_drop`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `panic_info`.
error: duplicate lang item in crate `core`: `maybe_uninit`.
|
|
= note: first defined in crate `core`.
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `drop_in_place`.
|
error: duplicate lang item in crate `core`: `align_offset`.
= note: first defined in crate `core`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `alloc_layout`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `phantom_data`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `manually_drop`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `maybe_uninit`.
|
= note: first defined in crate `core`.
error: duplicate lang item in crate `core`: `align_offset`.
|
= note: first defined in crate `core`.
error: aborting due to 79 previous errors
error: argument should be `&PanicInfo`
--> src/lib.rs:6:17
|
6 | fn panic(_info: &core::panic::PanicInfo) -> ! {
| ^^^^^^^^^^^^^^^^^^^^^^^
error: Could not compile `playground`.
warning: build failed, waiting for other jobs to finish...
error: aborting due to 80 previous errors
error: Could not compile `playground`.
To learn more, run the command again with --verbose.
-
Remove the panic=abort line from the Cargo.toml
-
Rerun the command from step 2 (cargo test --target target.json -Z build-std=core --no-run). It works now.
My Guess
My guess is that the core library is somehow compiled twice when the panic=abort line is specified.
Version
cargo 1.39.0-nightly (fe0e5a4 2019-09-04)
Combining a no-harness test with a
panic=abortkey in the Cargo.toml leads to duplicate lang item errors if compiled withcargo test -Zbuild-std=core.Steps to Reproduce
MRE by @hoodmane from #15058
Make a folder with the following two files:
Cargo.toml
main.rs
Bash
rustup install nightly-2025-01-13cargo +nightly-2025-01-13 build -Zbuild-stdResult
Original MRE from the issue author
Create a new cargo project with the following contents:
Cargo.toml:src/lib.rs:target.json:{ "llvm-target": "x86_64-unknown-none", "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", "arch": "x86_64", "target-endian": "little", "target-pointer-width": "64", "target-c-int-width": "32", "os": "none", "executables": true, "linker-flavor": "ld.lld", "linker": "rust-lld", "panic-strategy": "abort", "disable-redzone": true, "features": "-mmx,-sse,+soft-float" }Run
cargo test --target target.json -Z build-std=core --no-runThe following error occurs:
Details
Remove the
panic=abortline from the Cargo.tomlRerun the command from step 2 (
cargo test --target target.json -Z build-std=core --no-run). It works now.My Guess
My guess is that the
corelibrary is somehow compiled twice when thepanic=abortline is specified.Version
cargo 1.39.0-nightly (fe0e5a4 2019-09-04)