Skip to content

inductive cycles as ambig causes unintended breakage #114

Closed
rust-lang/rust
#137314
@lcnr

Description

@lcnr
trait Trait {
    type Item;
}

fn foo<A: Trait, B: Trait>()
where
    A::Item: Trait<Item = u32>,
    B::Item: Trait<Item = i32>,
{}

this should compile but fails with

error[E0283]: type annotations needed: cannot satisfy `<A as Trait>::Item: Trait`
 --> <source>:7:14
  |
7 |     A::Item: Trait<Item = u32>,
  |              ^^^^^^^^^^^^^^^^^
  |

The underlying issue is trying to prove <A as Trait>::Item: Trait normalizes the self type:

  • normalizes-to(<A as Trait>::Item)
    • candidate A::Item: Trait<Item = u32>
      • alias-relate(A::Item, A)
        • normalizes-to(<A as Trait>::Item) inductive cycle
    • candidate B::Item: Trait<Item = i32>
      • alias-relate(B::Item, A)
        • normalizes-to(<B as Trait>::Item)
          • candidate A::Item: Trait<Item = u32>
            • alias-relate(A::Item, B)
              • normalizes-to(<A as Trait>::Item) inductive cycle
          • candidate B::Item: Trait<Item = i32>
            • alias-relate(B::Item, B)
              • normalizes-to(<B as Trait>::Item) inductive cycle

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

Status

done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions