Skip to content

Commit 61a77b3

Browse files
committed
tests: Avoid transmuting from fn item types.
1 parent 644d639 commit 61a77b3

File tree

4 files changed

+51
-59
lines changed

4 files changed

+51
-59
lines changed

src/test/run-pass/enum-clike-ffi-as-int.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,17 @@
2525

2626
#[repr(u32)]
2727
enum Foo {
28-
A = 0,
29-
B = 23
28+
A = 0,
29+
B = 23
3030
}
3131

3232
#[inline(never)]
3333
extern "C" fn foo(_x: usize) -> Foo { Foo::B }
3434

3535
pub fn main() {
36-
unsafe {
37-
let f: extern "C" fn(usize) -> u32 = ::std::mem::transmute(foo);
38-
assert_eq!(f(0xDEADBEEF), Foo::B as u32);
39-
}
36+
unsafe {
37+
let f: extern "C" fn(usize) -> u32 =
38+
::std::mem::transmute(foo as extern "C" fn(usize) -> Foo);
39+
assert_eq!(f(0xDEADBEEF), Foo::B as u32);
40+
}
4041
}

src/test/run-pass/mir_refs_correct.rs

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -204,48 +204,41 @@ fn t24() -> fn(u8) -> S {
204204
C4
205205
}
206206

207-
fn main(){
208-
unsafe {
209-
assert_eq!(t1()(), regular());
210-
211-
assert!(::std::mem::transmute::<_, *mut ()>(t2()) ==
212-
::std::mem::transmute::<_, *mut ()>(E::U));
213-
assert!(::std::mem::transmute::<_, *mut ()>(t3()) ==
214-
::std::mem::transmute::<_, *mut ()>(S));
215-
216-
assert_eq!(t4()(), S::hey());
217-
let s = S(42);
218-
assert_eq!(t5()(&s), <S as X>::hoy(&s));
219-
220-
221-
assert_eq!(t6()(), ext::regular_fn());
222-
assert!(::std::mem::transmute::<_, *mut ()>(t7()) ==
223-
::std::mem::transmute::<_, *mut ()>(ext::E::U));
224-
assert!(::std::mem::transmute::<_, *mut ()>(t8()) ==
225-
::std::mem::transmute::<_, *mut ()>(ext::S));
226-
227-
assert_eq!(t9()(), ext::S::hey());
228-
let sext = ext::S(6);
229-
assert_eq!(t10()(&sext), <ext::S as ext::X>::hoy(&sext));
230-
231-
let p = parametric::<u8>;
232-
assert!(::std::mem::transmute::<_, *mut ()>(t11()) ==
233-
::std::mem::transmute::<_, *mut ()>(p));
234-
235-
assert_eq!(t12(), C);
236-
assert_eq!(t13(), C2);
237-
assert_eq!(t13_2(), C3);
238-
239-
assert_eq!(t14()(), <S as X>::hoy2());
240-
assert_eq!(t15()(&s), S::hey2(&s));
241-
assert_eq!(t16()(10u32, 20u32), F::f(10u32, 20u32));
242-
assert_eq!(t17()(30u32, 10u64), F::f(30u32, 10u64));
243-
assert_eq!(t18()(50u64, 5u64), F::f(50u64, 5u64));
244-
assert_eq!(t19()(322u64, 2u32), F::f(322u64, 2u32));
245-
assert_eq!(t20()(123u64, 38u32), <u32 as T<_, _>>::staticmeth(123, 38));
246-
assert_eq!(t21(), Unit);
247-
assert_eq!(t22(), None);
248-
assert_eq!(t23(), (CEnum::A, CEnum::B));
249-
assert_eq!(t24(), C4);
250-
}
207+
fn main() {
208+
assert_eq!(t1()(), regular());
209+
210+
assert_eq!(t2() as *mut (), E::U as *mut ());
211+
assert_eq!(t3() as *mut (), S as *mut ());
212+
213+
assert_eq!(t4()(), S::hey());
214+
let s = S(42);
215+
assert_eq!(t5()(&s), <S as X>::hoy(&s));
216+
217+
218+
assert_eq!(t6()(), ext::regular_fn());
219+
assert_eq!(t7() as *mut (), ext::E::U as *mut ());
220+
assert_eq!(t8() as *mut (), ext::S as *mut ());
221+
222+
assert_eq!(t9()(), ext::S::hey());
223+
let sext = ext::S(6);
224+
assert_eq!(t10()(&sext), <ext::S as ext::X>::hoy(&sext));
225+
226+
let p = parametric::<u8>;
227+
assert_eq!(t11() as *mut (), p as *mut ());
228+
229+
assert_eq!(t12(), C);
230+
assert_eq!(t13(), C2);
231+
assert_eq!(t13_2(), C3);
232+
233+
assert_eq!(t14()(), <S as X>::hoy2());
234+
assert_eq!(t15()(&s), S::hey2(&s));
235+
assert_eq!(t16()(10u32, 20u32), F::f(10u32, 20u32));
236+
assert_eq!(t17()(30u32, 10u64), F::f(30u32, 10u64));
237+
assert_eq!(t18()(50u64, 5u64), F::f(50u64, 5u64));
238+
assert_eq!(t19()(322u64, 2u32), F::f(322u64, 2u32));
239+
assert_eq!(t20()(123u64, 38u32), <u32 as T<_, _>>::staticmeth(123, 38));
240+
assert_eq!(t21(), Unit);
241+
assert_eq!(t22(), None);
242+
assert_eq!(t23(), (CEnum::A, CEnum::B));
243+
assert_eq!(t24(), C4);
251244
}

src/test/run-pass/nullable-pointer-ffi-compat.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
use std::mem;
2525

2626
#[inline(never)]
27-
extern "C" fn foo<'a>(x: &'a isize) -> Option<&'a isize> { Some(x) }
27+
extern "C" fn foo(x: &isize) -> Option<&isize> { Some(x) }
2828

2929
static FOO: isize = 0xDEADBEE;
3030

3131
pub fn main() {
3232
unsafe {
33-
let f: for<'a> extern "C" fn(&'a isize) -> &'a isize = mem::transmute(foo);
33+
let f: extern "C" fn(&isize) -> &isize =
34+
mem::transmute(foo as extern "C" fn(&isize) -> Option<&isize>);
3435
assert_eq!(*f(&FOO), FOO);
3536
}
3637
}

src/test/run-pass/nullable-pointer-iotareduction.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
#![allow(unknown_features)]
1313
#![feature(box_syntax)]
1414

15-
use std::{option, mem};
16-
1715
// Iota-reduction is a rule in the Calculus of (Co-)Inductive Constructions,
1816
// which "says that a destructor applied to an object built from a constructor
1917
// behaves as expected". -- http://coq.inria.fr/doc/Reference-Manual006.html
@@ -43,9 +41,9 @@ macro_rules! check_option {
4341
check_option!($e, $T, |ptr| assert_eq!(*ptr, $e));
4442
}};
4543
($e:expr, $T:ty, |$v:ident| $chk:expr) => {{
46-
assert!(option::Option::None::<$T>.is_none());
44+
assert!(None::<$T>.is_none());
4745
let e = $e;
48-
let s_ = option::Option::Some::<$T>(e);
46+
let s_ = Some::<$T>(e);
4947
let $v = s_.as_ref().unwrap();
5048
$chk
5149
}}
@@ -78,9 +76,8 @@ pub fn main() {
7876
check_type!(&17, &isize);
7977
check_type!(box 18, Box<isize>);
8078
check_type!("foo".to_string(), String);
81-
check_type!(vec!(20, 22), Vec<isize> );
82-
let mint: usize = unsafe { mem::transmute(main) };
79+
check_type!(vec!(20, 22), Vec<isize>);
8380
check_type!(main, fn(), |pthing| {
84-
assert_eq!(mint, unsafe { mem::transmute(*pthing) })
81+
assert_eq!(main as fn(), *pthing as fn())
8582
});
8683
}

0 commit comments

Comments
 (0)