]> git.lizzy.rs Git - rust.git/blob - src/test/ui/transmute/transmute-from-fn-item-types-error.rs
Auto merge of #65421 - estebank:variants, r=petrochenkov
[rust.git] / src / test / ui / transmute / transmute-from-fn-item-types-error.rs
1 use std::mem;
2
3 unsafe fn foo() -> (i8, *const (), Option<fn()>) {
4     let i = mem::transmute(bar);
5     //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types
6
7
8     let p = mem::transmute(foo);
9     //~^ ERROR can't transmute zero-sized type
10
11
12     let of = mem::transmute(main);
13     //~^ ERROR can't transmute zero-sized type
14
15
16     (i, p, of)
17 }
18
19 unsafe fn bar() {
20     // Error as usual if the resulting type is not pointer-sized.
21     mem::transmute::<_, u8>(main);
22     //~^ ERROR cannot transmute between types of different sizes, or dependently-sized types
23
24
25     mem::transmute::<_, *mut ()>(foo);
26     //~^ ERROR can't transmute zero-sized type
27
28
29     mem::transmute::<_, fn()>(bar);
30     //~^ ERROR can't transmute zero-sized type
31
32
33     // No error if a coercion would otherwise occur.
34     mem::transmute::<fn(), usize>(main);
35 }
36
37 unsafe fn baz() {
38     mem::transmute::<_, *mut ()>(Some(foo));
39     //~^ ERROR can't transmute zero-sized type
40
41
42     mem::transmute::<_, fn()>(Some(bar));
43     //~^ ERROR can't transmute zero-sized type
44
45
46     mem::transmute::<_, Option<fn()>>(Some(baz));
47     //~^ ERROR can't transmute zero-sized type
48
49
50     // No error if a coercion would otherwise occur.
51     mem::transmute::<Option<fn()>, usize>(Some(main));
52 }
53
54 fn main() {
55     unsafe {
56         foo();
57         bar();
58         baz();
59     }
60 }