Working through method breakage

sequenceDiagram
    participant upstream as upstream,<br/>2015 edition<br/>provides trait `Tr1`<br/>with `foo()` method
    participant crate as crate<br/>calls `t.foo()` where `t`<br/>implements `Tr1`+`Tr2`
    participant stdlib as stdlib<br/>provides trait `Tr2`
    Note over crate: developed against Rust 2018 edition
    Note over crate,stdlib: (no `foo()` method available<br/> on `Tr2` at this time)
    crate ->> upstream: t.foo()
    Note over upstream,crate: (Currently  sole resolution available)
    stdlib ->> stdlib: stdlib adds `Tr2::foo()`,<br/>tagged with current (2021) edition
opt crate edition < method edition
    Note over stdlib, upstream: compiler detects both methods are available,<br/>signals ambiguity warning
    crate ->> upstream: t.foo()
end
    crate ->> crate: crate upgrades to Rust 2021 edition
opt crate edition = method edition
    Note over stdlib, upstream: compiler detects both methods are available,<br/>signals ambiguity warning
    crate ->> upstream: t.foo()
end
    stdlib ->> stdlib: Rust releases 2024 edition
    Note over stdlib: `Tr2::foo` remains tagged with 2021 edition
opt crate edition = *method* edition (still)
    Note over stdlib, upstream: compiler detects both methods are available,<br/>signals ambiguity warning
    crate ->> upstream: t.foo()
end

crate ->> crate: crate attempts upgrade to Rust 2024 edition
    opt crate edition > method edition
    crate --X upstream: t.foo()
    Note over stdlib, upstream: now issues hard ambiguity error<br/>crate dev is forced to resolve ambiguity.
    end
Select a repo