re PR c++/7919 (using declarations screw this pointer)

cp:
	PR c++/7919
	* call.c (build_over_call): Convert this pointer for fns found by
	using decls.
testsuite:
	* g++.dg/inherit/using2.C: New test.

From-SVN: r57165
This commit is contained in:
Nathan Sidwell 2002-09-15 18:16:11 +00:00 committed by Nathan Sidwell
parent b0c2b2f934
commit 3baab4840e
4 changed files with 46 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2002-09-15 Nathan Sidwell <nathan@codesourcery.com>
PR c++/7919
* call.c (build_over_call): Convert this pointer for fns found by
using decls.
2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
* ChangeLog: Follow spelling conventions.

View File

@ -4336,7 +4336,8 @@ build_over_call (cand, args, flags)
tree parmtype = TREE_VALUE (parm);
tree argtype = TREE_TYPE (TREE_VALUE (arg));
tree converted_arg;
tree base_binfo;
if (ICS_BAD_FLAG (TREE_VEC_ELT (convs, i)))
pedwarn ("passing `%T' as `this' argument of `%#D' discards qualifiers",
TREE_TYPE (argtype), fn);
@ -4354,6 +4355,15 @@ build_over_call (cand, args, flags)
TREE_VALUE (arg),
cand->conversion_path,
1);
/* If fn was found by a using declaration, the conversion path
will be to the derived class, not the base declaring fn. We
must convert from derived to base. */
base_binfo = lookup_base (TREE_TYPE (TREE_TYPE (converted_arg)),
TREE_TYPE (parmtype), ba_ignore, NULL);
converted_arg = build_base_path (PLUS_EXPR, converted_arg,
base_binfo, 1);
converted_args = tree_cons (NULL_TREE, converted_arg, converted_args);
parm = TREE_CHAIN (parm);
arg = TREE_CHAIN (arg);

View File

@ -1,3 +1,7 @@
2002-09-15 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/inherit/using2.C: New test.
2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
* ChangeLog: Follow spelling conventions.

View File

@ -0,0 +1,25 @@
// { dg-do run }
// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 15 Sep 2002 <nathan@codesourcery.com>
// PR 7919. Methods found via using decls didn't have their this
// pointers converted to the final base type.
struct Base {
int m;
protected:
void *Return () { return this; }
};
struct Derived : Base {
using Base::Return;
virtual ~Derived () {}
};
int main ()
{
Derived d;
return static_cast <Base *> (&d) != d.Return ();
}