From: Nathan Sidwell Date: Sat, 24 Aug 2019 22:44:06 +0000 (+0000) Subject: [C++ PATCH] vfunc overrider simplification X-Git-Tag: misc/cutover-git~3108 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6dfc1e1f33a0b9cdbff194e02b94b8a1a69d1425;p=thirdparty%2Fgcc.git [C++ PATCH] vfunc overrider simplification 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d0a8c7745a24..013de12242a5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,13 +1,18 @@ +2019-08-24 Nathan Sidwell + + * class.c (check_for_overrides): Conversion operators need + checking too. + 2019-08-24 Paolo Carlini * semantics.c (finish_switch_cond): Improve error message location. -2019-08-22 Jason Merrill +2019-08-23 Jason Merrill * decl2.c (decl_dependent_p): New. (mark_used): Check it instead of just processing_template_decl. -2019-08-22 Jason Merrill +2019-08-23 Jason Merrill * parser.c (cp_parser_nested_name_specifier_opt): Avoid redundant error. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 99332f456e2d..47350c26c22e 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index efb0157bff19..08e48c3e5504 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-08-24 Nathan Sidwell + + * g++.dg/inherit/virtual14.C: New. + 2019-08-24 Thomas Koenig 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 index 000000000000..17aabf31ad03 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual14.C @@ -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); +}