summaryrefslogtreecommitdiffstats
path: root/src/test/ui/transmutability/primitives/numbers.rs
blob: 0df43d2045f72aeca46bf958ff981118c849daa3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#![crate_type = "lib"]
#![feature(transmutability)]
#![allow(dead_code)]
#![allow(incomplete_features)]

mod assert {
    use std::mem::BikeshedIntrinsicFrom;
    struct Context;

    pub fn is_transmutable<Src, Dst>()
    where
        Dst: BikeshedIntrinsicFrom<Src, Context>
    {}
}

fn should_accept_identity() {
    assert::is_transmutable::<   i8,    i8>();
    assert::is_transmutable::<   u8,    u8>();
    assert::is_transmutable::<  i16,   i16>();
    assert::is_transmutable::<  u16,   u16>();
    assert::is_transmutable::<  i32,   i32>();
    assert::is_transmutable::<  f32,   f32>();
    assert::is_transmutable::<  u32,   u32>();
    assert::is_transmutable::<  i64,   i64>();
    assert::is_transmutable::<  f64,   f64>();
    assert::is_transmutable::<  u64,   u64>();
    assert::is_transmutable::< i128,  i128>();
    assert::is_transmutable::< u128,  u128>();
    assert::is_transmutable::<isize, isize>();
    assert::is_transmutable::<usize, usize>();
}

fn should_be_bitransmutable() {
    assert::is_transmutable::<   i8,    u8>();
    assert::is_transmutable::<   u8,    i8>();

    assert::is_transmutable::<  i16,   u16>();
    assert::is_transmutable::<  u16,   i16>();

    assert::is_transmutable::<  i32,   f32>();
    assert::is_transmutable::<  i32,   u32>();
    assert::is_transmutable::<  f32,   i32>();
    assert::is_transmutable::<  f32,   u32>();
    assert::is_transmutable::<  u32,   i32>();
    assert::is_transmutable::<  u32,   f32>();

    assert::is_transmutable::<  u64,   i64>();
    assert::is_transmutable::<  u64,   f64>();
    assert::is_transmutable::<  i64,   u64>();
    assert::is_transmutable::<  i64,   f64>();
    assert::is_transmutable::<  f64,   u64>();
    assert::is_transmutable::<  f64,   i64>();

    assert::is_transmutable::< u128,  i128>();
    assert::is_transmutable::< i128,  u128>();

    assert::is_transmutable::<isize, usize>();
    assert::is_transmutable::<usize, isize>();
}

fn should_reject_extension() {
    assert::is_transmutable::<   i8,   i16>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   u16>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   i32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   f32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   u32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   i8,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<   u8,   i16>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   u16>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   i32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   f32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   u32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<   u8,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  i16,   i32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,   f32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,   u32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i16,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  u16,   i32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,   f32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,   u32>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u16,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  i32,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i32,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i32,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i32,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i32,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  f32,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  f32,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  f32,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  f32,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  f32,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  u32,   u64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u32,   i64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u32,   f64>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u32,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u32,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  u64,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  u64,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  i64,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  i64,  i128>(); //~ ERROR cannot be safely transmuted

    assert::is_transmutable::<  f64,  u128>(); //~ ERROR cannot be safely transmuted
    assert::is_transmutable::<  f64,  i128>(); //~ ERROR cannot be safely transmuted
}