//@ normalize-stderr-test: "\d+ bits" -> "N bits" // Tests that `transmute` cannot be called on types of different size. #![allow(warnings)] #![feature(specialization)] use std::mem::transmute; unsafe fn f() { let _: i8 = transmute(16i16); //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types } unsafe fn g(x: &T) { let _: i8 = transmute(x); //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types } trait Specializable { type Output; } impl Specializable for T { default type Output = u16; } unsafe fn specializable(x: u16) -> ::Output { transmute(x) //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types } #[repr(align(32))] struct OverAlignZST; pub struct PtrAndOverAlignZST { _inner: *mut T, _other: OverAlignZST, } pub unsafe fn shouldnt_work(from: *mut T) -> PtrAndOverAlignZST { transmute(from) //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types } pub struct PtrAndEmptyArray { _inner: *mut T, _other: [*mut T; 0], } pub unsafe fn shouldnt_work2(from: *mut T) -> PtrAndEmptyArray { std::mem::transmute(from) //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types } fn main() {}