File: macros.rs

package info (click to toggle)
rustc-web 1.78.0%2Bdfsg1-2~deb11u3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,245,360 kB
  • sloc: xml: 147,985; javascript: 18,022; sh: 11,083; python: 10,265; ansic: 6,172; cpp: 5,023; asm: 4,390; makefile: 4,269
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);
}