[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
This commit is contained in:
Nathan Sidwell 2019-08-24 22:44:06 +00:00
parent e68a35ae4a
commit 6dfc1e1f33
4 changed files with 41 additions and 6 deletions

View 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.

View 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))

View 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

View File

@ -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);
}