1
- trait Trait { }
1
+ trait Foo { fn foo ( & self ) { } }
2
+ impl < T > Foo for T { }
3
+
4
+ trait Bar { fn foo ( & self ) { } }
5
+ impl < T > Bar for T { }
6
+
7
+ enum E {
8
+ A , B
9
+ }
2
10
3
11
// Make sure casts between thin-pointer <-> fat pointer obey RFC401
4
12
fn main ( ) {
@@ -12,22 +20,84 @@ fn main() {
12
20
a as i16 ; //~ ERROR casting `&[i32]` as `i16` is invalid
13
21
a as u32 ; //~ ERROR casting `&[i32]` as `u32` is invalid
14
22
b as usize ; //~ ERROR non-primitive cast
15
- p as usize ;
16
- //~^ ERROR casting
23
+ p as usize ; //~ ERROR casting
17
24
18
25
// #22955
19
26
q as * const [ i32 ] ; //~ ERROR cannot cast
20
27
21
28
// #21397
22
- let t: * mut ( dyn Trait + ' static ) = 0 as * mut _ ;
29
+ let t: * mut ( dyn Foo + ' static ) = 0 as * mut _ ;
23
30
//~^ ERROR cannot cast `usize` to a pointer that is wide
24
31
let mut fail: * const str = 0 as * const str ;
25
32
//~^ ERROR cannot cast `usize` to a pointer that is wide
26
33
let mut fail2: * const str = 0isize as * const str ;
27
34
//~^ ERROR cannot cast `isize` to a pointer that is wide
35
+
36
+ let f: f32 = 1.2 ;
37
+ let v = core:: ptr:: null :: < u8 > ( ) ;
38
+ let fat_v : * const [ u8 ] = & [ ] ;
39
+ let fat_sv : * const [ i8 ] = & [ ] ;
40
+ let foo: & dyn Foo = & f;
41
+
42
+ let _ = v as & u8 ; //~ ERROR non-primitive cast
43
+ let _ = v as E ; //~ ERROR non-primitive cast
44
+ let _ = v as fn ( ) ; //~ ERROR non-primitive cast
45
+ let _ = v as ( u32 , ) ; //~ ERROR non-primitive cast
46
+ let _ = Some ( & v) as * const u8 ; //~ ERROR non-primitive cast
47
+
48
+ let _ = v as f32 ; //~ ERROR is invalid
49
+ let _ = main as f64 ; //~ ERROR is invalid
50
+ let _ = & v as usize ; //~ ERROR is invalid
51
+ let _ = f as * const u8 ; //~ ERROR is invalid
52
+ let _ = 3_i32 as bool ; //~ ERROR cannot cast
53
+ let _ = E :: A as bool ; //~ ERROR cannot cast
54
+ let _ = 0x61u32 as char ; //~ ERROR can be cast as
55
+
56
+ let _ = false as f32 ; //~ ERROR is invalid
57
+ let _ = E :: A as f32 ; //~ ERROR is invalid
58
+ let _ = 'a' as f32 ; //~ ERROR is invalid
59
+
60
+ let _ = false as * const u8 ; //~ ERROR is invalid
61
+ let _ = E :: A as * const u8 ; //~ ERROR is invalid
62
+ let _ = 'a' as * const u8 ; //~ ERROR is invalid
63
+
64
+ let _ = 42usize as * const [ u8 ] ; //~ ERROR cannot cast `usize` to a pointer that is wide
65
+ let _ = v as * const [ u8 ] ; //~ ERROR cannot cast
66
+ let _ = fat_v as * const dyn Foo ; //~ ERROR the size for values of type
67
+ let _ = foo as * const str ; //~ ERROR is invalid
68
+ let _ = foo as * mut str ; //~ ERROR is invalid
69
+ let _ = main as * mut str ; //~ ERROR is invalid
70
+ let _ = & f as * mut f32 ; //~ ERROR is invalid
71
+ let _ = & f as * const f64 ; //~ ERROR is invalid
72
+ let _ = fat_sv as usize ; //~ ERROR is invalid
73
+
74
+ let a : * const str = "hello" ;
75
+ let _ = a as * const dyn Foo ; //~ ERROR the size for values of type
76
+
77
+ // check no error cascade
78
+ let _ = main. f as * const u32 ; //~ ERROR no field
79
+
80
+ let cf: * const dyn Foo = & 0 ;
81
+ let _ = cf as * const [ u16 ] ; //~ ERROR is invalid
82
+ let _ = cf as * const dyn Bar ; //~ ERROR is invalid
83
+
84
+ // casting principal away is not allowed for now
85
+ let _ = cf as * const dyn Send ; //~ ERROR is invalid
86
+
87
+ vec ! [ 0.0 ] . iter ( ) . map ( |s| s as f32 ) . collect :: < Vec < f32 > > ( ) ; //~ ERROR is invalid
28
88
}
29
89
30
90
fn foo < T : ?Sized > ( ) {
31
91
let s = 0 as * const T ;
32
92
//~^ ERROR cannot cast `usize` to a pointer that may be wide
33
93
}
94
+
95
+ fn illegal_cast < U : ?Sized , V : ?Sized > ( u : * const U ) -> * const V
96
+ {
97
+ u as * const V //~ ERROR is invalid
98
+ }
99
+
100
+ fn illegal_cast_2 < U : ?Sized > ( u : * const U ) -> * const str
101
+ {
102
+ u as * const str //~ ERROR is invalid
103
+ }
0 commit comments