re PR c++/65143 ([C++11] missing devirtualization for virtual base in "final" classes)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 8 Jul 2019 09:51:07 +0000 (09:51 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 8 Jul 2019 09:51:07 +0000 (09:51 +0000)
2019-07-08  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/65143
* g++.dg/tree-ssa/final2.C: New.
* g++.dg/tree-ssa/final3.C: Likewise.

From-SVN: r273228

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/final2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tree-ssa/final3.C [new file with mode: 0644]

index ca899513c0a5f58701ad1199e12f518505a48165..61150ea17ba7b5b313f39fa05916c1402d3226c3 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/65143
+       * g++.dg/tree-ssa/final2.C: New.
+       * g++.dg/tree-ssa/final3.C: Likewise.
+
 2019-07-08  Javier Miranda  <miranda@adacore.com>
 
        * gnat.dg/interface10.adb: New testcase.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/final2.C b/gcc/testsuite/g++.dg/tree-ssa/final2.C
new file mode 100644 (file)
index 0000000..b0fc860
--- /dev/null
@@ -0,0 +1,35 @@
+// PR c++/65143
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -fdump-tree-gimple }
+// { dg-final { scan-tree-dump-times "vptr" 1 gimple } }
+
+struct A
+{
+  int i();
+};
+
+struct B : public virtual A
+{
+  int get()
+  {
+    return A::i() + 1;
+  }
+};
+
+struct C final : public B
+{
+  int get()
+  {
+    return A::i() + 2;
+  }
+};
+
+int foo(C& c)
+{  
+  return c.get(); // Need not go via vtable pointer as class C is final
+}
+
+int foo(B& b2)
+{
+  return b2.get(); // This has to go via vtable as most derived class can change the location of A
+}
diff --git a/gcc/testsuite/g++.dg/tree-ssa/final3.C b/gcc/testsuite/g++.dg/tree-ssa/final3.C
new file mode 100644 (file)
index 0000000..9489fc1
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/65143
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -fdump-tree-gimple }
+// { dg-final { scan-tree-dump-not "vptr" gimple } }
+
+struct A
+{
+    int j;
+};
+
+struct B : public virtual A
+{
+};
+
+struct C final : public B
+{
+    int get();
+};
+
+int C::get()
+{
+    return A::j;
+}