From 7681bc268cba6bed9a986d3b9f7dc61770c85606 Mon Sep 17 00:00:00 2001 From: davidxl Date: Mon, 19 May 2014 01:41:16 +0000 Subject: [PATCH] Add new test case git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210599 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/g++.dg/ipa/devirt-33.C | 78 ++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ipa/devirt-33.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e58cb17ee59..7e8859699d2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-05-17 Xinliang David Li + + * g++.dg/ipa/devirt-33.C: New testcase. + 2014-05-17 Jan Hubicka * 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 00000000000..970a96b88d8 --- /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(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; +} + -- 2.11.4.GIT