rust/tests/ui/regions/type-param-outlives-reempty...

67 lines
1.2 KiB
Rust

// 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<A> RawData for OwnedRepr<A> {
type Elem = A;
}
unsafe impl<'a, A> RawData for ViewRepr<&'a A> {
type Elem = A;
}
pub struct OwnedRepr<A> {
ptr: PhantomData<A>,
}
// 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<A> {
life: PhantomData<A>,
}
#[derive(Copy, Clone)]
pub struct ArrayBase<S>
where
S: RawData,
{
ptr: NonNull<S::Elem>,
}
pub type Array<A> = ArrayBase<OwnedRepr<A>>;
pub type ArrayView<'a, A> = ArrayBase<ViewRepr<&'a A>>;
impl<A, S> ArrayBase<S>
where
S: RawData<Elem = A>,
{
pub fn index_axis(&self) -> ArrayView<'_, A> {
unimplemented!()
}
pub fn axis_iter<'a>(&'a self) -> std::iter::Empty<&'a A> {
unimplemented!()
}
}
pub fn x<T: Copy>(a: Array<T>) {
// _ just avoids a must_use warning
let _ = (0..1).filter(|_| true);
let y = a.index_axis();
a.axis_iter().for_each(|_| {
let _ = y;
});
}
fn main() {}