summaryrefslogtreecommitdiffstats
path: root/src/test/ui/cast/cast-rfc0401.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/cast/cast-rfc0401.rs')
-rw-r--r--src/test/ui/cast/cast-rfc0401.rs173
1 files changed, 173 insertions, 0 deletions
diff --git a/src/test/ui/cast/cast-rfc0401.rs b/src/test/ui/cast/cast-rfc0401.rs
new file mode 100644
index 000000000..996fa013f
--- /dev/null
+++ b/src/test/ui/cast/cast-rfc0401.rs
@@ -0,0 +1,173 @@
+// run-pass
+
+#![allow(dead_code)]
+
+use std::vec;
+
+enum Simple {
+ A,
+ B,
+ C
+}
+
+enum Valued {
+ H8=163,
+ Z=0,
+ X=256,
+ H7=67,
+}
+
+enum ValuedSigned {
+ M1=-1,
+ P1=1
+}
+
+fn main()
+{
+ // coercion-cast
+ let mut it = vec![137].into_iter();
+ let itr: &mut vec::IntoIter<u32> = &mut it;
+ assert_eq!((itr as &mut dyn Iterator<Item=u32>).next(), Some(137));
+ assert_eq!((itr as &mut dyn Iterator<Item=u32>).next(), None);
+
+ assert_eq!(Some(4u32) as Option<u32>, Some(4u32));
+ assert_eq!((1u32,2u32) as (u32,u32), (1,2));
+
+ // this isn't prim-int-cast. Check that it works.
+ assert_eq!(false as bool, false);
+ assert_eq!(true as bool, true);
+
+ // numeric-cast
+ let l: u64 = 0x8090a0b0c0d0e0f0;
+ let lsz: usize = l as usize;
+ assert_eq!(l as u32, 0xc0d0e0f0);
+
+ // numeric-cast
+ assert_eq!(l as u8, 0xf0);
+ assert_eq!(l as i8,-0x10);
+ assert_eq!(l as u32, 0xc0d0e0f0);
+ assert_eq!(l as u32 as usize as u32, l as u32);
+ assert_eq!(l as i32,-0x3f2f1f10);
+ assert_eq!(l as i32 as isize as i32, l as i32);
+ assert_eq!(l as i64,-0x7f6f5f4f3f2f1f10);
+
+ assert_eq!(0 as f64, 0f64);
+ assert_eq!(1 as f64, 1f64);
+
+ assert_eq!(l as f64, 9264081114510712022f64);
+
+ assert_eq!(l as i64 as f64, -9182662959198838444f64);
+// float overflow : needs fixing
+// assert_eq!(l as f32 as i64 as u64, 9264082620822882088u64);
+// assert_eq!(l as i64 as f32 as i64, 9182664080220408446i64);
+
+ assert_eq!(4294967040f32 as u32, 0xffffff00u32);
+ assert_eq!(1.844674407370955e19f64 as u64, 0xfffffffffffff800u64);
+
+ assert_eq!(9.223372036854775e18f64 as i64, 0x7ffffffffffffc00i64);
+ assert_eq!(-9.223372036854776e18f64 as i64, 0x8000000000000000u64 as i64);
+
+ // addr-ptr-cast/ptr-addr-cast (thin ptr)
+ let p: *const [u8; 1] = lsz as *const [u8; 1];
+ assert_eq!(p as usize, lsz);
+
+ // ptr-ptr-cast (thin ptr)
+ let w: *const () = p as *const ();
+ assert_eq!(w as usize, lsz);
+
+ // ptr-ptr-cast (fat->thin)
+ let u: *const [u8] = unsafe{&*p};
+ assert_eq!(u as *const u8, p as *const u8);
+ assert_eq!(u as *const u16, p as *const u16);
+
+ // ptr-ptr-cast (Length vtables)
+ let mut l : [u8; 2] = [0,1];
+ let w: *mut [u16; 2] = &mut l as *mut [u8; 2] as *mut _;
+ let w: *mut [u16] = unsafe {&mut *w};
+ let w_u8 : *const [u8] = w as *const [u8];
+ assert_eq!(unsafe{&*w_u8}, &l);
+
+ let s: *mut str = w as *mut str;
+ let l_via_str = unsafe{&*(s as *const [u8])};
+ assert_eq!(&l, l_via_str);
+
+ // ptr-ptr-cast (Length vtables, check length is preserved)
+ let l: [[u8; 3]; 2] = [[3, 2, 6], [4, 5, 1]];
+ let p: *const [[u8; 3]] = &l;
+ let p: &[[u8; 2]] = unsafe {&*(p as *const [[u8; 2]])};
+ assert_eq!(p, [[3, 2], [6, 4]]);
+
+ // enum-cast
+ assert_eq!(Simple::A as u8, 0);
+ assert_eq!(Simple::B as u8, 1);
+
+ assert_eq!(Valued::H8 as i8, -93);
+ assert_eq!(Valued::H7 as i8, 67);
+ assert_eq!(Valued::Z as i8, 0);
+
+ assert_eq!(Valued::H8 as u8, 163);
+ assert_eq!(Valued::H7 as u8, 67);
+ assert_eq!(Valued::Z as u8, 0);
+
+ assert_eq!(Valued::H8 as u16, 163);
+ assert_eq!(Valued::Z as u16, 0);
+ assert_eq!(Valued::H8 as u16, 163);
+ assert_eq!(Valued::Z as u16, 0);
+
+ assert_eq!(ValuedSigned::M1 as u16, 65535);
+ assert_eq!(ValuedSigned::M1 as i16, -1);
+ assert_eq!(ValuedSigned::P1 as u16, 1);
+ assert_eq!(ValuedSigned::P1 as i16, 1);
+
+ // prim-int-cast
+ assert_eq!(false as u16, 0);
+ assert_eq!(true as u16, 1);
+ assert_eq!(false as i64, 0);
+ assert_eq!(true as i64, 1);
+ assert_eq!('a' as u32, 0x61);
+ assert_eq!('a' as u16, 0x61);
+ assert_eq!('a' as u8, 0x61);
+ assert_eq!('א' as u8, 0xd0);
+ assert_eq!('א' as u16, 0x5d0);
+ assert_eq!('א' as u32, 0x5d0);
+ assert_eq!('🐵' as u8, 0x35);
+ assert_eq!('🐵' as u16, 0xf435);
+ assert_eq!('🐵' as u32, 0x1f435);
+ assert_eq!('英' as i16, -0x7d0f);
+ assert_eq!('英' as u16, 0x82f1);
+
+ // u8-char-cast
+ assert_eq!(0x61 as char, 'a');
+ assert_eq!(0u8 as char, '\0');
+ assert_eq!(0xd7 as char, '×');
+
+ // array-ptr-cast
+ let x = [1,2,3];
+ let first : *const u32 = &x[0];
+
+ assert_eq!(first, &x as *const _);
+ assert_eq!(first, &x as *const u32);
+
+ // fptr-addr-cast
+ fn foo() {
+ println!("foo!");
+ }
+ fn bar() {
+ println!("bar!");
+ }
+
+ assert!(foo as usize != bar as usize);
+
+ // Taking a few bits of a function's address is totally pointless and we detect that
+ // Disabling the lint to ensure that the assertion can still be run
+ #[allow(const_err)]
+ {
+ assert_eq!(foo as i16, foo as usize as i16);
+ }
+
+ // fptr-ptr-cast
+
+ assert_eq!(foo as *const u8 as usize, foo as usize);
+ assert!(foo as *const u32 != first);
+}
+fn foo() { }