// Regression test for #81317: type can no longer be infered as of 1.49 // // The problem is that the xor operator and the index.into() call // each have two candidate impls that could apply // { S as BitXor, S as BitXor<&'a S> } for xor and // { T::I as Into, T::I as Into } for index.into() // previously inference was able to infer that the only valid combination was // S as BitXor and T::I as Into // // after rust-lang/rust#73905 this is no longer infered // // the error message could be better e.g. // when iv is unused or has an an explicitly specified type S // there is currently the following help message // // error[E0284]: type annotations needed // --> src/main.rs:13:24 // | // 44 | let iv = S ^ index.into(); // | - ^^^^ // | | // | type must be known at this point // | // = note: cannot satisfy `>::Output == _` // help: try using a fully qualified path to specify the expected types // | // 44 - let iv = S ^ index.into(); // 44 + let iv = S ^ <::I as Into>::into(index); // // this is better as it's actually sufficent to fix the problem, // while just specifying the type of iv as currently suggested is insufficent // //@ check-fail use std::ops::BitXor; pub struct S; pub trait P { type I: Into + Into; } pub fn decrypt_portion(index: T::I) { let iv = S ^ index.into(); //~^ ERROR type annotations needed &iv.to_bytes_be(); } impl S { fn to_bytes_be(&self) -> &[u8] { &[] } } impl BitXor for S { type Output = S; fn bitxor(self, _rhs: Self) -> Self::Output { S } } impl<'a> BitXor<&'a S> for S { type Output = S; fn bitxor(self, _rhs: &'a S) -> Self::Output { S } } fn main() {}