diff options
| author | bors <bors@rust-lang.org> | 2021-10-08 11:44:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-10-08 11:44:45 +0000 |
| commit | e0aaffd8a45cd0e9f331ec7734713e9de11aa6c8 (patch) | |
| tree | 11385f103f96e0bcc09ccf85b4b77e7351fd87d1 /src/test/ui | |
| parent | 44995f7afb18775913618ae50601be31b9f9dead (diff) | |
| parent | 0950d5afe227c7097e59bf797a85267d3a659744 (diff) | |
| download | rust-e0aaffd8a45cd0e9f331ec7734713e9de11aa6c8.tar.gz rust-e0aaffd8a45cd0e9f331ec7734713e9de11aa6c8.zip | |
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
Diffstat (limited to 'src/test/ui')
| -rw-r--r-- | src/test/ui/typeck/issue-89275.rs | 29 | ||||
| -rw-r--r-- | src/test/ui/typeck/issue-89275.stderr | 14 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/test/ui/typeck/issue-89275.rs b/src/test/ui/typeck/issue-89275.rs new file mode 100644 index 00000000000..b91c0017548 --- /dev/null +++ b/src/test/ui/typeck/issue-89275.rs @@ -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] +} diff --git a/src/test/ui/typeck/issue-89275.stderr b/src/test/ui/typeck/issue-89275.stderr new file mode 100644 index 00000000000..d73e647d21f --- /dev/null +++ b/src/test/ui/typeck/issue-89275.stderr @@ -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`. |
