mirror of https://github.com/rust-lang/rust.git
37 lines
957 B
Rust
37 lines
957 B
Rust
//@ known-bug: #132960
|
|
|
|
#![feature(adt_const_params, const_ptr_read, generic_const_exprs)]
|
|
|
|
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)]
|
|
#[repr(C)]
|
|
|
|
const fn concat_arr<const M: usize, const N: usize>(a: [u8; M], b: [u8; N]) -> [u8; M + N] {}
|
|
|
|
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>();
|