re PR c++/59031 (vtable lookup not optimized away)

PR c++/59031
	* call.c (build_new_method_call_1): Comnpare function context
	with BASELINK_BINFO type rather than instance type before
	marking the call with LOOKUP_NONVIRTUAL.

From-SVN: r205317
This commit is contained in:
Easwaran Raman 2013-11-23 21:01:46 +00:00 committed by Jason Merrill
parent 18768faed3
commit f8b0f44f2e
4 changed files with 30 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2013-11-23 Easwaran Raman <eraman@google.com>
PR c++/59031
* call.c (build_new_method_call_1): Comnpare function context
with BASELINK_BINFO type rather than instance type before
marking the call with LOOKUP_NONVIRTUAL.
2013-11-23 Jason Merrill <jason@redhat.com>
PR c++/58868

View File

@ -7514,7 +7514,7 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
struct z_candidate *candidates = 0, *cand;
tree explicit_targs = NULL_TREE;
tree basetype = NULL_TREE;
tree access_binfo;
tree access_binfo, binfo;
tree optype;
tree first_mem_arg = NULL_TREE;
tree name;
@ -7553,6 +7553,7 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
if (!conversion_path)
conversion_path = BASELINK_BINFO (fns);
access_binfo = BASELINK_ACCESS_BINFO (fns);
binfo = BASELINK_BINFO (fns);
optype = BASELINK_OPTYPE (fns);
fns = BASELINK_FUNCTIONS (fns);
if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
@ -7799,13 +7800,13 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
{
/* Optimize away vtable lookup if we know that this
function can't be overridden. We need to check if
the context and the instance type are the same,
the context and the type where we found fn are the same,
actually FN might be defined in a different class
type because of a using-declaration. In this case, we
do not want to perform a non-virtual call. */
if (DECL_VINDEX (fn) && ! (flags & LOOKUP_NONVIRTUAL)
&& same_type_ignoring_top_level_qualifiers_p
(DECL_CONTEXT (fn), TREE_TYPE (instance))
(DECL_CONTEXT (fn), BINFO_TYPE (binfo))
&& resolves_to_fixed_type_p (instance, 0))
flags |= LOOKUP_NONVIRTUAL;
if (explicit_targs)

View File

@ -359,7 +359,8 @@ struct GTY(()) tree_overload {
/* Returns true iff NODE is a BASELINK. */
#define BASELINK_P(NODE) \
(TREE_CODE (NODE) == BASELINK)
/* The BINFO indicating the base from which the BASELINK_FUNCTIONS came. */
/* The BINFO indicating the base in which lookup found the
BASELINK_FUNCTIONS. */
#define BASELINK_BINFO(NODE) \
(((struct tree_baselink*) BASELINK_CHECK (NODE))->binfo)
/* The functions referred to by the BASELINK; either a FUNCTION_DECL,

View File

@ -0,0 +1,17 @@
// PR c++/59031
// { dg-do compile }
// { dg-options "-fdump-tree-gimple " }
class B {
public:
virtual int add (int a, int b) {return a+ b;}
};
class D : public B {
};
int foo (int a, int b) {
D d;
return d.add(a, b);
}
// { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "gimple" } }
// { dg-final { cleanup-tree-dump "gimple" } }