File: macros.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (49 lines) | stat: -rw-r--r-- 1,390 bytes parent folder | download | duplicates (6)
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);
}