Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/ipa/devirt-33.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
/* Verify we do not devirtualize wrongly to __cxa_pure_virtual */ /* { dg-do run } */ /* { dg-options "-O2 -std=c++11" } */ inline void* operator new(__SIZE_TYPE__ s, void* buf) throw() { return buf; } class A { private: struct Base { virtual ~Base() {} virtual Base *Clone(void *buf) const = 0; virtual float *Allocate(__SIZE_TYPE__ count) = 0; }; struct Value : Base { virtual ~Value (){} Base *Clone(void* buf) const override { return new (buf) Value(); } float *Allocate(__SIZE_TYPE__ count) override { return new float[count]; } }; public: A() { new (buffer_) Value(); } A(const A& other) { other.ptr()->Clone(buffer_); } float *Allocate() { return ptr()->Allocate(100); } const Base *ptr() const { return reinterpret_cast<const Base*>(buffer_);} Base *ptr() { return reinterpret_cast< Base*>(buffer_);} private: alignas(16) char buffer_[1024]; }; struct B { B (const A& a) : a_(a) { buff_ = a_.Allocate(); } float *buff_; A a_; }; struct Dummy { int i; }; struct D : public Dummy { __attribute__((noinline)) D( const A&a); B b_; }; D::D(const A&a) : b_(a) {} int main() { A a; D d(a); return 0; }