Document behavior of !
with MbE
This commit is contained in:
parent
8d39ec1825
commit
718a4337ac
49
tests/ui/rfcs/rfc-0000-never_patterns/macros.rs
Normal file
49
tests/ui/rfcs/rfc-0000-never_patterns/macros.rs
Normal file
@ -0,0 +1,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);
|
||||||
|
}
|
@ -68,4 +68,9 @@ fn parse(x: Void) {
|
|||||||
//~^ ERROR top-level or-patterns are not allowed in `let` bindings
|
//~^ ERROR top-level or-patterns are not allowed in `let` bindings
|
||||||
let (Ok(_) | Err(!)) = &res;
|
let (Ok(_) | Err(!)) = &res;
|
||||||
let (Ok(_) | Err(&!)) = res.as_ref();
|
let (Ok(_) | Err(&!)) = res.as_ref();
|
||||||
|
|
||||||
|
let ! = x;
|
||||||
|
let y @ ! = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn foo(!: Void) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user