rust-lang / rust-lang/rust

ICE: `Normalization of 'ty::ConstKind::Expr' is unimplemented`

Open
#132,960 4 comments 1 reaction 1 assignee View on GitHub

@BoxyUwU is already working on this.

Since Nov 12, 2024.

A-const-generics C-bug F-generic_const_exprs I-ICE S-bug-has-test T-compiler
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

auto-reduced (treereduce-rust):

//@compile-flags: --crate-type=lib
#![feature(unsized_const_params)]
#![feature(adt_const_params, const_ptr_read, generic_const_exprs)]

use std::mem::ManuallyDrop;

const fn concat_strs<const A: &'static str, const B: &'static str>() -> &'static str
where
    [(); A.len()]:,
    [(); B.len()]:,
    [(); A.len() + B.len()]:,
{
    #[repr(C)]
    struct ConcatJoin<const N: usize, const M: usize> {
        left: [u8; N],
        right: [u8; M],
    }

    #[repr(C)]
    union ConcatJoiner<const N: usize, const M: usize>
    where
        [(); N + M]:,
    {
        whole: ManuallyDrop<[u8; N + M]>,
        split: ManuallyDrop<ConcatJoin<N, M>>,
    }

    const fn concat_arr<const M: usize, const N: usize>(a: [u8; M], b: [u8; N]) -> [u8; M + N] {
        unsafe {
            let joiner = ConcatJoiner {
                split: ManuallyDrop::new(ConcatJoin { left: a, right: b }),
            };
            let join = joiner.whole;
            ManuallyDrop::into_inner(join)
        }
    }

    struct Inner<const A: &'static str, const B: &'static str>;
    impl<const A: &'static str, const B: &'static str> Inner<A, B>
    where
        [(); A.len()]:,
        [(); B.len()]:,
        [(); A.len() + B.len()]:,
    {
        const ABSTR: &'static str = unsafe {
            std::str::from_utf8_unchecked(&concat_arr(
                A.as_ptr().cast().read(),
                B.as_ptr().cast().read(),
            ))
        };
    }

    Inner::<A, B>::ABSTR
}

const FOO: &str = "foo";
const BAR: &str = "bar";
const FOOBAR: &str = concat_strs::<FOO, BAR>();

original code

original:

#![allow(incomplete_features)]
#![feature(adt_const_params, const_ptr_read, generic_const_exprs)]

use std::mem::ManuallyDrop;

const fn concat_strs<const A: &'static str, const B: &'static str>() -> &'static str
where
    [(); A.len()]:,
    [(); B.len()]:,
    [(); A.len() + B.len()]:,
{
    #[repr(C)]
    struct ConcatJoin<const N: usize, const M: usize> {
        left: [u8; N],
        right: [u8; M],
    }

    #[repr(C)]
    union ConcatJoiner<const N: usize, const M: usize>
    where
        [(); N + M]:,
    {
        whole: ManuallyDrop<[u8; N + M]>,
        split: ManuallyDrop<ConcatJoin<N, M>>,
    }

    const fn concat_arr<const M: usize, const N: usize>(a: [u8; M], b: [u8; N]) -> [u8; M + N]
    where
        [(); M + N]:,
    {
        unsafe {
            let joiner = ConcatJoiner {
                split: ManuallyDrop::new(ConcatJoin { left: a, right: b }),
            };
            let join = joiner.whole;
            ManuallyDrop::into_inner(join)
        }
    }

    struct Inner<const A: &'static str, const B: &'static str>;
    impl<const A: &'static str, const B: &'static str> Inner<A, B>
    where
        [(); A.len()]:,
        [(); B.len()]:,
        [(); A.len() + B.len()]:,
    {
        const ABSTR: &'static str = unsafe {
            std::str::from_utf8_unchecked(&concat_arr(
                A.as_ptr().cast::<[u8; A.len()]>().read(),
                B.as_ptr().cast::<[u8; B.len()]>().read(),
            ))
        };
    }

    Inner::<A, B>::ABSTR
}

const FOO: &str = "foo";
const BAR: &str = "bar";
const FOOBAR: &str = concat_strs::<FOO, BAR>();

Version information

rustc 1.84.0-nightly (6503543d1 2024-11-12)
binary: rustc
commit-hash: 6503543d11583d1686d4989847b2afbec8d9fdba
commit-date: 2024-11-12
host: x86_64-unknown-linux-gnu
release: 1.84.0-nightly
LLVM version: 19.1.3

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc -Zcrate-attr=feature(unsized_const_params) --crate-type=lib

Program output

warning: the feature `generic_const_exprs` is incomplete and may not be safe to use and/or cause compiler crashes
 --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:1:46
  |
1 | #![feature(adt_const_params, const_ptr_read, generic_const_exprs)]
  |                                              ^^^^^^^^^^^^^^^^^^^
  |
  = note: see issue #76560 <https://github.com/rust-lang/rust/issues/76560> for more information
  = note: `#[warn(incomplete_features)]` on by default

warning: the feature `unsized_const_params` is incomplete and may not be safe to use and/or cause compiler crashes
 --> <crate attribute>:1:9
  |
1 | feature(unsized_const_params)
  |         ^^^^^^^^^^^^^^^^^^^^
  |
  = note: see issue #95174 <https://github.com/rust-lang/rust/issues/95174> for more information

warning: the feature `const_ptr_read` has been stable since 1.71.0 and no longer requires an attribute to enable
 --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:1:30
  |
1 | #![feature(adt_const_params, const_ptr_read, generic_const_exprs)]
  |                              ^^^^^^^^^^^^^^
  |
  = note: `#[warn(stable_features)]` on by default

warning: type annotations needed
  --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:45:35
   |
45 |                 A.as_ptr().cast().read(),
   |                                   ^^^^
   |
   = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
   = note: for more information, see issue #46906 <https://github.com/rust-lang/rust/issues/46906>
   = note: `#[warn(tyvar_behind_raw_pointer)]` on by default

warning: type annotations needed
  --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:46:35
   |
46 |                 B.as_ptr().cast().read(),
   |                                   ^^^^
   |
   = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
   = note: for more information, see issue #46906 <https://github.com/rust-lang/rust/issues/46906>

warning: function `concat_strs` is never used
 --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:5:10
  |
5 | const fn concat_strs<const A: &'static str, const B: &'static str>() -> &'static str
  |          ^^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: associated constant `ABSTR` is never used
  --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:43:15
   |
37 | /     impl<const A: &'static str, const B: &'static str> Inner<A, B>
38 | |     where
39 | |         [(); A.len()]:,
40 | |         [(); B.len()]:,
41 | |         [(); A.len() + B.len()]:,
   | |_________________________________- associated constant in this implementation
42 |       {
43 |           const ABSTR: &'static str = unsafe {
   |                 ^^^^^

warning: constant `FOO` is never used
  --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:54:7
   |
54 | const FOO: &str = "foo";
   |       ^^^

warning: constant `BAR` is never used
  --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:55:7
   |
55 | const BAR: &str = "bar";
   |       ^^^

warning: constant `FOOBAR` is never used
  --> /tmp/icemaker_global_tempdir.M7QGlwHPHRjj/rustc_testrunner_tmpdir_reporting.Pgzdb9IPCHkV/mvce.rs:56:7
   |
56 | const FOOBAR: &str = concat_strs::<FOO, BAR>();
   |       ^^^^^^

warning: 10 warnings emitted

note: no errors encountered even though delayed bugs were created

note: those delayed bugs will now be shown as internal compiler errors

error: internal compiler error: Unevaluated `ty::Const` in MIR body
  |
  = note: delayed at /rustc/6503543d11583d1686d4989847b2afbec8d9fdba/compiler/rustc_middle/src/mir/consts.rs:328:40 - disabled backtrace

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: please make sure that you have updated to the latest nightly

note: rustc 1.84.0-nightly (6503543d1 2024-11-12) running on x86_64-unknown-linux-gnu

note: compiler flags: -Z crate-attr=feature(unsized_const_params) --crate-type lib -Z dump-mir-dir=dir

query stack during panic:
end of query stack

@rustbot label +F-adt_const_params +F-const_ptr_read +F-generic_const_exprs +F-unsized_const_params

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.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.