648a35e327
Previously if the expression contained generic consts and did not have a directly equivalent type, transmuting the type in this way was forbidden, despite the two sizes being identical. Instead, we should be able to lazily tell if the two consts are identical, and if so allow them to be transmuted.
35 lines
792 B
Rust
35 lines
792 B
Rust
#![feature(generic_const_exprs)]
|
|
#![allow(incomplete_features)]
|
|
|
|
fn foo<const W: usize, const H: usize>(v: [[u32;H+1]; W]) -> [[u32; W+1]; H] {
|
|
unsafe {
|
|
std::mem::transmute(v)
|
|
//~^ ERROR cannot transmute
|
|
}
|
|
}
|
|
|
|
fn bar<const W: bool, const H: usize>(v: [[u32; H]; W]) -> [[u32; W]; H] {
|
|
//~^ ERROR mismatched types
|
|
//~| ERROR mismatched types
|
|
unsafe {
|
|
std::mem::transmute(v)
|
|
//~^ ERROR cannot transmute between types
|
|
}
|
|
}
|
|
|
|
fn baz<const W: usize, const H: usize>(v: [[u32; H]; W]) -> [u32; W * H * H] {
|
|
unsafe {
|
|
std::mem::transmute(v)
|
|
//~^ ERROR cannot transmute
|
|
}
|
|
}
|
|
|
|
fn overflow(v: [[[u32; 8888888]; 9999999]; 777777777]) -> [[[u32; 9999999]; 777777777]; 8888888] {
|
|
unsafe {
|
|
std::mem::transmute(v)
|
|
//~^ ERROR cannot transmute
|
|
}
|
|
}
|
|
|
|
fn main() {}
|