// PR c++/36364 // { dg-options "-frepo" } // { dg-final { cleanup-repo-files } } // { dg-require-host-local "" } // { dg-skip-if "dkms are not final links" { vxworks_kernel } } template struct A { static void assign (C &c1, const C &c2) { c1 = c2; } }; template struct B { struct D { static const C terminal; static unsigned long stor[]; static D &empty_rep () { void *p = reinterpret_cast (&stor); return *reinterpret_cast (p); } void test (unsigned long n) { T::assign (this->refdata ()[n], terminal); } C *refdata () throw () { return reinterpret_cast (this + 1); } }; C *dataplus; C *data () const { return dataplus; } D *rep () const { return &((reinterpret_cast < D * >(data ()))[-1]); } static D & empty_rep () { return D::empty_rep (); } B () : dataplus (empty_rep ().refdata ()) { } ~B () { } void push_back (C c) { rep ()->test (10); } }; template const C B ::D::terminal = C (); template unsigned long B ::D::stor[64]; int main () { B > s; s.push_back ('a'); }