summaryrefslogtreecommitdiffstats
path: root/src/test/ui/half-open-range-patterns/half-open-range-pats-semantics.rs
blob: 6c6ba93196b649357204b574828c9cdb995fd7bf (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// run-pass

// Test half-open range patterns against their expression equivalents
// via `.contains(...)` and make sure the dynamic semantics match.

#![feature(exclusive_range_pattern)]
#![allow(illegal_floating_point_literal_pattern)]
#![allow(unreachable_patterns)]

macro_rules! yes {
    ($scrutinee:expr, $($t:tt)+) => {
        {
            let m = match $scrutinee { $($t)+ => true, _ => false, };
            let c = ($($t)+).contains(&$scrutinee);
            assert_eq!(m, c);
            m
        }
    }
}

fn range_to_inclusive() {
    // `..=X` (`RangeToInclusive`-equivalent):
    //---------------------------------------

    // u8; `..=X`
    assert!(yes!(u8::MIN, ..=u8::MIN));
    assert!(yes!(u8::MIN, ..=5));
    assert!(yes!(5u8, ..=5));
    assert!(!yes!(6u8, ..=5));

    // i16; `..=X`
    assert!(yes!(i16::MIN, ..=i16::MIN));
    assert!(yes!(i16::MIN, ..=0));
    assert!(yes!(i16::MIN, ..=-5));
    assert!(yes!(-5, ..=-5));
    assert!(!yes!(-4, ..=-5));

    // char; `..=X`
    assert!(yes!('\u{0}', ..='\u{0}'));
    assert!(yes!('\u{0}', ..='a'));
    assert!(yes!('a', ..='a'));
    assert!(!yes!('b', ..='a'));

    // f32; `..=X`
    assert!(yes!(f32::NEG_INFINITY, ..=f32::NEG_INFINITY));
    assert!(yes!(f32::NEG_INFINITY, ..=1.0f32));
    assert!(yes!(1.5f32, ..=1.5f32));
    assert!(!yes!(1.6f32, ..=-1.5f32));

    // f64; `..=X`
    assert!(yes!(f64::NEG_INFINITY, ..=f64::NEG_INFINITY));
    assert!(yes!(f64::NEG_INFINITY, ..=1.0f64));
    assert!(yes!(1.5f64, ..=1.5f64));
    assert!(!yes!(1.6f64, ..=-1.5f64));
}

fn range_to() {
    // `..X` (`RangeTo`-equivalent):
    //-----------------------------

    // u8; `..X`
    assert!(yes!(0u8, ..1));
    assert!(yes!(0u8, ..5));
    assert!(!yes!(5u8, ..5));
    assert!(!yes!(6u8, ..5));

    // u8; `..X`
    const NU8: u8 = u8::MIN + 1;
    assert!(yes!(u8::MIN, ..NU8));
    assert!(yes!(0u8, ..5));
    assert!(!yes!(5u8, ..5));
    assert!(!yes!(6u8, ..5));

    // i16; `..X`
    const NI16: i16 = i16::MIN + 1;
    assert!(yes!(i16::MIN, ..NI16));
    assert!(yes!(i16::MIN, ..5));
    assert!(yes!(-6, ..-5));
    assert!(!yes!(-5, ..-5));

    // char; `..X`
    assert!(yes!('\u{0}', ..'\u{1}'));
    assert!(yes!('\u{0}', ..'a'));
    assert!(yes!('a', ..'b'));
    assert!(!yes!('a', ..'a'));
    assert!(!yes!('b', ..'a'));

    // f32; `..X`
    assert!(yes!(f32::NEG_INFINITY, ..1.0f32));
    assert!(!yes!(1.5f32, ..1.5f32));
    const E32: f32 = 1.5f32 + f32::EPSILON;
    assert!(yes!(1.5f32, ..E32));
    assert!(!yes!(1.6f32, ..1.5f32));

    // f64; `..X`
    assert!(yes!(f64::NEG_INFINITY, ..1.0f64));
    assert!(!yes!(1.5f64, ..1.5f64));
    const E64: f64 = 1.5f64 + f64::EPSILON;
    assert!(yes!(1.5f64, ..E64));
    assert!(!yes!(1.6f64, ..1.5f64));
}

fn range_from() {
    // `X..` (`RangeFrom`-equivalent):
    //--------------------------------

    // u8; `X..`
    assert!(yes!(u8::MIN, u8::MIN..));
    assert!(yes!(u8::MAX, u8::MIN..));
    assert!(!yes!(u8::MIN, 1..));
    assert!(!yes!(4, 5..));
    assert!(yes!(5, 5..));
    assert!(yes!(6, 5..));
    assert!(yes!(u8::MAX, u8::MAX..));

    // i16; `X..`
    assert!(yes!(i16::MIN, i16::MIN..));
    assert!(yes!(i16::MAX, i16::MIN..));
    const NI16: i16 = i16::MIN + 1;
    assert!(!yes!(i16::MIN, NI16..));
    assert!(!yes!(-4, 5..));
    assert!(yes!(-4, -4..));
    assert!(yes!(-3, -4..));
    assert!(yes!(i16::MAX, i16::MAX..));

    // char; `X..`
    assert!(yes!('\u{0}', '\u{0}'..));
    assert!(yes!(core::char::MAX, '\u{0}'..));
    assert!(yes!('a', 'a'..));
    assert!(yes!('b', 'a'..));
    assert!(!yes!('a', 'b'..));
    assert!(yes!(core::char::MAX, core::char::MAX..));

    // f32; `X..`
    assert!(yes!(f32::NEG_INFINITY, f32::NEG_INFINITY..));
    assert!(yes!(f32::INFINITY, f32::NEG_INFINITY..));
    assert!(!yes!(f32::NEG_INFINITY, 1.0f32..));
    assert!(yes!(f32::INFINITY, 1.0f32..));
    assert!(!yes!(1.0f32 - f32::EPSILON, 1.0f32..));
    assert!(yes!(1.0f32, 1.0f32..));
    assert!(yes!(f32::INFINITY, 1.0f32..));
    assert!(yes!(f32::INFINITY, f32::INFINITY..));

    // f64; `X..`
    assert!(yes!(f64::NEG_INFINITY, f64::NEG_INFINITY..));
    assert!(yes!(f64::INFINITY, f64::NEG_INFINITY..));
    assert!(!yes!(f64::NEG_INFINITY, 1.0f64..));
    assert!(yes!(f64::INFINITY, 1.0f64..));
    assert!(!yes!(1.0f64 - f64::EPSILON, 1.0f64..));
    assert!(yes!(1.0f64, 1.0f64..));
    assert!(yes!(f64::INFINITY, 1.0f64..));
    assert!(yes!(f64::INFINITY, f64::INFINITY..));
}

fn main() {
    range_to_inclusive();
    range_to();
    range_from();
}