Skip to content

Ambiguity for projection candidates that aren't equal, but *are* equal modulo normalization #4

@compiler-errors

Description

@compiler-errors

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions