add tests for array/slice const patterns
This commit is contained in:
parent
3779c6b797
commit
7a4d4de8a8
2 changed files with 137 additions and 0 deletions
53
tests/ui/consts/const_in_pattern/arrays-and-slices.rs
Normal file
53
tests/ui/consts/const_in_pattern/arrays-and-slices.rs
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
//! Tests that arrays and slices in constants aren't interchangeable when used as patterns.
|
||||
|
||||
#[derive(PartialEq, Eq)]
|
||||
struct SomeStruct<T: ?Sized>(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() {}
|
||||
84
tests/ui/consts/const_in_pattern/arrays-and-slices.stderr
Normal file
84
tests/ui/consts/const_in_pattern/arrays-and-slices.stderr
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/arrays-and-slices.rs:18:9
|
||||
|
|
||||
LL | const BSTR_SIZED: &'static [u8; 3] = b"012";
|
||||
| ---------------------------------- constant defined here
|
||||
...
|
||||
LL | match BSTR_UNSIZED {
|
||||
| ------------ this expression has type `&[u8]`
|
||||
LL | BSTR_SIZED => {}
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| expected `&[u8]`, found `&[u8; 3]`
|
||||
| `BSTR_SIZED` is interpreted as a constant, not a new binding
|
||||
| help: introduce a new binding instead: `other_bstr_sized`
|
||||
|
|
||||
= note: expected reference `&[u8]`
|
||||
found reference `&'static [u8; 3]`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/arrays-and-slices.rs:23:9
|
||||
|
|
||||
LL | const STRUCT_SIZED: &'static SomeStruct<[u8; 3]> = &SomeStruct(*BSTR_SIZED);
|
||||
| ------------------------------------------------ constant defined here
|
||||
...
|
||||
LL | match STRUCT_UNSIZED {
|
||||
| -------------- this expression has type `&SomeStruct<[u8]>`
|
||||
LL | STRUCT_SIZED => {}
|
||||
| ^^^^^^^^^^^^
|
||||
| |
|
||||
| expected `&SomeStruct<[u8]>`, found `&SomeStruct<[u8; 3]>`
|
||||
| `STRUCT_SIZED` is interpreted as a constant, not a new binding
|
||||
| help: introduce a new binding instead: `other_struct_sized`
|
||||
|
|
||||
= note: expected reference `&SomeStruct<[u8]>`
|
||||
found reference `&'static SomeStruct<[u8; 3]>`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/arrays-and-slices.rs:30:9
|
||||
|
|
||||
LL | const BSTR_SIZED: &'static [u8; 3] = b"012";
|
||||
| ---------------------------------- constant defined here
|
||||
...
|
||||
LL | match BSTR_UNSIZED {
|
||||
| ------------ this expression has type `&[u8]`
|
||||
LL | BSTR_SIZED => {}
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| expected `&[u8]`, found `&[u8; 3]`
|
||||
| `BSTR_SIZED` is interpreted as a constant, not a new binding
|
||||
| help: introduce a new binding instead: `other_bstr_sized`
|
||||
|
|
||||
= note: expected reference `&[u8]`
|
||||
found reference `&'static [u8; 3]`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/arrays-and-slices.rs:37:9
|
||||
|
|
||||
LL | const STRUCT_SIZED: &'static SomeStruct<[u8; 3]> = &SomeStruct(*BSTR_SIZED);
|
||||
| ------------------------------------------------ constant defined here
|
||||
...
|
||||
LL | match STRUCT_UNSIZED {
|
||||
| -------------- this expression has type `&SomeStruct<[u8]>`
|
||||
LL | STRUCT_SIZED => {}
|
||||
| ^^^^^^^^^^^^
|
||||
| |
|
||||
| expected `&SomeStruct<[u8]>`, found `&SomeStruct<[u8; 3]>`
|
||||
| `STRUCT_SIZED` is interpreted as a constant, not a new binding
|
||||
| help: introduce a new binding instead: `other_struct_sized`
|
||||
|
|
||||
= note: expected reference `&SomeStruct<[u8]>`
|
||||
found reference `&'static SomeStruct<[u8; 3]>`
|
||||
|
||||
error: cannot use unsized non-slice type `SomeStruct<[u8]>` in constant patterns
|
||||
--> $DIR/arrays-and-slices.rs:47:9
|
||||
|
|
||||
LL | const STRUCT_UNSIZED: &'static SomeStruct<[u8]> = STRUCT_SIZED;
|
||||
| ----------------------------------------------- constant defined here
|
||||
...
|
||||
LL | STRUCT_UNSIZED => {}
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue