//@ check-pass //@ revisions: old next //@[next] compile-flags: -Znext-solver #![feature(ptr_metadata)] use std::ptr::{self, Pointee}; fn cast_same_meta(ptr: *const T) -> *const U where T: Pointee::Metadata>, { let (thin, meta) = ptr.to_raw_parts(); ptr::from_raw_parts(thin, meta) } struct Wrapper(T); // normalize `Wrapper::Metadata` -> `T::Metadata` fn wrapper_to_tail(ptr: *const T) -> *const Wrapper { cast_same_meta(ptr) } // normalize `Wrapper::Metadata` -> `T::Metadata` -> `()` fn wrapper_to_unit(ptr: *const ()) -> *const Wrapper { cast_same_meta(ptr) } trait Project { type Assoc: ?Sized; } struct WrapperProject(T::Assoc); // normalize `WrapperProject::Metadata` -> `T::Assoc::Metadata` fn wrapper_project_tail(ptr: *const T::Assoc) -> *const WrapperProject { cast_same_meta(ptr) } // normalize `WrapperProject::Metadata` -> `T::Assoc::Metadata` -> `()` fn wrapper_project_unit(ptr: *const ()) -> *const WrapperProject where T::Assoc: Sized, { cast_same_meta(ptr) } // normalize `<[T] as Pointee>::Metadata` -> `usize`, even if `[T]: Sized` fn sized_slice(ptr: *const [T]) -> *const str where [T]: Sized, { cast_same_meta(ptr) } fn main() {}