From e304a1f13b456df877cae8ca27bf360b1d0c89fc Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sat, 24 Jun 2023 18:35:22 +0000 Subject: [PATCH] Revert "Structurally resolve correctly in check_pat_lit" This reverts commit 54fb5a48b968b3a329ceeb57226d9ac60f983f04. --- compiler/rustc_hir_typeck/src/pat.rs | 5 +++-- tests/ui/pattern/byte-string-inference.rs | 15 +++++++++++++++ .../ui/traits/new-solver/slice-match-byte-lit.rs | 2 +- .../traits/new-solver/slice-match-byte-lit.stderr | 11 +++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 tests/ui/pattern/byte-string-inference.rs create mode 100644 tests/ui/traits/new-solver/slice-match-byte-lit.stderr diff --git a/compiler/rustc_hir_typeck/src/pat.rs b/compiler/rustc_hir_typeck/src/pat.rs index 2f9871a103a83..5af955d313482 100644 --- a/compiler/rustc_hir_typeck/src/pat.rs +++ b/compiler/rustc_hir_typeck/src/pat.rs @@ -393,8 +393,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // They can denote both statically and dynamically-sized byte arrays. let mut pat_ty = ty; if let hir::ExprKind::Lit(Spanned { node: ast::LitKind::ByteStr(..), .. }) = lt.kind { - if let ty::Ref(_, inner_ty, _) = *self.structurally_resolved_type(span, expected).kind() - && self.structurally_resolved_type(span, inner_ty).is_slice() + let expected = self.structurally_resolved_type(span, expected); + if let ty::Ref(_, inner_ty, _) = expected.kind() + && matches!(inner_ty.kind(), ty::Slice(_)) { let tcx = self.tcx; trace!(?lt.hir_id.local_id, "polymorphic byte string lit"); diff --git a/tests/ui/pattern/byte-string-inference.rs b/tests/ui/pattern/byte-string-inference.rs new file mode 100644 index 0000000000000..b1517de6b6797 --- /dev/null +++ b/tests/ui/pattern/byte-string-inference.rs @@ -0,0 +1,15 @@ +// check-pass + +fn load() -> Option { + todo!() +} + +fn main() { + while let Some(tag) = load() { + match &tag { + b"NAME" => {} + b"DATA" => {} + _ => {} + } + } +} diff --git a/tests/ui/traits/new-solver/slice-match-byte-lit.rs b/tests/ui/traits/new-solver/slice-match-byte-lit.rs index 4f848062595da..5f9c0df645036 100644 --- a/tests/ui/traits/new-solver/slice-match-byte-lit.rs +++ b/tests/ui/traits/new-solver/slice-match-byte-lit.rs @@ -1,5 +1,5 @@ // compile-flags: -Ztrait-solver=next -// check-pass +// known-bug: rust-lang/trait-system-refactor-initiative#38 fn test(s: &[u8]) { match &s[0..3] { diff --git a/tests/ui/traits/new-solver/slice-match-byte-lit.stderr b/tests/ui/traits/new-solver/slice-match-byte-lit.stderr new file mode 100644 index 0000000000000..294e8bc94bed1 --- /dev/null +++ b/tests/ui/traits/new-solver/slice-match-byte-lit.stderr @@ -0,0 +1,11 @@ +error[E0271]: type mismatch resolving `[u8; 3] <: as SliceIndex<[u8]>>::Output` + --> $DIR/slice-match-byte-lit.rs:6:9 + | +LL | match &s[0..3] { + | -------- this expression has type `& as SliceIndex<[u8]>>::Output` +LL | b"uwu" => {} + | ^^^^^^ types differ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0271`.