]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[C++ PATCH] vfunc overrider simplification
authorNathan Sidwell <nathan@gcc.gnu.org>
Sat, 24 Aug 2019 22:44:06 +0000 (22:44 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Sat, 24 Aug 2019 22:44:06 +0000 (22:44 +0000)
https://gcc.gnu.org/ml/gcc-patches/2019-08/msg01674.html
cp/
* class.c (check_for_overrides): Conversion operators need
checking too.

testsuite/
* g++.dg/inherit/virtual14.C: New.

From-SVN: r274903

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/virtual14.C [new file with mode: 0644]

index d0a8c7745a242427b4cbd27f24151bdd9e011aa8..013de12242a5f33475bd2bb944562355156cc4dd 100644 (file)
@@ -1,13 +1,18 @@
+2019-08-24  Nathan Sidwell  <nathan@acm.org>
+
+       * class.c (check_for_overrides): Conversion operators need
+       checking too.
+
 2019-08-24  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * semantics.c (finish_switch_cond): Improve error message location.
 
-2019-08-22  Jason Merrill  <jason@redhat.com>
+2019-08-23  Jason Merrill  <jason@redhat.com>
 
        * decl2.c (decl_dependent_p): New.
        (mark_used): Check it instead of just processing_template_decl.
 
-2019-08-22  Jason Merrill  <jason@redhat.com>
+2019-08-23  Jason Merrill  <jason@redhat.com>
 
        * parser.c (cp_parser_nested_name_specifier_opt): Avoid redundant
        error.
index 99332f456e2d73e8d2763eedaeac00869e313bb8..47350c26c22e2ce52f7c6dcb58e351b52ecac5b6 100644 (file)
@@ -2817,10 +2817,12 @@ check_for_override (tree decl, tree ctype)
     return;
 
   /* IDENTIFIER_VIRTUAL_P indicates whether the name has ever been
-     used for a vfunc.  That avoids the expensive
-     look_for_overrides call that when we know there's nothing to
-     find.  */
-  if (IDENTIFIER_VIRTUAL_P (DECL_NAME (decl))
+     used for a vfunc.  That avoids the expensive look_for_overrides
+     call that when we know there's nothing to find.  As conversion
+     operators for the same type can have distinct identifiers, we
+     cannot optimize those in that way.  */
+  if ((IDENTIFIER_VIRTUAL_P (DECL_NAME (decl))
+       || DECL_CONV_FN_P (decl))
       && look_for_overrides (ctype, decl)
       /* Check staticness after we've checked if we 'override'.  */
       && !DECL_STATIC_FUNCTION_P (decl))
index efb0157bff196e8d59d8c9689542a753a79b82ed..08e48c3e5504e40d1b9a7116240765996753d272 100644 (file)
@@ -1,3 +1,7 @@
+2019-08-24  Nathan Sidwell  <nathan@acm.org>
+
+       * g++.dg/inherit/virtual14.C: New.
+
 2019-08-24  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/91390
diff --git a/gcc/testsuite/g++.dg/inherit/virtual14.C b/gcc/testsuite/g++.dg/inherit/virtual14.C
new file mode 100644 (file)
index 0000000..17aabf3
--- /dev/null
@@ -0,0 +1,24 @@
+// { dg-do run }
+
+struct base 
+{
+  virtual operator int () { return 0;}
+};
+
+typedef int q;
+
+struct d : base
+{
+  operator q () { return 1; }
+};
+
+int invoke (base *d)
+{
+  return int (*d);
+}
+
+int main ()
+{
+  d d;
+  return !(invoke (&d) == 1);
+}