| struct Foo<const N: usize>; | |
| impl Clone for Foo<1> { | |
| fn clone(&self) -> Self { | |
| Self | |
| } | |
| } | |
| impl Copy for Foo<1> {} | |
| fn unify<const N: usize>(_: &[Foo<N>; 2], _: &[String; N]) {} | |
| fn works_if_inference_side_effects() { | |
| // This will only pass if inference side effects from proving `Foo<?x>: Copy` are | |
| // able to be relied upon by other repeat expressions. | |
| let a /* : [Foo<?x>; 2] */ = [Foo::<_>; 2]; | |
| //~^ ERROR: type annotations needed for `[Foo<_>; 2]` | |
| let b /* : [String; ?x] */ = ["string".to_string(); _]; | |
| unify(&a, &b); | |
| } | |
| fn works_if_fixed_point() { | |
| // This will only pass if the *second* array repeat expr is checked first | |
| // allowing `Foo<?x>: Copy` to infer the array length of the first repeat expr. | |
| let b /* : [String; ?x] */ = ["string".to_string(); _]; | |
| //~^ ERROR: type annotations needed for `[String; _]` | |
| let a /* : [Foo<?x>; 2] */ = [Foo::<_>; 2]; | |
| unify(&a, &b); | |
| } | |
| fn main() {} |