rust-lang / trait-system-refactor-initiative

The Rustc Trait System Refactor Initiative
21 stars 0 forks source link

using impl candidates shadowed by where-bound overflows by using impl with only super trait bounds #76

Open lcnr opened 11 months ago

lcnr commented 11 months ago

https://rust.godbolt.org/z/8fzsP4MbE

trait Super {
    type SuperAssoc;
}

trait Trait: Super<SuperAssoc = Self::TraitAssoc> {
    type TraitAssoc;
}

impl<T, U> Trait for T
where
    T: Super<SuperAssoc = U>,
{
    type TraitAssoc = U;
}

fn overflow<T: Trait>() {
    let x: <T as Trait>::TraitAssoc;
}

normalizing <T as Trait>::TraitAssoc in the elaborated environment [T: Trait, T: Super, <T as Super>::SuperAssoc = <T as Trait>::TraitAssoc] has a single impl candidate, which uses the environment to normalize <T as Trait>::TraitAssoc to itself :3

lcnr commented 9 months ago

NOTE TO SELF: shadowing impl candidates if there's a trait candidate in teh param env causes issues with inlining/adding additional bounds to the environment

lcnr commented 1 month ago

test from #83

pub fn choice<I>(iter: I) -> Option<I::Item>
where
    I: IntoIterator,
    I::IntoIter: Iterator,
{
    todo!()
}