mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-12 20:16:49 +00:00
add more tests
This commit is contained in:
parent
96af415476
commit
e1e755311a
@ -3,8 +3,6 @@ fn main() {
|
||||
[a, .., b, ..] = [0, 1]; //~ ERROR `..` can only be used once per slice pattern
|
||||
[a, a, b] = [1, 2];
|
||||
//~^ ERROR pattern requires 3 elements but array has 2
|
||||
//~| ERROR mismatched types
|
||||
[_] = [1, 2];
|
||||
//~^ ERROR pattern requires 1 element but array has 2
|
||||
//~| ERROR mismatched types
|
||||
}
|
||||
|
@ -6,37 +6,18 @@ LL | [a, .., b, ..] = [0, 1];
|
||||
| |
|
||||
| previously used here
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/slice_destructure_fail.rs:4:5
|
||||
|
|
||||
LL | [a, a, b] = [1, 2];
|
||||
| ^^^^^^^^^ expected an array with a fixed size of 2 elements, found one with 3 elements
|
||||
|
|
||||
= note: expected array `[{integer}; 2]`
|
||||
found array `[_; 3]`
|
||||
|
||||
error[E0527]: pattern requires 3 elements but array has 2
|
||||
--> $DIR/slice_destructure_fail.rs:4:5
|
||||
|
|
||||
LL | [a, a, b] = [1, 2];
|
||||
| ^^^^^^^^^ expected 2 elements
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/slice_destructure_fail.rs:7:5
|
||||
|
|
||||
LL | [_] = [1, 2];
|
||||
| ^^^ expected an array with a fixed size of 2 elements, found one with 1 element
|
||||
|
|
||||
= note: expected array `[{integer}; 2]`
|
||||
found array `[_; 1]`
|
||||
|
||||
error[E0527]: pattern requires 1 element but array has 2
|
||||
--> $DIR/slice_destructure_fail.rs:7:5
|
||||
--> $DIR/slice_destructure_fail.rs:6:5
|
||||
|
|
||||
LL | [_] = [1, 2];
|
||||
| ^^^ expected 2 elements
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0308, E0527.
|
||||
For more information about an error, try `rustc --explain E0308`.
|
||||
For more information about this error, try `rustc --explain E0527`.
|
||||
|
@ -1,25 +0,0 @@
|
||||
// check-pass
|
||||
|
||||
// Test that we infer the expected type of a pattern to an array of the given length.
|
||||
|
||||
#![allow(unused_variables)]
|
||||
struct Zeroes;
|
||||
impl Into<[usize; 2]> for Zeroes {
|
||||
fn into(self) -> [usize; 2] {
|
||||
[0; 2]
|
||||
}
|
||||
}
|
||||
impl Into<[usize; 3]> for Zeroes {
|
||||
fn into(self) -> [usize; 3] {
|
||||
[0; 3]
|
||||
}
|
||||
}
|
||||
impl Into<[usize; 4]> for Zeroes {
|
||||
fn into(self) -> [usize; 4] {
|
||||
[0; 4]
|
||||
}
|
||||
}
|
||||
fn main() {
|
||||
let [a, b, c] = Zeroes.into();
|
||||
let [d, e, f]: [_; 3] = Zeroes.into();
|
||||
}
|
27
tests/ui/pattern/slice-array-infer.rs
Normal file
27
tests/ui/pattern/slice-array-infer.rs
Normal file
@ -0,0 +1,27 @@
|
||||
// check-pass
|
||||
|
||||
#![allow(unused_variables)]
|
||||
#![feature(generic_arg_infer)]
|
||||
|
||||
struct Zeroes;
|
||||
impl Into<&'static [usize; 3]> for Zeroes {
|
||||
fn into(self) -> &'static [usize; 3] {
|
||||
&[0; 3]
|
||||
}
|
||||
}
|
||||
impl Into<[usize; 3]> for Zeroes {
|
||||
fn into(self) -> [usize; 3] {
|
||||
[0; 3]
|
||||
}
|
||||
}
|
||||
fn main() {
|
||||
let [a, b, c] = Zeroes.into();
|
||||
let [d, e, f] = <Zeroes as Into<&'static [usize; 3]>>::into(Zeroes);
|
||||
let &[g, h, i] = Zeroes.into();
|
||||
let [j, k, l]: [usize; _] = Zeroes.into();
|
||||
let [m, n, o]: &[usize; _] = Zeroes.into();
|
||||
|
||||
// check the binding mode of these patterns:
|
||||
let _: &[usize] = &[a, b, c, g, h, i, j, k, l];
|
||||
let _: &[&usize] = &[d, e, f, m, n, o];
|
||||
}
|
62
tests/ui/pattern/slice-patterns-irrefutable.rs
Normal file
62
tests/ui/pattern/slice-patterns-irrefutable.rs
Normal file
@ -0,0 +1,62 @@
|
||||
// Test that we infer the expected type of a pattern to an array of the given length.
|
||||
|
||||
#![allow(unused_variables)]
|
||||
|
||||
use std::array::TryFromSliceError;
|
||||
use std::convert::TryInto;
|
||||
|
||||
struct Zeroes;
|
||||
impl Into<[usize; 2]> for Zeroes {
|
||||
fn into(self) -> [usize; 2] {
|
||||
[0; 2]
|
||||
}
|
||||
}
|
||||
impl Into<[usize; 3]> for Zeroes {
|
||||
fn into(self) -> [usize; 3] {
|
||||
[0; 3]
|
||||
}
|
||||
}
|
||||
impl Into<[usize; 4]> for Zeroes {
|
||||
fn into(self) -> [usize; 4] {
|
||||
[0; 4]
|
||||
}
|
||||
}
|
||||
|
||||
fn zeroes_into() {
|
||||
let [a, b, c] = Zeroes.into();
|
||||
let [d, e, f]: [_; 3] = Zeroes.into();
|
||||
}
|
||||
|
||||
fn array_try_from(x: &[usize]) -> Result<usize, TryFromSliceError> {
|
||||
let [a, b] = x.try_into()?;
|
||||
Ok(a + b)
|
||||
}
|
||||
|
||||
fn default() {
|
||||
let a: i32;
|
||||
let b;
|
||||
[a, b] = Default::default();
|
||||
}
|
||||
|
||||
fn test_nested_array() {
|
||||
let a: [_; 3];
|
||||
let b;
|
||||
//~^ ERROR type annotations needed
|
||||
[a, b] = Default::default();
|
||||
}
|
||||
|
||||
struct Foo<T>([T; 2]);
|
||||
|
||||
impl<T: Default + Copy> Default for Foo<T> {
|
||||
fn default() -> Self {
|
||||
Foo([Default::default(); 2])
|
||||
}
|
||||
}
|
||||
|
||||
fn field_array() {
|
||||
let a: i32;
|
||||
let b;
|
||||
Foo([a, b]) = Default::default();
|
||||
}
|
||||
|
||||
fn main() {}
|
14
tests/ui/pattern/slice-patterns-irrefutable.stderr
Normal file
14
tests/ui/pattern/slice-patterns-irrefutable.stderr
Normal file
@ -0,0 +1,14 @@
|
||||
error[E0282]: type annotations needed for `[_; 3]`
|
||||
--> $DIR/slice-patterns-irrefutable.rs:43:9
|
||||
|
|
||||
LL | let b;
|
||||
| ^
|
||||
|
|
||||
help: consider giving `b` an explicit type, where the placeholders `_` are specified
|
||||
|
|
||||
LL | let b: [_; 3];
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
Loading…
Reference in New Issue
Block a user