summaryrefslogtreecommitdiffstats
path: root/tests/ui/pattern/never_patterns.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
commit9918693037dce8aa4bb6f08741b6812923486c18 (patch)
tree21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /tests/ui/pattern/never_patterns.rs
parentReleasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff)
downloadrustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz
rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/pattern/never_patterns.rs')
-rw-r--r--tests/ui/pattern/never_patterns.rs99
1 files changed, 99 insertions, 0 deletions
diff --git a/tests/ui/pattern/never_patterns.rs b/tests/ui/pattern/never_patterns.rs
new file mode 100644
index 000000000..915f3e75e
--- /dev/null
+++ b/tests/ui/pattern/never_patterns.rs
@@ -0,0 +1,99 @@
+#![feature(never_patterns)]
+#![allow(incomplete_features)]
+
+enum Void {}
+
+fn main() {}
+
+// The classic use for empty types.
+fn safe_unwrap_result<T>(res: Result<T, Void>) {
+ let Ok(_x) = res;
+ // FIXME(never_patterns): These should be allowed
+ let (Ok(_x) | Err(!)) = &res;
+ //~^ ERROR: is not bound in all patterns
+ let (Ok(_x) | Err(&!)) = res.as_ref();
+ //~^ ERROR: is not bound in all patterns
+}
+
+// Check we only accept `!` where we want to.
+fn never_pattern_location(void: Void) {
+ // FIXME(never_patterns): Don't accept on a non-empty type.
+ match Some(0) {
+ None => {}
+ Some(!),
+ }
+ // FIXME(never_patterns): Don't accept on an arbitrary type, even if there are no more branches.
+ match () {
+ () => {}
+ !,
+ }
+ // FIXME(never_patterns): Don't accept even on an empty branch.
+ match None::<Void> {
+ None => {}
+ !,
+ }
+ // FIXME(never_patterns): Let alone if the emptiness is behind a reference.
+ match None::<&Void> {
+ None => {}
+ !,
+ }
+ // Participate in match ergonomics.
+ match &void {
+ !
+ }
+ match &&void {
+ !
+ }
+ match &&void {
+ &!
+ }
+ match &None::<Void> {
+ None => {}
+ Some(!)
+ }
+ match None::<&Void> {
+ None => {}
+ Some(!),
+ }
+ // Accept on a composite empty type.
+ match None::<&(u32, Void)> {
+ None => {}
+ Some(&!),
+ }
+ // Accept on an simple empty type.
+ match None::<Void> {
+ None => {}
+ Some(!),
+ }
+ match None::<&Void> {
+ None => {}
+ Some(&!),
+ }
+ match None::<&(u32, Void)> {
+ None => {}
+ Some(&(_, !)),
+ }
+}
+
+fn never_and_bindings() {
+ let x: Result<bool, &(u32, Void)> = Ok(false);
+
+ // FIXME(never_patterns): Never patterns in or-patterns don't need to share the same bindings.
+ match x {
+ Ok(_x) | Err(&!) => {}
+ //~^ ERROR: is not bound in all patterns
+ }
+ let (Ok(_x) | Err(&!)) = x;
+ //~^ ERROR: is not bound in all patterns
+
+ // FIXME(never_patterns): A never pattern mustn't have bindings.
+ match x {
+ Ok(_) => {}
+ Err(&(_b, !)),
+ }
+ match x {
+ Ok(_a) | Err(&(_b, !)) => {}
+ //~^ ERROR: is not bound in all patterns
+ //~| ERROR: is not bound in all patterns
+ }
+}