| //@ check-pass |
| //@ compile-flags: --crate-type=lib |
| //@ revisions: old next |
| //@[next] compile-flags: -Znext-solver |
| #![feature(sized_hierarchy)] |
| |
| use std::marker::{PointeeSized, MetaSized}; |
| |
| trait Id: PointeeSized { |
| type This: PointeeSized; |
| } |
| |
| impl<T: PointeeSized> Id for T { |
| type This = T; |
| } |
| |
| fn requires_metasized<T: MetaSized>() {} |
| |
| fn foo<T>() |
| where |
| T: PointeeSized, |
| <T as Id>::This: Sized |
| { |
| // `T: Sized` from where bounds (`T: PointeeSized` removes any default bounds and |
| // `<T as Id>::This: Sized` normalizes to `T: Sized`). This should trivially satisfy |
| // `T: MetaSized`. |
| requires_metasized::<T>(); |
| } |