// { dg-do run } // { dg-options "-O2 -fdump-tree-optimized" } // { dg-require-effective-target c++11 } // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } } #include #include #include namespace { struct Buf { char * buf; int a{0}; int b{0}; Buf(char * b) : buf(b) { } void add(int v) { ::memcpy(buf, &v, sizeof(v)); a += sizeof(v); b += sizeof(v); } }; struct A { virtual void fill(Buf &buf) { buf.add(type()); buf.add(type()); } virtual ~A() {} virtual int type() = 0; }; struct BA : A { void fill(Buf &buf) { A::fill(buf); buf.add(type()); buf.add(type()); } int type() final { return 1; } }; struct CBA final : BA { }; struct CA final : A { ::std::map m; int type() final { return 2; } }; } int main(int argc, char ** ) { char d[1024]; CBA cba; Buf buf(d); cba.fill(buf); CA ca; return 0; } // { dg-final { scan-tree-dump-not "__builtin_unreachable" "optimized" } }