diff mbox

Add a new test

Message ID CAAkRFZLi7Wjc4NBuYQJT8ntrr31QaRvHC6EPn85CcpYGrOQ5-w@mail.gmail.com
State New
Headers show

Commit Message

Xinliang David Li May 16, 2014, 11:58 p.m. UTC
This test makes sure compiler does not wrongly devirtualize virtual
calls into __cxa_pure_virtual or __buitlin_unreachable.

Ok to checkin?

David

Comments

Xinliang David Li May 18, 2014, 9:55 p.m. UTC | #1
Ok to check in the test?

David

On Fri, May 16, 2014 at 4:58 PM, Xinliang David Li <davidxl@google.com> wrote:
> This test makes sure compiler does not wrongly devirtualize virtual
> calls into __cxa_pure_virtual or __buitlin_unreachable.
>
> Ok to checkin?
>
> David
Jan Hubicka May 18, 2014, 9:57 p.m. UTC | #2
> Ok to check in the test?
OK,
Honza
> 
> David
> 
> On Fri, May 16, 2014 at 4:58 PM, Xinliang David Li <davidxl@google.com> wrote:
> > This test makes sure compiler does not wrongly devirtualize virtual
> > calls into __cxa_pure_virtual or __buitlin_unreachable.
> >
> > Ok to checkin?
> >
> > David
diff mbox

Patch

Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 210479)
+++ testsuite/ChangeLog	(working copy)
@@ -1,3 +1,7 @@ 
+2014-05-16  Xinliang David Li  <davidxl@google.com>
+
+	* g++.dg/ipa/devirt-33.C: New testcase.
+
 2014-05-15  Martin Jambor  <mjambor@suse.cz>
 
 	PR ipa/61085
Index: testsuite/g++.dg/ipa/devirt-33.C
===================================================================
--- testsuite/g++.dg/ipa/devirt-33.C	(revision 0)
+++ testsuite/g++.dg/ipa/devirt-33.C	(revision 0)
@@ -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;
+}
+