Skip to content

rustc should not suggest #![feature(core_intrinsics)] #97501

Description

@kaya3

Rust beginner here. I was trying something out on the Playground, turns out I didn't understand how to use wrapping_add correctly; but following a sequence of suggested fixes from the compiler I arrived at the below, which gives two internal compiler errors. I asked on Discord and was told it is worth reporting it here, even though this code is incorrect and uses an unstable library feature.

Code

#![feature(core_intrinsics)]
use std::intrinsics::wrapping_add;

#[derive(Clone, Copy)]
struct WrapInt8 {
    value: u8
}

impl std::ops::Add for WrapInt8 {
    type Output = WrapInt8;
    fn add(self, other: WrapInt8) -> WrapInt8 {
        wrapping_add(self, other)
    }
}

fn main() {
    let p = WrapInt8 { value: 123 };
    let q = WrapInt8 { value: 234 };
    println!("{}", (p + q).value);
}

Meta

This occurred on the Playground, using the current nightly build (1.63.0-nightly, 2022-05-27 ebbcbfc).

Error output

   Compiling playground v0.0.1 (/playground)
error: internal compiler error: no errors encountered even though `delay_span_bug` issued

error: internal compiler error: broken MIR in Item(WithOptConstParam { did: DefId(0:8 ~ playground[3faf]::{impl#0}::add), const_param_did: None }) (end of phase transition to Optimized) at bb0[2]:
                                Cannot perform arithmetic on type WrapInt8
  --> src/main.rs:12:9
   |
12 |         wrapping_add(self, other)
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: delayed at compiler/rustc_const_eval/src/transform/validate.rs:127:36

thread 'rustc' panicked at 'Box<dyn Any>', compiler/rustc_errors/src/lib.rs:1368:13
stack backtrace:
   0:     0x7f216626ffcd - std::backtrace_rs::backtrace::libunwind::trace::h9dd319c001cd5d5b
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x7f216626ffcd - std::backtrace_rs::backtrace::trace_unsynchronized::h5cdb9413f7b7f703
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7f216626ffcd - std::sys_common::backtrace::_print_fmt::h62e01fe71d2f0609
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/sys_common/backtrace.rs:66:5
   3:     0x7f216626ffcd - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hb568664ce7d28696
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/sys_common/backtrace.rs:45:22
   4:     0x7f21662cbe5c - core::fmt::write::hff09181fc8f150c2
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/core/src/fmt/mod.rs:1196:17
   5:     0x7f21662616c1 - std::io::Write::write_fmt::h77801493f17dbb5a
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/io/mod.rs:1654:15
   6:     0x7f2166272cb5 - std::sys_common::backtrace::_print::hace3cc1f256ece45
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/sys_common/backtrace.rs:48:5
   7:     0x7f2166272cb5 - std::sys_common::backtrace::print::hc1b81d3f2867b83b
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/sys_common/backtrace.rs:35:9
   8:     0x7f2166272cb5 - std::panicking::default_hook::{{closure}}::he802b1e81f85775c
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/panicking.rs:295:22
   9:     0x7f21662729d6 - std::panicking::default_hook::h57b0d510bf2c9fe7
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/panicking.rs:314:9
  10:     0x7f2166a3c211 - rustc_driver[8a2d58f6f4bf431a]::DEFAULT_HOOK::{closure#0}::{closure#0}
  11:     0x7f216627338a - std::panicking::rust_panic_with_hook::hdd373bc6c22fa56f
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/panicking.rs:702:17
  12:     0x7f2167bdb181 - std[aa967257b9f8f73b]::panicking::begin_panic::<rustc_errors[1ed68885dba1d6d1]::ExplicitBug>::{closure#0}
  13:     0x7f2167bd9e06 - std[aa967257b9f8f73b]::sys_common::backtrace::__rust_end_short_backtrace::<std[aa967257b9f8f73b]::panicking::begin_panic<rustc_errors[1ed68885dba1d6d1]::ExplicitBug>::{closure#0}, !>
  14:     0x7f2167bedd56 - std[aa967257b9f8f73b]::panicking::begin_panic::<rustc_errors[1ed68885dba1d6d1]::ExplicitBug>
  15:     0x7f2167bf1ec6 - std[aa967257b9f8f73b]::panic::panic_any::<rustc_errors[1ed68885dba1d6d1]::ExplicitBug>
  16:     0x7f21694638e1 - <rustc_errors[1ed68885dba1d6d1]::HandlerInner as core[8467f2214112d7a4]::ops::drop::Drop>::drop
  17:     0x7f2168bcf7a8 - core[8467f2214112d7a4]::ptr::drop_in_place::<rustc_session[f5a33ef05da8b8fa]::parse::ParseSess>
  18:     0x7f2168bd1ac3 - <alloc[e5cd0633e65a6c1f]::rc::Rc<rustc_session[f5a33ef05da8b8fa]::session::Session> as core[8467f2214112d7a4]::ops::drop::Drop>::drop
  19:     0x7f2168bce36d - core[8467f2214112d7a4]::ptr::drop_in_place::<rustc_interface[b93c8180971df832]::interface::Compiler>
  20:     0x7f2168bcdd94 - rustc_span[4bbade9624b8160a]::with_source_map::<core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>, rustc_interface[b93c8180971df832]::interface::create_compiler_and_run<core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>, rustc_driver[8a2d58f6f4bf431a]::run_compiler::{closure#1}>::{closure#1}>
  21:     0x7f2168bba454 - rustc_interface[b93c8180971df832]::interface::create_compiler_and_run::<core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>, rustc_driver[8a2d58f6f4bf431a]::run_compiler::{closure#1}>
  22:     0x7f2168ba4792 - <scoped_tls[6dc72d687799c0be]::ScopedKey<rustc_span[4bbade9624b8160a]::SessionGlobals>>::set::<rustc_interface[b93c8180971df832]::interface::run_compiler<core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>, rustc_driver[8a2d58f6f4bf431a]::run_compiler::{closure#1}>::{closure#0}, core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>>
  23:     0x7f2168bbbb3f - std[aa967257b9f8f73b]::sys_common::backtrace::__rust_begin_short_backtrace::<rustc_interface[b93c8180971df832]::util::run_in_thread_pool_with_globals<rustc_interface[b93c8180971df832]::interface::run_compiler<core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>, rustc_driver[8a2d58f6f4bf431a]::run_compiler::{closure#1}>::{closure#0}, core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>>::{closure#0}, core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>>
  24:     0x7f2168bbbc79 - <<std[aa967257b9f8f73b]::thread::Builder>::spawn_unchecked_<rustc_interface[b93c8180971df832]::util::run_in_thread_pool_with_globals<rustc_interface[b93c8180971df832]::interface::run_compiler<core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>, rustc_driver[8a2d58f6f4bf431a]::run_compiler::{closure#1}>::{closure#0}, core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>>::{closure#0}, core[8467f2214112d7a4]::result::Result<(), rustc_errors[1ed68885dba1d6d1]::ErrorGuaranteed>>::{closure#1} as core[8467f2214112d7a4]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  25:     0x7f216627d2a3 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hf3233b13e94151c3
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/alloc/src/boxed.rs:1872:9
  26:     0x7f216627d2a3 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h4e8ef0a8db850d9e
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/alloc/src/boxed.rs:1872:9
  27:     0x7f216627d2a3 - std::sys::unix::thread::Thread::new::thread_start::haa7458da1d6aafbd
                               at /rustc/ebbcbfc236ced21d5e6a92269edb704692ff26b8/library/std/src/sys/unix/thread.rs:108:17
  28:     0x7f21661a3609 - start_thread
  29:     0x7f21660c6133 - clone
  30:                0x0 - <unknown>

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.63.0-nightly (ebbcbfc23 2022-05-27) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type bin -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
error: could not compile `playground`

Activity

  1. added
    C-bugCategory: This is a bug.
    I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on May 28, 2022
  2. compiler-errors commented on May 29, 2022

    @compiler-errors
    Contributor

    searched nightlies: from nightly-2022-03-01 to nightly-2022-05-28
    regressed nightly: nightly-2022-04-13
    searched commit range: 90ca447...52ca603
    regressed commit: 2a83fbc

    bisected with cargo-bisect-rustc v0.6.2

    Host triple: x86_64-unknown-linux-gnu
    Reproduce with:

    cargo bisect-rustc --start=2022-03-01 --end=2022-05-28 --regress=ice 

    Makes sense to fail in #95320, cc @JakobDegen. Maybe this should be a hard error instead of a delayed bug?

  3. JakobDegen commented on May 29, 2022

    @JakobDegen
    Contributor

    Thanks for the report!

    Before that PR, this:

    #![feature(core_intrinsics)]
    
    pub fn add(a: bool, b: bool) -> bool {
        std::intrinsics::wrapping_add(a, b)
    }

    just happily compiled, and this:

    #![feature(core_intrinsics)]
    use std::intrinsics::wrapping_add;
    
    #[derive(Clone, Copy)]
    struct WrapInt8 {
        value: u8,
        value2: u16,
    }
    
    impl std::ops::Add for WrapInt8 {
        type Output = WrapInt8;
        fn add(self, other: WrapInt8) -> WrapInt8 {
            wrapping_add(self, other)
        }
    }
    
    fn main() {
        let p = WrapInt8 { value: 1, value2: 2 };
        let q = WrapInt8 { value: 3, value2: 4 };
        println!("{}", (p + q).value);
    }

    already ICEd, so I don't think this is a regression. I'm tempted to say that we shouldn't bother trying to fix this, and that #![feature(core_intrinsics)] is not "supported" in the sense that this bug wants it to be. I'm not sure what the procedure is for making a decision on this though.

    Edit: Maybe the actual bug here is that we recommend #![feature(core_intrinsics)] in diagnostics?

  4. kaya3 commented on May 29, 2022

    @kaya3
    Author

    Maybe the actual bug here is that we recommend #![feature(core_intrinsics)] in diagnostics?

    I would agree with this. It probably makes sense to exclude std::intrinsics and core::intrinsics from suggested fixes, too.

  5. added a commit that references this issue on May 29, 2022
  6. scottmcm commented on May 30, 2022

    @scottmcm
    Member

    I agree that ICEing for this is actually pretty expected -- intrinsics are super-internal, and ICEing for misuse is basically fine.

    👍 to seeing if we can make sure not to suggest core_intrinsics the feature, or really anything with the extern "rust-intrinsic" ABI called via the intrinsics module. (Sadly there are some stable things with that ABI.)

    Maybe for the things that are stable we can have them emit warnings/errors pointing to the stable versions? Since this example really wants u8::wrapping_add, not the intrinsic. (Well, really it wants num::Wrapping<u8>, but we're probably not able to be that smart about it.)

  7. RalfJung commented on Jun 3, 2022

    @RalfJung
    Member

    We might also want to change this message if the crate uses the core_intrinsic feature:

    note: the compiler unexpectedly panicked. this is a bug.

    ICEs are not always bugs when intrinsics are used directly.

  8. added
    A-diagnosticsArea: Messages for errors, warnings, and lints
    A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`
    D-confusingDiagnostics: Confusing error or lint that should be reworked.
    D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.
    on Mar 11, 2023
  9. workingjubilee commented on Mar 11, 2023

    @workingjubilee
    Member

    🤔

    note: the compiler expectedly panicked. this is not a bug.

    Unfortunately there's no label for "inviting Rust programmers to see a cask of Amontillado".

  10. changed the title [-]Internal compiler errors using std::intrinsics::wrapping_add on Playground[/-] [+]rustc should not suggest `#![feature(core_intrinsics)]`[/+] on Mar 11, 2023
  11. added
    S-bug-has-testStatus: This bug is tracked inside the repo by a `known-bug` test.
    on Apr 15, 2024
  12. added a commit that references this issue on Jul 25, 2024
    c98d704
  13. RalfJung commented on Jul 25, 2024

    @RalfJung
    Member

    Reopening, since

    Maybe the actual bug here is that we recommend #![feature(core_intrinsics)] in diagnostics?

  14. RalfJung commented on Jul 25, 2024

    @RalfJung
    Member

    Though... on playground I do find this recommendation quite handy, when I have to craft some code that actually wants to call intrinsics. And we do emit this now:

    warning: the feature `core_intrinsics` is internal to the compiler or standard library
     --> src/main.rs:1:12
      |
    1 | #![feature(core_intrinsics)]
      |            ^^^^^^^^^^^^^^^
      |
      = note: using it is strongly discouraged
      = note: `#[warn(internal_features)]` on by default
    

    But we also still say this, which we probably shouldn't:

    note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
    
  15. added a commit that references this issue on Jul 29, 2024
    162db34
  16. added a commit that references this issue on Jul 29, 2024
    a64e04f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-intrinsicsArea: IntrinsicsA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`C-bugCategory: This is a bug.D-confusingDiagnostics: Confusing error or lint that should be reworked.D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.F-core_intrinsicsIssue in the "core intrinsics" for internal usage only.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️S-bug-has-testStatus: This bug is tracked inside the repo by a `known-bug` test.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions