Skip to content

Commit

Permalink
Rollup merge of #103355 - compiler-errors:rpitit-default-check, r=oli…
Browse files Browse the repository at this point in the history
…-obk

Handle return-position `impl Trait` in traits properly in `register_hidden_type`

The bounds that we get by calling `bound_explicit_item_bounds` from an RPITIT have projections, not opaques, but when we're *registering* an opaque, we want to treat it like an opaque.

Coincidentally fixes #102688 as well, which makes sense, since that was failing because we were inferring an opaque type to be equal to itself (opaque cycle error => "cannot resolve opaque type").

Fixes #103352

r? ```@oli-obk```
  • Loading branch information
matthiaskrgr committed Oct 23, 2022
2 parents b656f5e + 419fde7 commit ff689a1
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 14 deletions.
14 changes: 13 additions & 1 deletion compiler/rustc_infer/src/infer/opaque_types.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::errors::OpaqueHiddenTypeDiag;
use crate::infer::{DefiningAnchor, InferCtxt, InferOk};
use crate::traits;
use hir::def::DefKind;
use hir::def_id::{DefId, LocalDefId};
use hir::{HirId, OpaqueTyOrigin};
use rustc_data_structures::sync::Lrc;
Expand Down Expand Up @@ -549,7 +550,12 @@ impl<'tcx> InferCtxt<'tcx> {
ty_op: |ty| match *ty.kind() {
// We can't normalize associated types from `rustc_infer`,
// but we can eagerly register inference variables for them.
ty::Projection(projection_ty) if !projection_ty.has_escaping_bound_vars() => {
// FIXME(RPITIT): Don't replace RPITITs with inference vars.
ty::Projection(projection_ty)
if !projection_ty.has_escaping_bound_vars()
&& tcx.def_kind(projection_ty.item_def_id)
!= DefKind::ImplTraitPlaceholder =>
{
self.infer_projection(
param_env,
projection_ty,
Expand All @@ -565,6 +571,12 @@ impl<'tcx> InferCtxt<'tcx> {
{
hidden_ty
}
// FIXME(RPITIT): This can go away when we move to associated types
ty::Projection(proj)
if def_id.to_def_id() == proj.item_def_id && substs == proj.substs =>
{
hidden_ty
}
_ => ty,
},
lt_op: |lt| lt,
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/impl-trait/in-trait/default-body-type-err-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// edition:2021

#![allow(incomplete_features)]
#![feature(async_fn_in_trait)]

pub trait Foo {
async fn woopsie_async(&self) -> String {
42
//~^ ERROR mismatched types
}
}

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/impl-trait/in-trait/default-body-type-err-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0308]: mismatched types
--> $DIR/default-body-type-err-2.rs:8:9
|
LL | 42
| ^^- help: try using a conversion method: `.to_string()`
| |
| expected struct `String`, found integer

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
13 changes: 13 additions & 0 deletions src/test/ui/impl-trait/in-trait/default-body-type-err.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#![allow(incomplete_features)]
#![feature(return_position_impl_trait_in_trait)]

use std::ops::Deref;

pub trait Foo {
fn lol(&self) -> impl Deref<Target = String> {
//~^ type mismatch resolving `<&i32 as Deref>::Target == String`
&1i32
}
}

fn main() {}
12 changes: 12 additions & 0 deletions src/test/ui/impl-trait/in-trait/default-body-type-err.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
error[E0271]: type mismatch resolving `<&i32 as Deref>::Target == String`
--> $DIR/default-body-type-err.rs:7:22
|
LL | fn lol(&self) -> impl Deref<Target = String> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `String`
LL |
LL | &1i32
| ----- return type was inferred to be `&i32` here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0271`.
2 changes: 1 addition & 1 deletion src/test/ui/impl-trait/in-trait/default-body-with-rpit.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// known-bug: #102688
// check-pass
// edition:2021

#![feature(async_fn_in_trait, return_position_impl_trait_in_trait)]
Expand Down
12 changes: 0 additions & 12 deletions src/test/ui/impl-trait/in-trait/default-body-with-rpit.stderr

This file was deleted.

0 comments on commit ff689a1

Please sign in to comment.