This test makes sure compiler does not wrongly devirtualize virtual
calls into __cxa_pure_virtual or __buitlin_unreachable.

Ok to checkin?

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

Reply via email to