aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2019-07-08 09:51:07 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2019-07-08 09:51:07 +0000
commit75b41faa236ff0bbedf0cfe7de92d0092fd38757 (patch)
treecdb8044b11c020edd8da777353a2d277d2b9d6f5
parent9118c5e1a3a58f41bddc14ae078c5857c7a24f03 (diff)
downloadgcc-75b41faa236ff0bbedf0cfe7de92d0092fd38757.zip
gcc-75b41faa236ff0bbedf0cfe7de92d0092fd38757.tar.gz
gcc-75b41faa236ff0bbedf0cfe7de92d0092fd38757.tar.bz2
re PR c++/65143 ([C++11] missing devirtualization for virtual base in "final" classes)
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
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/final2.C35
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/final3.C23
3 files changed, 64 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ca89951..61150ea 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..b0fc860
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/final2.C
@@ -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
index 0000000..9489fc12
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/final3.C
@@ -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;
+}