Description
edit: after rust-lang/rust#119106 this only affects higher ranked aliases and should not be an issue in practice
fn needs_iter(_: impl Iterator<Item = i32>) {}
fn main() {
needs_iter(IntoIterator::into_iter([0i32; 32]))
}
Bails out with two ambiguous candidates:
Candidate { source: Impl(DefId(2:3663 ~ core[523c]::array::iter::{impl#2})), result: Canonical { value: Response { certainty: Yes, var_values: CanonicalVarValues { var_values: [i32] }, external_constraints: ExternalConstraints(Interned(ExternalConstraintsData { region_constraints: QueryRegionConstraints { outlives: [], member_constraints: [] }, opaque_types: [] }, PrivateZst)) }, max_universe: U0, variables: [] } },
Candidate { source: AliasBound, result: Canonical { value: Response { certainty: Yes, var_values: CanonicalVarValues { var_values: [<[i32; 32] as std::iter::IntoIterator>::Item] }, external_constraints: ExternalConstraints(Interned(ExternalConstraintsData { region_constraints: QueryRegionConstraints { outlives: [], member_constraints: [] }, opaque_types: [] }, PrivateZst)) }, max_universe: U0, variables: [] } }]
That is, we have that <[i32; 32] as IntoIterator>::Item
normalizes to either i32
or <[i32; 32] as std::iter::IntoIterator>::Item
via an impl or alias bound, respectively.