1
Fork 0

Add tests for transmuting pattern types

This commit is contained in:
Oli Scherer 2025-01-28 11:59:29 +00:00
parent ccc9ba5c30
commit 22f074129a
2 changed files with 73 additions and 0 deletions

View file

@ -0,0 +1,34 @@
#![feature(pattern_types)]
#![feature(pattern_type_macro)]
use std::pat::pattern_type;
// ok
fn create<const S: u32, const E: u32>(x: u32) -> pattern_type!(u32 is S..=E) {
unsafe { std::mem::transmute(x) }
//~^ ERROR types of different sizes
}
// ok
fn unwrap<const S: u32, const E: u32>(x: pattern_type!(u32 is S..=E)) -> u32 {
unsafe { std::mem::transmute(x) }
//~^ ERROR types of different sizes
}
// bad, only when S != u32::MIN or E != u32::MAX will this ok
fn non_base_ty_transmute<const S: u32, const E: u32>(
x: Option<pattern_type!(u32 is S..=E)>,
) -> u32 {
unsafe { std::mem::transmute(x) }
//~^ ERROR types of different sizes
}
// bad, only when S = u32::MIN and E = u32::MAX will this ok
fn wrapped_transmute<const S: u32, const E: u32>(
x: Option<pattern_type!(u32 is S..=E)>,
) -> Option<u32> {
unsafe { std::mem::transmute(x) }
//~^ ERROR types of different sizes
}
fn main() {}

View file

@ -0,0 +1,39 @@
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
--> $DIR/transmute.rs:8:14
|
LL | unsafe { std::mem::transmute(x) }
| ^^^^^^^^^^^^^^^^^^^
|
= note: source type: `u32` (32 bits)
= note: target type: `(u32) is S..=E` (size can vary because of u32)
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
--> $DIR/transmute.rs:14:14
|
LL | unsafe { std::mem::transmute(x) }
| ^^^^^^^^^^^^^^^^^^^
|
= note: source type: `(u32) is S..=E` (size can vary because of u32)
= note: target type: `u32` (32 bits)
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
--> $DIR/transmute.rs:22:14
|
LL | unsafe { std::mem::transmute(x) }
| ^^^^^^^^^^^^^^^^^^^
|
= note: source type: `Option<(u32) is S..=E>` (size can vary because of u32)
= note: target type: `u32` (32 bits)
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
--> $DIR/transmute.rs:30:14
|
LL | unsafe { std::mem::transmute(x) }
| ^^^^^^^^^^^^^^^^^^^
|
= note: source type: `Option<(u32) is S..=E>` (size can vary because of u32)
= note: target type: `Option<u32>` (64 bits)
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0512`.