rust-lang / rust-lang/cargo

[-Zbuild-std] Duplicate lang item with panic=abort

Open
#7,359 10 comments 22 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug S-triage Z-build-std
Dominant language
Rust
Stars
15.5k
Forks
3k
Avg merge
23h 30m
Merged PRs (30d)
51

Description

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

MRE by @hoodmane from #15058

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
pub fn main() { }
Bash
  1. rustup install nightly-2025-01-13
  2. 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
  1. 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"
      }
    
  2. Run cargo test --target target.json -Z build-std=core --no-run

    The following error occurs:

    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.
    
  3. Remove the panic=abort line from the Cargo.toml

  4. 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 (fe0e5a48b 2019-09-04)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the failure using the Cargo.toml and main.rs examples with cargo +nightly-2025-01-13 build -Zbuild-std and cargo test --target target.json -Z build-std=core --no-run. Trace Cargo's handling of panic = "abort", no-harness tests, and -Zbuild-std; done means these reproductions no longer emit duplicate core lang-item errors.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
build-system, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.