aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2019-06-21 20:46:51 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2019-06-21 20:46:51 +0000
commitf70d81ba7ec55aac1df0242e51d87578db968a32 (patch)
treefa92f3a867173195743812fce83386842bf1e965
parent32833537fcfcc320c8a149641b12d49d23e94609 (diff)
downloadgcc-f70d81ba7ec55aac1df0242e51d87578db968a32.zip
gcc-f70d81ba7ec55aac1df0242e51d87578db968a32.tar.gz
gcc-f70d81ba7ec55aac1df0242e51d87578db968a32.tar.bz2
re PR c++/90909 (call devirtualized to pure virtual)
/cp 2019-06-21 Paolo Carlini <paolo.carlini@oracle.com> PR c++/90909 Revert: 2019-05-21 Paolo Carlini <paolo.carlini@oracle.com> PR c++/67184 PR c++/69445 * call.c (build_over_call): Devirtualize when the final overrider comes from the base. /testsuite 2019-06-21 Paolo Carlini <paolo.carlini@oracle.com> PR c++/90909 Revert: 2019-05-21 Paolo Carlini <paolo.carlini@oracle.com> PR c++/67184 PR c++/69445 * g++.dg/other/final3.C: New. * g++.dg/other/final4.C: Likewise. * g++.dg/other/final5.C: Likewise. * g++.dg/other/final6.C: New. From-SVN: r272573
-rw-r--r--gcc/cp/ChangeLog11
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/ChangeLog14
-rw-r--r--gcc/testsuite/g++.dg/other/final6.C9
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9b75295..4d454b6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,14 @@
+2019-06-21 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/90909
+ Revert:
+ 2019-05-21 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/67184
+ PR c++/69445
+ * call.c (build_over_call): Devirtualize when the final overrider
+ comes from the base.
+
2019-06-21 Marek Polacek <polacek@redhat.com>
PR c++/61490 - qualified-id in friend function definition.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c04ca2e..8367ef7 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -8244,7 +8244,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
/* See if the function member or the whole class type is declared
final and the call can be devirtualized. */
if (DECL_FINAL_P (fn)
- || CLASSTYPE_FINAL (TREE_TYPE (argtype)))
+ || CLASSTYPE_FINAL (TYPE_METHOD_BASETYPE (TREE_TYPE (fn))))
flags |= LOOKUP_NONVIRTUAL;
/* [class.mfct.nonstatic]: If a nonstatic member function of a class
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d5367b2..14ef07c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2019-06-21 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/90909
+ Revert:
+ 2019-05-21 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/67184
+ PR c++/69445
+ * g++.dg/other/final3.C: New.
+ * g++.dg/other/final4.C: Likewise.
+ * g++.dg/other/final5.C: Likewise.
+
+ * g++.dg/other/final6.C: New.
+
2019-06-21 Marek Polacek <polacek@redhat.com>
PR c++/61490 - qualified-id in friend function definition.
diff --git a/gcc/testsuite/g++.dg/other/final6.C b/gcc/testsuite/g++.dg/other/final6.C
new file mode 100644
index 0000000..1979038
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/final6.C
@@ -0,0 +1,9 @@
+// PR c++/90909
+// { dg-do link { target c++11 } }
+
+struct S1 { virtual void f() = 0; };
+struct S2: S1 { virtual void f() {} };
+struct S3: S2 { using S1::f; };
+struct S4 final: S3 { void g(); };
+void S4::g() { f(); }
+int main() { S4().g(); }