Auto merge of #89576 - tom7980:issue-89275-fix, r=estebank

Prevent error reporting from outputting a recursion error if it finds an ambiguous trait impl during suggestions

Closes #89275

This fixes the compiler reporting a recursion error during another already in progress error by trying to make a conversion method suggestion and encounters ambiguous trait implementations that can convert a the original type into a type that can then be recursively converted into itself via another method in the trait.

Updated OverflowError struct to be an enum so I could differentiate between passes - it's no longer a ZST but I don't think that should be a problem as they only generate when there's an error in compiling code anyway
This commit is contained in:
bors 2021-10-08 11:44:45 +00:00
commit e0aaffd8a4
10 changed files with 82 additions and 18 deletions

View file

@ -0,0 +1,29 @@
#![recursion_limit = "5"] // To reduce noise
//expect mutability error when ambiguous traits are in scope
//and not an overflow error on the span in the main function.
struct Ratio<T>(T);
pub trait Pow {
fn pow(self) -> Self;
}
impl<'a, T> Pow for &'a Ratio<T>
where
&'a T: Pow,
{
fn pow(self) -> Self {
self
}
}
fn downcast<'a, W: ?Sized>() -> &'a W {
todo!()
}
struct Other;
fn main() {
let other: &mut Other = downcast();//~ERROR 28:29: 28:39: mismatched types [E0308]
}

View file

@ -0,0 +1,14 @@
error[E0308]: mismatched types
--> $DIR/issue-89275.rs:28:29
|
LL | let other: &mut Other = downcast();
| ---------- ^^^^^^^^^^ types differ in mutability
| |
| expected due to this
|
= note: expected mutable reference `&mut Other`
found reference `&_`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.