Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set tainted errors bit before emitting coerce suggestions. #100261

Merged
merged 2 commits into from
Aug 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions compiler/rustc_typeck/src/check/coercion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1479,6 +1479,10 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
}
}
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 {
// In the case where this is a "forced unit", like
// `break`, we want to call the `()` "expected"
Expand Down
30 changes: 30 additions & 0 deletions src/test/ui/typeck/issue-100246.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 13 additions & 0 deletions src/test/ui/typeck/issue-100246.stderr
Original file line number Diff line number Diff line change
@@ -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`.