Don't ICE when deducing future output if other errors already occurred
This commit is contained in:
parent
25b706cde3
commit
f1ef930c9d
@ -760,16 +760,22 @@ fn deduce_future_output_from_obligations(&self, body_def_id: LocalDefId) -> Opti
|
||||
get_future_output(obligation.predicate, obligation.cause.span)
|
||||
})?
|
||||
}
|
||||
ty::Alias(ty::Projection, _) => {
|
||||
return Some(Ty::new_error_with_message(
|
||||
self.tcx,
|
||||
closure_span,
|
||||
"this projection should have been projected to an opaque type",
|
||||
));
|
||||
}
|
||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) => self
|
||||
.tcx
|
||||
.explicit_item_bounds(def_id)
|
||||
.iter_instantiated_copied(self.tcx, args)
|
||||
.find_map(|(p, s)| get_future_output(p.as_predicate(), s))?,
|
||||
ty::Error(_) => return Some(ret_ty),
|
||||
_ => span_bug!(
|
||||
closure_span,
|
||||
"async fn coroutine return type not an inference variable: {ret_ty}"
|
||||
),
|
||||
_ => {
|
||||
span_bug!(closure_span, "invalid async fn coroutine return type: {ret_ty:?}")
|
||||
}
|
||||
};
|
||||
|
||||
let output_ty = self.normalize(closure_span, output_ty);
|
||||
|
12
tests/ui/async-await/inference_var_self_argument.rs
Normal file
12
tests/ui/async-await/inference_var_self_argument.rs
Normal file
@ -0,0 +1,12 @@
|
||||
//! This is a regression test for an ICE.
|
||||
// edition: 2021
|
||||
|
||||
trait Foo {
|
||||
async fn foo(self: &dyn Foo) {
|
||||
//~^ ERROR: `Foo` cannot be made into an object
|
||||
//~| ERROR invalid `self` parameter type: &dyn Foo
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
28
tests/ui/async-await/inference_var_self_argument.stderr
Normal file
28
tests/ui/async-await/inference_var_self_argument.stderr
Normal file
@ -0,0 +1,28 @@
|
||||
error[E0038]: the trait `Foo` cannot be made into an object
|
||||
--> $DIR/inference_var_self_argument.rs:5:5
|
||||
|
|
||||
LL | async fn foo(self: &dyn Foo) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||
|
|
||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||
--> $DIR/inference_var_self_argument.rs:5:14
|
||||
|
|
||||
LL | trait Foo {
|
||||
| --- this trait cannot be made into an object...
|
||||
LL | async fn foo(self: &dyn Foo) {
|
||||
| ^^^ ...because method `foo` is `async`
|
||||
= help: consider moving `foo` to another trait
|
||||
|
||||
error[E0307]: invalid `self` parameter type: &dyn Foo
|
||||
--> $DIR/inference_var_self_argument.rs:5:24
|
||||
|
|
||||
LL | async fn foo(self: &dyn Foo) {
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: type of `self` must be `Self` or a type that dereferences to it
|
||||
= help: consider changing to `self`, `&self`, `&mut self`, `self: Box<Self>`, `self: Rc<Self>`, `self: Arc<Self>`, or `self: Pin<P>` (where P is one of the previous types except `Self`)
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0038, E0307.
|
||||
For more information about an error, try `rustc --explain E0038`.
|
17
tests/ui/object-safety/erroneous_signature.rs
Normal file
17
tests/ui/object-safety/erroneous_signature.rs
Normal file
@ -0,0 +1,17 @@
|
||||
trait Foo {
|
||||
fn err(&self) -> MissingType;
|
||||
//~^ ERROR cannot find type `MissingType` in this scope
|
||||
}
|
||||
|
||||
impl Foo for i32 {
|
||||
fn err(&self) -> MissingType {
|
||||
//~^ ERROR cannot find type `MissingType` in this scope
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
fn coerce(x: &i32) -> &dyn Foo {
|
||||
x
|
||||
}
|
||||
|
||||
fn main() {}
|
15
tests/ui/object-safety/erroneous_signature.stderr
Normal file
15
tests/ui/object-safety/erroneous_signature.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error[E0412]: cannot find type `MissingType` in this scope
|
||||
--> $DIR/erroneous_signature.rs:2:22
|
||||
|
|
||||
LL | fn err(&self) -> MissingType;
|
||||
| ^^^^^^^^^^^ not found in this scope
|
||||
|
||||
error[E0412]: cannot find type `MissingType` in this scope
|
||||
--> $DIR/erroneous_signature.rs:7:22
|
||||
|
|
||||
LL | fn err(&self) -> MissingType {
|
||||
| ^^^^^^^^^^^ not found in this scope
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
Loading…
Reference in New Issue
Block a user