mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Handle RPITITs properly in register_hidden_type
This commit is contained in:
parent
0940040c04
commit
419fde7a38
@ -1,6 +1,7 @@
|
|||||||
use crate::errors::OpaqueHiddenTypeDiag;
|
use crate::errors::OpaqueHiddenTypeDiag;
|
||||||
use crate::infer::{DefiningAnchor, InferCtxt, InferOk};
|
use crate::infer::{DefiningAnchor, InferCtxt, InferOk};
|
||||||
use crate::traits;
|
use crate::traits;
|
||||||
|
use hir::def::DefKind;
|
||||||
use hir::def_id::{DefId, LocalDefId};
|
use hir::def_id::{DefId, LocalDefId};
|
||||||
use hir::{HirId, OpaqueTyOrigin};
|
use hir::{HirId, OpaqueTyOrigin};
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
@ -552,7 +553,12 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
ty_op: |ty| match *ty.kind() {
|
ty_op: |ty| match *ty.kind() {
|
||||||
// We can't normalize associated types from `rustc_infer`,
|
// We can't normalize associated types from `rustc_infer`,
|
||||||
// but we can eagerly register inference variables for them.
|
// 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(
|
self.infer_projection(
|
||||||
param_env,
|
param_env,
|
||||||
projection_ty,
|
projection_ty,
|
||||||
@ -568,6 +574,12 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
{
|
{
|
||||||
hidden_ty
|
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,
|
_ => ty,
|
||||||
},
|
},
|
||||||
lt_op: |lt| lt,
|
lt_op: |lt| lt,
|
||||||
|
13
src/test/ui/impl-trait/in-trait/default-body-type-err-2.rs
Normal file
13
src/test/ui/impl-trait/in-trait/default-body-type-err-2.rs
Normal file
@ -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() {}
|
@ -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
src/test/ui/impl-trait/in-trait/default-body-type-err.rs
Normal file
13
src/test/ui/impl-trait/in-trait/default-body-type-err.rs
Normal file
@ -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
src/test/ui/impl-trait/in-trait/default-body-type-err.stderr
Normal file
12
src/test/ui/impl-trait/in-trait/default-body-type-err.stderr
Normal file
@ -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`.
|
@ -1,4 +1,4 @@
|
|||||||
// known-bug: #102688
|
// check-pass
|
||||||
// edition:2021
|
// edition:2021
|
||||||
|
|
||||||
#![feature(async_fn_in_trait, return_position_impl_trait_in_trait)]
|
#![feature(async_fn_in_trait, return_position_impl_trait_in_trait)]
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
error[E0720]: cannot resolve opaque type
|
|
||||||
--> $DIR/default-body-with-rpit.rs:10:28
|
|
||||||
|
|
|
||||||
LL | async fn baz(&self) -> impl Debug {
|
|
||||||
| ^^^^^^^^^^ cannot resolve opaque type
|
|
||||||
|
|
|
||||||
= note: these returned values have a concrete "never" type
|
|
||||||
= help: this error will resolve once the item's body returns a concrete type
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0720`.
|
|
Loading…
Reference in New Issue
Block a user