// Regression test for #74429, where we didn't think that a type parameter // outlived `ReEmpty`. // check-pass use std::marker::PhantomData; use std::ptr::NonNull; pub unsafe trait RawData { type Elem; } unsafe impl RawData for OwnedRepr { type Elem = A; } unsafe impl<'a, A> RawData for ViewRepr<&'a A> { type Elem = A; } pub struct OwnedRepr { ptr: PhantomData, } // these Copy impls are not necessary for the repro, but allow the code to compile without error // on 1.44.1 #[derive(Copy, Clone)] pub struct ViewRepr { life: PhantomData, } #[derive(Copy, Clone)] pub struct ArrayBase where S: RawData, { ptr: NonNull, } pub type Array = ArrayBase>; pub type ArrayView<'a, A> = ArrayBase>; impl ArrayBase where S: RawData, { pub fn index_axis(&self) -> ArrayView<'_, A> { unimplemented!() } pub fn axis_iter<'a>(&'a self) -> std::iter::Empty<&'a A> { unimplemented!() } } pub fn x(a: Array) { // drop just avoids a must_use warning drop((0..1).filter(|_| true)); let y = a.index_axis(); a.axis_iter().for_each(|_| { drop(y); }); } fn main() {}