Delay span bug when we can't map lifetimes back in collect_trait_impl_trait_tys
This commit is contained in:
parent
c07a6a9c0c
commit
fa5cf90b8d
3 changed files with 47 additions and 2 deletions
|
@ -598,8 +598,16 @@ pub fn collect_trait_impl_trait_tys<'tcx>(
|
||||||
let num_impl_substs = tcx.generics_of(impl_m.container_id(tcx)).params.len();
|
let num_impl_substs = tcx.generics_of(impl_m.container_id(tcx)).params.len();
|
||||||
let ty = tcx.fold_regions(ty, |region, _| {
|
let ty = tcx.fold_regions(ty, |region, _| {
|
||||||
let ty::ReFree(_) = region.kind() else { return region; };
|
let ty::ReFree(_) = region.kind() else { return region; };
|
||||||
let ty::ReEarlyBound(e) = map[®ion.into()].expect_region().kind()
|
let Some(ty::ReEarlyBound(e)) = map.get(®ion.into()).map(|r| r.expect_region().kind())
|
||||||
else { bug!("expected ReFree to map to ReEarlyBound"); };
|
else {
|
||||||
|
tcx
|
||||||
|
.sess
|
||||||
|
.delay_span_bug(
|
||||||
|
return_span,
|
||||||
|
"expected ReFree to map to ReEarlyBound"
|
||||||
|
);
|
||||||
|
return tcx.lifetimes.re_static;
|
||||||
|
};
|
||||||
tcx.mk_region(ty::ReEarlyBound(ty::EarlyBoundRegion {
|
tcx.mk_region(ty::ReEarlyBound(ty::EarlyBoundRegion {
|
||||||
def_id: e.def_id,
|
def_id: e.def_id,
|
||||||
name: e.name,
|
name: e.name,
|
||||||
|
|
21
src/test/ui/impl-trait/in-trait/signature-mismatch.rs
Normal file
21
src/test/ui/impl-trait/in-trait/signature-mismatch.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// edition:2021
|
||||||
|
|
||||||
|
#![feature(return_position_impl_trait_in_trait)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
use std::future::Future;
|
||||||
|
|
||||||
|
pub trait AsyncTrait {
|
||||||
|
fn async_fn(&self, buff: &[u8]) -> impl Future<Output = Vec<u8>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Struct;
|
||||||
|
|
||||||
|
impl AsyncTrait for Struct {
|
||||||
|
fn async_fn<'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a {
|
||||||
|
//~^ ERROR `impl` item signature doesn't match `trait` item signature
|
||||||
|
async move { buff.to_vec() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
16
src/test/ui/impl-trait/in-trait/signature-mismatch.stderr
Normal file
16
src/test/ui/impl-trait/in-trait/signature-mismatch.stderr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
error: `impl` item signature doesn't match `trait` item signature
|
||||||
|
--> $DIR/signature-mismatch.rs:15:5
|
||||||
|
|
|
||||||
|
LL | fn async_fn(&self, buff: &[u8]) -> impl Future<Output = Vec<u8>>;
|
||||||
|
| ----------------------------------------------------------------- expected `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + 'static`
|
||||||
|
...
|
||||||
|
LL | fn async_fn<'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '2`
|
||||||
|
|
|
||||||
|
= note: expected `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + 'static`
|
||||||
|
found `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '2`
|
||||||
|
= help: the lifetime requirements from the `impl` do not correspond to the requirements in the `trait`
|
||||||
|
= help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue