Skip to content

On some targets, specifying optimize_for_size in build-std-features causes the core crate build to fail #143804

@nazo6

Description

@nazo6

With this code,

#![no_std]
#![no_main]

#[panic_handler]
fn panic(_panic: &core::panic::PanicInfo<'_>) -> ! {
    loop {}
}

This builds fine for thumbv6m-none-eabi target:

cargo build --target thumbv6m-none-eabi -Z build-std=core --release

However, adding optimize_for_size to build-std-features as follows causes the build to fail

cargo build --target thumbv6m-none-eabi -Z build-std=core -Z build-std-features=optimize_for_size --release

with this error

   Compiling core v0.0.0 (/home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core)
error[E0428]: the name `_inner_slow_integer_to_str` is defined multiple times
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:415:9
    |
415 |           fn _inner_slow_integer_to_str(mut n: $u, buf: &mut [MaybeUninit::<u8>]) -> usize {
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |           |
    |           `_inner_slow_integer_to_str` redefined here
    |           previous definition of the value `_inner_slow_integer_to_str` here
...
643 | /     impl_Display!(
644 | |         i8, u8,
645 | |         i16, u16,
646 | |         i32, u32,
647 | |         isize, usize,
648 | |         ; as u32 via to_u32 named fmt_u32);
    | |__________________________________________- in this macro invocation
    |
    = note: `_inner_slow_integer_to_str` must be defined only once in the value namespace of this module
    = note: this error originates in the macro `impl_Display` (in Nightly builds, run with -Z macro-backtrace for more info)

I am not familiar with the Rust code base, but I think the cause is that #142098 resulted in _inner_slow_integer_to_str being defined multiple times.
In fact, this compiles without error in nightly-2025-07-08.

Meta

rustc --version --verbose:

rustc 1.90.0-nightly (2a023bf80 2025-07-10)
binary: rustc
commit-hash: 2a023bf80a6fbd6a06d5460a34eb247b986286ed
commit-date: 2025-07-10
host: x86_64-unknown-linux-gnu
release: 1.90.0-nightly
LLVM version: 20.1.7
Backtrace

   Compiling core v0.0.0 (/home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core)
error[E0428]: the name `_inner_slow_integer_to_str` is defined multiple times
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:415:9
    |
415 |           fn _inner_slow_integer_to_str(mut n: $u, buf: &mut [MaybeUninit::<u8>]) -> usize {
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |           |
    |           `_inner_slow_integer_to_str` redefined here
    |           previous definition of the value `_inner_slow_integer_to_str` here
...
643 | /     impl_Display!(
644 | |         i8, u8,
645 | |         i16, u16,
646 | |         i32, u32,
647 | |         isize, usize,
648 | |         ; as u32 via to_u32 named fmt_u32);
    | |__________________________________________- in this macro invocation
    |
    = note: `_inner_slow_integer_to_str` must be defined only once in the value namespace of this module
    = note: this error originates in the macro `impl_Display` (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0308]: mismatched types
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:361:57
    |
361 |                       offset = _inner_slow_integer_to_str(self.unsigned_abs().$conv_fn(), &mut buf.buf);
    |                                -------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u32`, found `u64`
    |                                |
    |                                arguments to this function are incorrect
...
649 | /     impl_Display!(
650 | |         i64, u64,
651 | |         ; as u64 via to_u64 named fmt_u64);
    | |__________________________________________- in this macro invocation
    |
note: function defined here
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:415:12
    |
415 |           fn _inner_slow_integer_to_str(mut n: $u, buf: &mut [MaybeUninit::<u8>]) -> usize {
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---------
...
643 | /     impl_Display!(
644 | |         i8, u8,
645 | |         i16, u16,
646 | |         i32, u32,
647 | |         isize, usize,
648 | |         ; as u32 via to_u32 named fmt_u32);
    | |__________________________________________- in this macro invocation
    = note: this error originates in the macro `impl_Display` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you can convert a `u64` to a `u32` and panic if the converted value doesn't fit
    |
361 |                     offset = _inner_slow_integer_to_str(self.unsigned_abs().$conv_fn().try_into().unwrap(), &mut buf.buf);
    |                                                                                       ++++++++++++++++++++

error[E0308]: mismatched types
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:404:57
    |
404 |                       offset = _inner_slow_integer_to_str(self.$conv_fn(), &mut buf.buf);
    |                                -------------------------- ^^^^^^^^^^^^^^^ expected `u32`, found `u64`
    |                                |
    |                                arguments to this function are incorrect
...
649 | /     impl_Display!(
650 | |         i64, u64,
651 | |         ; as u64 via to_u64 named fmt_u64);
    | |__________________________________________- in this macro invocation
    |
note: function defined here
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:415:12
    |
415 |           fn _inner_slow_integer_to_str(mut n: $u, buf: &mut [MaybeUninit::<u8>]) -> usize {
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---------
...
643 | /     impl_Display!(
644 | |         i8, u8,
645 | |         i16, u16,
646 | |         i32, u32,
647 | |         isize, usize,
648 | |         ; as u32 via to_u32 named fmt_u32);
    | |__________________________________________- in this macro invocation
    = note: this error originates in the macro `impl_Display` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you can convert a `u64` to a `u32` and panic if the converted value doesn't fit
    |
404 |                     offset = _inner_slow_integer_to_str(self.$conv_fn().try_into().unwrap(), &mut buf.buf);
    |                                                                        ++++++++++++++++++++

error[E0308]: mismatched types
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:440:53
    |
440 |               let offset = _inner_slow_integer_to_str(n, &mut buf);
    |                            -------------------------- ^ expected `u32`, found `u64`
    |                            |
    |                            arguments to this function are incorrect
...
649 | /     impl_Display!(
650 | |         i64, u64,
651 | |         ; as u64 via to_u64 named fmt_u64);
    | |__________________________________________- in this macro invocation
    |
note: function defined here
   --> /home/nazo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/num.rs:415:12
    |
415 |           fn _inner_slow_integer_to_str(mut n: $u, buf: &mut [MaybeUninit::<u8>]) -> usize {
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---------
...
643 | /     impl_Display!(
644 | |         i8, u8,
645 | |         i16, u16,
646 | |         i32, u32,
647 | |         isize, usize,
648 | |         ; as u32 via to_u32 named fmt_u32);
    | |__________________________________________- in this macro invocation
    = note: this error originates in the macro `impl_Display` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you can convert a `u64` to a `u32` and panic if the converted value doesn't fit
    |
440 |             let offset = _inner_slow_integer_to_str(n.try_into().unwrap(), &mut buf);
    |                                                      ++++++++++++++++++++

Some errors have detailed explanations: E0308, E0428.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `core` (lib) due to 4 previous errors

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions