Don't ICE when encountering error regions when confirming object method candidate
This commit is contained in:
parent
2ccafed862
commit
8d2c12e554
@ -16,7 +16,8 @@
|
|||||||
use rustc_middle::ty::adjustment::{AllowTwoPhase, AutoBorrow, AutoBorrowMutability};
|
use rustc_middle::ty::adjustment::{AllowTwoPhase, AutoBorrow, AutoBorrowMutability};
|
||||||
use rustc_middle::ty::fold::TypeFoldable;
|
use rustc_middle::ty::fold::TypeFoldable;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TyCtxt, UserArgs, UserType,
|
self, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TyCtxt, TypeVisitableExt, UserArgs,
|
||||||
|
UserType,
|
||||||
};
|
};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
@ -268,6 +269,17 @@ fn fresh_receiver_args(
|
|||||||
|
|
||||||
probe::ObjectPick => {
|
probe::ObjectPick => {
|
||||||
let trait_def_id = pick.item.container_id(self.tcx);
|
let trait_def_id = pick.item.container_id(self.tcx);
|
||||||
|
|
||||||
|
// This shouldn't happen for non-region error kinds, but may occur
|
||||||
|
// when we have error regions. Specifically, since we canonicalize
|
||||||
|
// during method steps, we may successfully deref when we assemble
|
||||||
|
// the pick, but fail to deref when we try to extract the object
|
||||||
|
// type from the pick during confirmation. This is fine, we're basically
|
||||||
|
// already doomed by this point.
|
||||||
|
if self_ty.references_error() {
|
||||||
|
return ty::GenericArgs::extend_with_error(self.tcx, trait_def_id, &[]);
|
||||||
|
}
|
||||||
|
|
||||||
self.extract_existential_trait_ref(self_ty, |this, object_ty, principal| {
|
self.extract_existential_trait_ref(self_ty, |this, object_ty, principal| {
|
||||||
// The object data has no entry for the Self
|
// The object data has no entry for the Self
|
||||||
// Type. For the purposes of this method call, we
|
// Type. For the purposes of this method call, we
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
//@ known-bug: #122914
|
|
||||||
use std::future::Future;
|
|
||||||
use std::pin::Pin;
|
|
||||||
|
|
||||||
impl<'a, F> Poll {
|
|
||||||
fn project<'_>(self: Pin<&'pin mut Future>) -> Projection<'pin, 'a, F> {
|
|
||||||
me.local_set.with(|| {
|
|
||||||
let _ = self.poll(cx);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
11
tests/ui/methods/dont-ice-on-object-lookup-w-error-region.rs
Normal file
11
tests/ui/methods/dont-ice-on-object-lookup-w-error-region.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// Fix for issue: #122914
|
||||||
|
|
||||||
|
use std::future::Future;
|
||||||
|
use std::pin::Pin;
|
||||||
|
|
||||||
|
fn project(x: Pin<&'missing mut dyn Future<Output = ()>>) {
|
||||||
|
//~^ ERROR use of undeclared lifetime name `'missing`
|
||||||
|
let _ = x.poll(todo!());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,11 @@
|
|||||||
|
error[E0261]: use of undeclared lifetime name `'missing`
|
||||||
|
--> $DIR/dont-ice-on-object-lookup-w-error-region.rs:6:20
|
||||||
|
|
|
||||||
|
LL | fn project(x: Pin<&'missing mut dyn Future<Output = ()>>) {
|
||||||
|
| - ^^^^^^^^ undeclared lifetime
|
||||||
|
| |
|
||||||
|
| help: consider introducing lifetime `'missing` here: `<'missing>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0261`.
|
Loading…
Reference in New Issue
Block a user