// compile-flags: --crate-type lib // check-pass // // Regression test for issue #84399 // Tests that we keep the full `ParamEnv` when // caching predicates with freshened types in the global cache use std::marker::PhantomData; pub trait Allocator { type Buffer; } pub struct DefaultAllocator; impl Allocator for DefaultAllocator { type Buffer = (); } pub type Owned = >::Buffer; pub type MatrixMN = Matrix>; pub type Matrix4 = Matrix; pub struct Matrix { pub data: S, _phantoms: PhantomData, } pub fn set_object_transform(matrix: &Matrix4<()>) { matrix.js_buffer_view(); } pub trait Storable { type Cell; fn slice_to_items(_buffer: &()) -> &[Self::Cell] { unimplemented!() } } pub type Cell = ::Cell; impl Storable for MatrixMN where DefaultAllocator: Allocator, { type Cell = (); } pub trait JsBufferView { fn js_buffer_view(&self) -> usize { unimplemented!() } } impl JsBufferView for [MatrixMN] where DefaultAllocator: Allocator, MatrixMN: Storable, [Cell>]: JsBufferView, { fn js_buffer_view(&self) -> usize { as Storable>::slice_to_items(&()).js_buffer_view() } } impl JsBufferView for [()] {} impl JsBufferView for MatrixMN where DefaultAllocator: Allocator {}