about summary refs log tree commit diff
path: root/tests/ui/rfcs/rfc-0000-never_patterns/macros.rs
blob: 27d113c18a3d68548992a17fd93a0fb56d8741e7 (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
//@ check-pass
//@ revisions: e2018 e2021
//@[e2018] edition:2018
//@[e2021] edition:2021
#![feature(never_patterns)]
#![allow(incomplete_features)]

#[derive(Debug, PartialEq, Eq)]
struct Pattern;
#[derive(Debug, PartialEq, Eq)]
struct Never;
#[derive(Debug, PartialEq, Eq)]
struct Other;

macro_rules! detect_pat {
    ($p:pat) => {
        Pattern
    };
    (!) => {
        Never
    };
    ($($x:tt)*) => {
        Other
    };
}

// For backwards-compatibility, all the cases that parse as `Pattern` under the feature gate must
// have been parse errors before.
fn main() {
    // For backwards compatibility this does not match `$p:pat`.
    assert_eq!(detect_pat!(!), Never);

    // Edition 2018 parses both of these cases as `Other`. Both editions have been parsing the
    // first case as `Other` before, so we mustn't change that.
    assert_eq!(detect_pat!(! | true), Other);
    #[cfg(e2018)]
    assert_eq!(detect_pat!(true | !), Other);
    #[cfg(e2021)]
    assert_eq!(detect_pat!(true | !), Pattern);

    // These are never patterns; they take no body when they're in a match arm.
    assert_eq!(detect_pat!((!)), Pattern);
    assert_eq!(detect_pat!((true, !)), Pattern);
    assert_eq!(detect_pat!(Some(!)), Pattern);

    // These count as normal patterns.
    assert_eq!(detect_pat!((! | true)), Pattern);
    assert_eq!(detect_pat!((Ok(x) | Err(&!))), Pattern);
}