Rollup merge of #100261 - luqmana:suggestions-overflow, r=lcnr
Set tainted errors bit before emitting coerce suggestions. Fixes #100246. #89576 basically got 99% of the way there but the match typechecking code (which calls `coerce_inner`) also needed a similar fix.
This commit is contained in:
commit
2be32e8e9b
3 changed files with 47 additions and 0 deletions
|
@ -1479,6 +1479,10 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(coercion_error) => {
|
Err(coercion_error) => {
|
||||||
|
// Mark that we've failed to coerce the types here to suppress
|
||||||
|
// any superfluous errors we might encounter while trying to
|
||||||
|
// emit or provide suggestions on how to fix the initial error.
|
||||||
|
fcx.set_tainted_by_errors();
|
||||||
let (expected, found) = if label_expression_as_expected {
|
let (expected, found) = if label_expression_as_expected {
|
||||||
// In the case where this is a "forced unit", like
|
// In the case where this is a "forced unit", like
|
||||||
// `break`, we want to call the `()` "expected"
|
// `break`, we want to call the `()` "expected"
|
||||||
|
|
30
src/test/ui/typeck/issue-100246.rs
Normal file
30
src/test/ui/typeck/issue-100246.rs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#![recursion_limit = "5"] // To reduce noise
|
||||||
|
|
||||||
|
//expect incompatible type 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>() -> std::io::Result<&'a W> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Other;
|
||||||
|
|
||||||
|
fn main() -> std::io::Result<()> {
|
||||||
|
let other: Other = downcast()?;//~ERROR 28:24: 28:35: `?` operator has incompatible types
|
||||||
|
Ok(())
|
||||||
|
}
|
13
src/test/ui/typeck/issue-100246.stderr
Normal file
13
src/test/ui/typeck/issue-100246.stderr
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
error[E0308]: `?` operator has incompatible types
|
||||||
|
--> $DIR/issue-100246.rs:28:24
|
||||||
|
|
|
||||||
|
LL | let other: Other = downcast()?;
|
||||||
|
| ^^^^^^^^^^^ expected struct `Other`, found reference
|
||||||
|
|
|
||||||
|
= note: `?` operator cannot convert from `&_` to `Other`
|
||||||
|
= note: expected struct `Other`
|
||||||
|
found reference `&_`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue