diff options
author | Xinliang David Li <davidxl@google.com> | 2014-05-19 01:41:16 +0000 |
---|---|---|
committer | Xinliang David Li <davidxl@gcc.gnu.org> | 2014-05-19 01:41:16 +0000 |
commit | 2695eb1851a9f5b9b8101b0d573990d393dd300e (patch) | |
tree | 40b722a6042ef7b08b18c8590c94550319832873 /gcc | |
parent | 7b3376a0da3e5de61c15899e4da1fc03ef7438d0 (diff) | |
download | gcc-2695eb1851a9f5b9b8101b0d573990d393dd300e.zip gcc-2695eb1851a9f5b9b8101b0d573990d393dd300e.tar.gz gcc-2695eb1851a9f5b9b8101b0d573990d393dd300e.tar.bz2 |
Add new test case
From-SVN: r210599
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/devirt-33.C | 78 |
2 files changed, 82 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e58cb17..7e88596 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-05-17 Xinliang David Li <davidxl@google.com> + + * g++.dg/ipa/devirt-33.C: New testcase. + 2014-05-17 Jan Hubicka <hubicka@ucw.cz> * g++.dg/ipa/comdat.C: New file. diff --git a/gcc/testsuite/g++.dg/ipa/devirt-33.C b/gcc/testsuite/g++.dg/ipa/devirt-33.C new file mode 100644 index 0000000..970a96b --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-33.C @@ -0,0 +1,78 @@ +/* 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; +} + |