Don't ICE when encountering unresolved regions in fully_resolve
This commit is contained in:
parent
e1aa9edde0
commit
ea73f10867
4 changed files with 48 additions and 8 deletions
|
@ -36,7 +36,7 @@ use rustc_middle::ty::{self, GenericParamDefKind, InferConst, InferTy, Ty, TyCtx
|
||||||
use rustc_middle::ty::{ConstVid, EffectVid, FloatVid, IntVid, TyVid};
|
use rustc_middle::ty::{ConstVid, EffectVid, FloatVid, IntVid, TyVid};
|
||||||
use rustc_middle::ty::{GenericArg, GenericArgKind, GenericArgs, GenericArgsRef};
|
use rustc_middle::ty::{GenericArg, GenericArgKind, GenericArgs, GenericArgsRef};
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::Span;
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
|
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -1422,12 +1422,25 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
/// This method is idempotent, but it not typically not invoked
|
/// This method is idempotent, but it not typically not invoked
|
||||||
/// except during the writeback phase.
|
/// except during the writeback phase.
|
||||||
pub fn fully_resolve<T: TypeFoldable<TyCtxt<'tcx>>>(&self, value: T) -> FixupResult<'tcx, T> {
|
pub fn fully_resolve<T: TypeFoldable<TyCtxt<'tcx>>>(&self, value: T) -> FixupResult<'tcx, T> {
|
||||||
let value = resolve::fully_resolve(self, value);
|
match resolve::fully_resolve(self, value) {
|
||||||
assert!(
|
Ok(value) => {
|
||||||
value.as_ref().map_or(true, |value| !value.has_infer()),
|
if value.has_non_region_infer() {
|
||||||
"`{value:?}` is not fully resolved"
|
bug!("`{value:?}` is not fully resolved");
|
||||||
);
|
}
|
||||||
value
|
if value.has_infer_regions() {
|
||||||
|
let guar = self
|
||||||
|
.tcx
|
||||||
|
.sess
|
||||||
|
.delay_span_bug(DUMMY_SP, format!("`{value:?}` is not fully resolved"));
|
||||||
|
Ok(self.tcx.fold_regions(value, |re, _| {
|
||||||
|
if re.is_var() { ty::Region::new_error(self.tcx, guar) } else { re }
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => Err(e),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Instantiates the bound variables in a given binder with fresh inference
|
// Instantiates the bound variables in a given binder with fresh inference
|
||||||
|
|
|
@ -58,7 +58,6 @@ declare_lint! {
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// # #![feature(return_position_impl_trait_in_trait)]
|
|
||||||
/// use core::future::Future;
|
/// use core::future::Future;
|
||||||
/// pub trait Trait {
|
/// pub trait Trait {
|
||||||
/// fn method(&self) -> impl Future<Output = ()> + Send { async {} }
|
/// fn method(&self) -> impl Future<Output = ()> + Send { async {} }
|
||||||
|
|
19
tests/ui/async-await/in-trait/unconstrained-impl-region.rs
Normal file
19
tests/ui/async-await/in-trait/unconstrained-impl-region.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// edition: 2021
|
||||||
|
|
||||||
|
pub(crate) trait Inbox<M> {
|
||||||
|
async fn next(self) -> M;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) trait Actor: Sized {
|
||||||
|
type Message;
|
||||||
|
|
||||||
|
async fn on_mount(self, _: impl Inbox<Self::Message>);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Actor for () {
|
||||||
|
//~^ ERROR the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
|
||||||
|
type Message = &'a ();
|
||||||
|
async fn on_mount(self, _: impl Inbox<&'a ()>) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
|
||||||
|
--> $DIR/unconstrained-impl-region.rs:13:6
|
||||||
|
|
|
||||||
|
LL | impl<'a> Actor for () {
|
||||||
|
| ^^ unconstrained lifetime parameter
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0207`.
|
Loading…
Add table
Add a link
Reference in a new issue