//! Tests that arrays and slices in constants aren't interchangeable when used as patterns. #[derive(PartialEq, Eq)] struct SomeStruct(T); const BSTR_SIZED: &'static [u8; 3] = b"012"; const BSTR_UNSIZED: &'static [u8] = BSTR_SIZED; const STRUCT_SIZED: &'static SomeStruct<[u8; 3]> = &SomeStruct(*BSTR_SIZED); const STRUCT_UNSIZED: &'static SomeStruct<[u8]> = STRUCT_SIZED; fn type_mismatches() { // Test that array consts can't be used where a slice pattern is expected. This helps ensure // that `const_to_pat` won't produce irrefutable `thir::PatKind::Array` patterns when matching // on slices, which would result in missing length checks. // See also `tests/ui/match/pattern-deref-miscompile.rs`, which tests that byte string literal // patterns check slices' length appropriately when matching on slices. match BSTR_UNSIZED { BSTR_SIZED => {} //~^ ERROR: mismatched types _ => {} } match STRUCT_UNSIZED { STRUCT_SIZED => {} //~^ ERROR: mismatched types _ => {} } // Test that slice consts can't be used where an array pattern is expected. match BSTR_UNSIZED { BSTR_SIZED => {} //~^ ERROR: mismatched types _ => {} } // If the types matched here, this would still error, since unsized structs aren't permitted in // constant patterns. See the `invalid_patterns` test below. match STRUCT_UNSIZED { STRUCT_SIZED => {} //~^ ERROR: mismatched types _ => {} } } fn invalid_patterns() { // Test that unsized structs containing slices can't be used as patterns. // See `tests/ui/consts/issue-87046.rs` for an example with `str`. match STRUCT_UNSIZED { STRUCT_UNSIZED => {} //~^ ERROR: cannot use unsized non-slice type `SomeStruct<[u8]>` in constant patterns _ => {} } } fn main() {}