Add new test case

From-SVN: r210599
This commit is contained in:
Xinliang David Li 2014-05-19 01:41:16 +00:00 committed by Xinliang David Li
parent 7b3376a0da
commit 2695eb1851
2 changed files with 82 additions and 0 deletions

View File

@ -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.

View File

@ -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;
}