| // rust-lang/rust#60431: This is a scenario where to determine the size of |
| // `&Ref<Obstack>`, we need to know the concrete type of the last field in |
| // `Ref<Obstack>` (i.e. its "struct tail"), and determining that concrete type |
| // requires normalizing `Obstack::Dyn`. |
| // |
| // The old "struct tail" computation did not perform such normalization, and so |
| // the compiler would ICE when trying to figure out if `Ref<Obstack>` is a |
| // dynamically-sized type (DST). |
| |
| // run-pass |
| |
| use std::mem; |
| |
| pub trait Arena { |
| type Dyn : ?Sized; |
| } |
| |
| pub struct DynRef { |
| _dummy: [()], |
| } |
| |
| pub struct Ref<A: Arena> { |
| _value: u8, |
| _dyn_arena: A::Dyn, |
| } |
| |
| pub struct Obstack; |
| |
| impl Arena for Obstack { |
| type Dyn = DynRef; |
| } |
| |
| fn main() { |
| assert_eq!(mem::size_of::<&Ref<Obstack>>(), mem::size_of::<&[()]>()); |
| } |