Add tests for transmuting pattern types
This commit is contained in:
parent
ccc9ba5c30
commit
22f074129a
2 changed files with 73 additions and 0 deletions
34
tests/ui/type/pattern_types/transmute.rs
Normal file
34
tests/ui/type/pattern_types/transmute.rs
Normal 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() {}
|
39
tests/ui/type/pattern_types/transmute.stderr
Normal file
39
tests/ui/type/pattern_types/transmute.stderr
Normal 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`.
|
Loading…
Add table
Add a link
Reference in a new issue