| 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() {} |