Skip to content

Commit

Permalink
Only prevent field projections into opaque types, not types containin…
Browse files Browse the repository at this point in the history
…g opaque types

(cherry picked from commit 17b313f)
  • Loading branch information
oli-obk authored and cuviper committed Sep 29, 2023
1 parent 975e63f commit 4620e74
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/rustc_hir_typeck/src/mem_categorization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
// Opaque types can't have field projections, but we can instead convert
// the current place in-place (heh) to the hidden type, and then apply all
// follow up projections on that.
if node_ty != place_ty && place_ty.has_opaque_types() {
if node_ty != place_ty && matches!(place_ty.kind(), ty::Alias(ty::Opaque, ..)) {
projections.push(Projection { kind: ProjectionKind::OpaqueCast, ty: node_ty });
}
projections.push(Projection { kind, ty });
Expand Down
27 changes: 27 additions & 0 deletions tests/ui/impl-trait/opaque-cast-field-access-in-future.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// edition: 2021

use std::future::Future;

async fn bop() {
fold(run(), |mut foo| async move {
&mut foo.bar;
})
}

fn fold<Fut, F, U>(_: Foo<U>, f: F)
where
F: FnMut(Foo<U>) -> Fut,
{
loop {}
}

struct Foo<F> {
bar: Vec<F>,
}

fn run() -> Foo<impl Future<Output = ()>> {
//~^ ERROR type annotations needed
loop {}
}

fn main() {}
9 changes: 9 additions & 0 deletions tests/ui/impl-trait/opaque-cast-field-access-in-future.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0282]: type annotations needed
--> $DIR/opaque-cast-field-access-in-future.rs:22:17
|
LL | fn run() -> Foo<impl Future<Output = ()>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type

error: aborting due to previous error

For more information about this error, try `rustc --explain E0282`.

0 comments on commit 4620e74

Please sign in to comment.