about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_feature/src/unstable.rs2
-rw-r--r--compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs6
-rw-r--r--tests/ui/type/pattern_types/unimplemented_pat.rs15
-rw-r--r--tests/ui/type/pattern_types/unimplemented_pat.stderr23
4 files changed, 44 insertions, 2 deletions
diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs
index 129ce1d3109..e6b19817de3 100644
--- a/compiler/rustc_feature/src/unstable.rs
+++ b/compiler/rustc_feature/src/unstable.rs
@@ -216,7 +216,7 @@ declare_features! (
     /// Set the maximum pattern complexity allowed (not limited by default).
     (internal, pattern_complexity, "1.78.0", None),
     /// Allows using pattern types.
-    (internal, pattern_types, "CURRENT_RUSTC_VERSION", Some(54882)),
+    (internal, pattern_types, "CURRENT_RUSTC_VERSION", Some(123646)),
     /// Allows using `#[prelude_import]` on glob `use` items.
     (internal, prelude_import, "1.2.0", None),
     /// Used to identify crates that contain the profiler runtime.
diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
index ebfccd27d17..59f0fac5aa7 100644
--- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
+++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
@@ -2249,7 +2249,11 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
                         Ty::new_pat(tcx, ty, pat)
                     }
                     hir::PatKind::Err(e) => Ty::new_error(tcx, e),
-                    _ => span_bug!(pat.span, "unsupported pattern for pattern type: {pat:#?}"),
+                    _ => Ty::new_error_with_message(
+                        tcx,
+                        pat.span,
+                        format!("unsupported pattern for pattern type: {pat:#?}"),
+                    ),
                 };
                 self.record_ty(pat.hir_id, ty, pat.span);
                 pat_ty
diff --git a/tests/ui/type/pattern_types/unimplemented_pat.rs b/tests/ui/type/pattern_types/unimplemented_pat.rs
new file mode 100644
index 00000000000..c02160ff58a
--- /dev/null
+++ b/tests/ui/type/pattern_types/unimplemented_pat.rs
@@ -0,0 +1,15 @@
+//! This test ensures we do not ICE for unimplemented
+//! patterns unless the feature gate is enabled.
+
+#![feature(core_pattern_type)]
+#![feature(core_pattern_types)]
+
+use std::pat::pattern_type;
+
+type Always = pattern_type!(Option<u32> is Some(_));
+//~^ ERROR: pattern types are unstable
+
+type Binding = pattern_type!(Option<u32> is x);
+//~^ ERROR: pattern types are unstable
+
+fn main() {}
diff --git a/tests/ui/type/pattern_types/unimplemented_pat.stderr b/tests/ui/type/pattern_types/unimplemented_pat.stderr
new file mode 100644
index 00000000000..481c6017dcc
--- /dev/null
+++ b/tests/ui/type/pattern_types/unimplemented_pat.stderr
@@ -0,0 +1,23 @@
+error[E0658]: pattern types are unstable
+  --> $DIR/unimplemented_pat.rs:9:15
+   |
+LL | type Always = pattern_type!(Option<u32> is Some(_));
+   |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #123646 <https://github.com/rust-lang/rust/issues/123646> for more information
+   = help: add `#![feature(pattern_types)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: pattern types are unstable
+  --> $DIR/unimplemented_pat.rs:12:16
+   |
+LL | type Binding = pattern_type!(Option<u32> is x);
+   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #123646 <https://github.com/rust-lang/rust/issues/123646> for more information
+   = help: add `#![feature(pattern_types)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0658`.