]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add new test case
authorXinliang David Li <davidxl@google.com>
Mon, 19 May 2014 01:41:16 +0000 (01:41 +0000)
committerXinliang David Li <davidxl@gcc.gnu.org>
Mon, 19 May 2014 01:41:16 +0000 (01:41 +0000)
From-SVN: r210599

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/devirt-33.C [new file with mode: 0644]

index e58cb17ee59fb3e595fac9288366133d68f028e7..7e8859699d264845cba618bcb161e31eaca83860 100644 (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.
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-33.C b/gcc/testsuite/g++.dg/ipa/devirt-33.C
new file mode 100644 (file)
index 0000000..970a96b
--- /dev/null
@@ -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;
+}
+