Rollup merge of #140632 - Skgland:test-for-issue-81317, r=oli-obk
add a test for issue rust-lang/rust#81317 closes rust-lang/rust#81317
This commit is contained in:
commit
3501842edb
2 changed files with 88 additions and 0 deletions
71
tests/ui/type-inference/regression-issue-81317.rs
Normal file
71
tests/ui/type-inference/regression-issue-81317.rs
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
// 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>, S as BitXor<&'a S> } for xor and
|
||||
// { T::I as Into<u64>, T::I as Into<S> } for index.into()
|
||||
// previously inference was able to infer that the only valid combination was
|
||||
// S as BitXor<S> and T::I as Into<S>
|
||||
//
|
||||
// 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 `<S as BitXor<_>>::Output == _`
|
||||
// help: try using a fully qualified path to specify the expected types
|
||||
// |
|
||||
// 44 - let iv = S ^ index.into();
|
||||
// 44 + let iv = S ^ <<T as P>::I as Into<T>>::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<u64> + Into<S>;
|
||||
}
|
||||
|
||||
pub fn decrypt_portion<T: P>(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() {}
|
||||
17
tests/ui/type-inference/regression-issue-81317.stderr
Normal file
17
tests/ui/type-inference/regression-issue-81317.stderr
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
error[E0282]: type annotations needed
|
||||
--> $DIR/regression-issue-81317.rs:44:9
|
||||
|
|
||||
LL | let iv = S ^ index.into();
|
||||
| ^^
|
||||
LL |
|
||||
LL | &iv.to_bytes_be();
|
||||
| -- type must be known at this point
|
||||
|
|
||||
help: consider giving `iv` an explicit type
|
||||
|
|
||||
LL | let iv: /* Type */ = S ^ index.into();
|
||||
| ++++++++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue