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:
parent
18768faed3
commit
f8b0f44f2e
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
17
gcc/testsuite/g++.dg/inherit/virtual11.C
Normal file
17
gcc/testsuite/g++.dg/inherit/virtual11.C
Normal 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" } }
|
Loading…
Reference in New Issue
Block a user