mirror of https://github.com/rust-lang/rust.git
Strip placeholders from hidden types before remapping generic parameter in the hidden type to the generic parameters of the definition of the opaque
This commit is contained in:
parent
6e1f7b538a
commit
6623bdf68b
|
@ -192,6 +192,11 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
.find(|ur_vid| self.eval_equal(vid, **ur_vid))
|
||||
.and_then(|ur_vid| self.definitions[*ur_vid].external_name)
|
||||
.unwrap_or(infcx.tcx.lifetimes.re_erased),
|
||||
ty::RePlaceholder(_) => ty::Region::new_error_with_message(
|
||||
infcx.tcx,
|
||||
concrete_type.span,
|
||||
"hidden type contains placeholders, we don't support higher kinded opaques yet",
|
||||
),
|
||||
_ => region,
|
||||
});
|
||||
debug!(?universal_concrete_type);
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
//! This test used to ICE because, while an error was emitted,
|
||||
//! we still tried to remap generic params used in the hidden type
|
||||
//! to the ones of the opaque type definition.
|
||||
|
||||
//@ edition: 2021
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
use std::future::Future;
|
||||
|
||||
type FutNothing<'a> = impl 'a + Future<Output = ()>;
|
||||
//~^ ERROR: unconstrained opaque type
|
||||
|
||||
async fn operation(_: &mut ()) -> () {
|
||||
//~^ ERROR: concrete type differs from previous
|
||||
call(operation).await
|
||||
}
|
||||
|
||||
async fn call<F>(_f: F)
|
||||
where
|
||||
for<'any> F: FnMut(&'any mut ()) -> FutNothing<'any>,
|
||||
{
|
||||
//~^ ERROR: expected generic lifetime parameter, found `'any`
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,34 @@
|
|||
error: unconstrained opaque type
|
||||
--> $DIR/hkl_forbidden4.rs:10:23
|
||||
|
|
||||
LL | type FutNothing<'a> = impl 'a + Future<Output = ()>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `FutNothing` must be used in combination with a concrete type within the same module
|
||||
|
||||
error: concrete type differs from previous defining opaque type use
|
||||
--> $DIR/hkl_forbidden4.rs:13:1
|
||||
|
|
||||
LL | async fn operation(_: &mut ()) -> () {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `FutNothing<'_>`, got `{async fn body@$DIR/hkl_forbidden4.rs:13:38: 16:2}`
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/hkl_forbidden4.rs:15:5
|
||||
|
|
||||
LL | call(operation).await
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0792]: expected generic lifetime parameter, found `'any`
|
||||
--> $DIR/hkl_forbidden4.rs:21:1
|
||||
|
|
||||
LL | type FutNothing<'a> = impl 'a + Future<Output = ()>;
|
||||
| -- this generic parameter must be used with a generic lifetime parameter
|
||||
...
|
||||
LL | / {
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0792`.
|
Loading…
Reference in New Issue