From 718a4337acfd2f28682bfaf9179a9e18bf4040b9 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Fri, 5 Jan 2024 16:44:42 +0100 Subject: [PATCH] Document behavior of `!` with MbE --- .../ui/rfcs/rfc-0000-never_patterns/macros.rs | 49 +++++++++++++++++++ .../ui/rfcs/rfc-0000-never_patterns/parse.rs | 5 ++ 2 files changed, 54 insertions(+) create mode 100644 tests/ui/rfcs/rfc-0000-never_patterns/macros.rs diff --git a/tests/ui/rfcs/rfc-0000-never_patterns/macros.rs b/tests/ui/rfcs/rfc-0000-never_patterns/macros.rs new file mode 100644 index 0000000000000..3c04b4517cb7b --- /dev/null +++ b/tests/ui/rfcs/rfc-0000-never_patterns/macros.rs @@ -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); +} diff --git a/tests/ui/rfcs/rfc-0000-never_patterns/parse.rs b/tests/ui/rfcs/rfc-0000-never_patterns/parse.rs index 1b23e60e0cac7..f254b9c201c1c 100644 --- a/tests/ui/rfcs/rfc-0000-never_patterns/parse.rs +++ b/tests/ui/rfcs/rfc-0000-never_patterns/parse.rs @@ -68,4 +68,9 @@ fn parse(x: Void) { //~^ ERROR top-level or-patterns are not allowed in `let` bindings let (Ok(_) | Err(!)) = &res; let (Ok(_) | Err(&!)) = res.as_ref(); + + let ! = x; + let y @ ! = x; } + +fn foo(!: Void) {}