Rollup merge of #103409 - compiler-errors:rpitit-signature-mismatch, r=lcnr
Delay span bug when we can't map lifetimes back in `collect_trait_impl_trait_tys` When a lifetime is late-bound in a trait signature, but early-bound in an impl signature, we already emit an error -- however, we also ICE in `collect_trait_impl_trait_tys`, so just delay a bug here. Fixes #103407
This commit is contained in:
commit
12babb623a
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 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…
Add table
Reference in a new issue