// 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::<&[()]>()); }