Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 6623bdf

Browse files
committed
Strip placeholders from hidden types before remapping generic parameter in the hidden type to the generic parameters of the definition of the opaque
1 parent 6e1f7b5 commit 6623bdf

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

compiler/rustc_borrowck/src/region_infer/opaque_types.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,11 @@ impl<'tcx> RegionInferenceContext<'tcx> {
192192
.find(|ur_vid| self.eval_equal(vid, **ur_vid))
193193
.and_then(|ur_vid| self.definitions[*ur_vid].external_name)
194194
.unwrap_or(infcx.tcx.lifetimes.re_erased),
195+
ty::RePlaceholder(_) => ty::Region::new_error_with_message(
196+
infcx.tcx,
197+
concrete_type.span,
198+
"hidden type contains placeholders, we don't support higher kinded opaques yet",
199+
),
195200
_ => region,
196201
});
197202
debug!(?universal_concrete_type);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//! This test used to ICE because, while an error was emitted,
2+
//! we still tried to remap generic params used in the hidden type
3+
//! to the ones of the opaque type definition.
4+
5+
//@ edition: 2021
6+
7+
#![feature(type_alias_impl_trait)]
8+
use std::future::Future;
9+
10+
type FutNothing<'a> = impl 'a + Future<Output = ()>;
11+
//~^ ERROR: unconstrained opaque type
12+
13+
async fn operation(_: &mut ()) -> () {
14+
//~^ ERROR: concrete type differs from previous
15+
call(operation).await
16+
}
17+
18+
async fn call<F>(_f: F)
19+
where
20+
for<'any> F: FnMut(&'any mut ()) -> FutNothing<'any>,
21+
{
22+
//~^ ERROR: expected generic lifetime parameter, found `'any`
23+
}
24+
25+
fn main() {}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
error: unconstrained opaque type
2+
--> $DIR/hkl_forbidden4.rs:10:23
3+
|
4+
LL | type FutNothing<'a> = impl 'a + Future<Output = ()>;
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= note: `FutNothing` must be used in combination with a concrete type within the same module
8+
9+
error: concrete type differs from previous defining opaque type use
10+
--> $DIR/hkl_forbidden4.rs:13:1
11+
|
12+
LL | async fn operation(_: &mut ()) -> () {
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `FutNothing<'_>`, got `{async fn body@$DIR/hkl_forbidden4.rs:13:38: 16:2}`
14+
|
15+
note: previous use here
16+
--> $DIR/hkl_forbidden4.rs:15:5
17+
|
18+
LL | call(operation).await
19+
| ^^^^^^^^^^^^^^^
20+
21+
error[E0792]: expected generic lifetime parameter, found `'any`
22+
--> $DIR/hkl_forbidden4.rs:21:1
23+
|
24+
LL | type FutNothing<'a> = impl 'a + Future<Output = ()>;
25+
| -- this generic parameter must be used with a generic lifetime parameter
26+
...
27+
LL | / {
28+
LL | |
29+
LL | | }
30+
| |_^
31+
32+
error: aborting due to 3 previous errors
33+
34+
For more information about this error, try `rustc --explain E0792`.

0 commit comments

Comments
 (0)