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
|
@ -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 ty = tcx.fold_regions(ty, |region, _| {
|
||||
let ty::ReFree(_) = region.kind() else { return region; };
|
||||
let ty::ReEarlyBound(e) = map[®ion.into()].expect_region().kind()
|
||||
else { bug!("expected ReFree to map to ReEarlyBound"); };
|
||||
let Some(ty::ReEarlyBound(e)) = map.get(®ion.into()).map(|r| r.expect_region().kind())
|
||||
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 {
|
||||
def_id: e.def_id,
|
||||
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…
Reference in a new issue