//@ build-pass (FIXME(62277): could be check-pass?) // FIXME(eddyb) shorten the name so windows doesn't choke on it. #![crate_name = "trait_test"] // Regression test related to #56288. Check that a supertrait projection (of // `Output`) that references `Self` is ok if there is another occurrence of // the same supertrait that specifies the projection explicitly, even if // the projection's associated type is not explicitly specified in the object type. // // Note that in order for this to compile, we need the `Self`-referencing projection // to normalize fairly directly to a concrete type, otherwise the trait resolver // will hate us. // // There is a test in `trait-object-with-self-in-projection-output-bad.rs` that // having a normalizing, but `Self`-containing projection does not *by itself* // allow you to avoid writing the projected type (`Output`, in this example) // explicitly. trait ConstI32 { type Out; } impl ConstI32 for T { type Out = i32; } trait Base { type Output; } trait NormalizingHelper: Base::Out> + Base { type Target; } impl Base for u32 { type Output = i32; } impl NormalizingHelper for u32 { type Target = i32; } fn main() { // Make sure this works both with and without the associated type // being specified. let _x: Box> = Box::new(2u32); let _y: Box> = Box::new(2u32); }