re PR c++/7919 (using declarations screw this pointer)
authorNathan Sidwell <nathan@codesourcery.com>
Sun, 15 Sep 2002 18:16:11 +0000 (18:16 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Sun, 15 Sep 2002 18:16:11 +0000 (18:16 +0000)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/using2.C [new file with mode: 0644]

index 21ab0c9d6684b52e9922523dd0cfaadcf1f72ad2..da49b547f691c4674def2cd2a2dc59a3faf09d69 100644 (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.
index b428145007b44f5277e7c6bc8f75c1f0c59d4b0a..46a6e23e73dbaf46abb42f7104e2a34543779ba8 100644 (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);
index d66527dccb04dc7d755adfe3d84a6306d80204d7..d0ca25757d0d4526202ac6ac73f75c08a330bb91 100644 (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.
diff --git a/gcc/testsuite/g++.dg/inherit/using2.C b/gcc/testsuite/g++.dg/inherit/using2.C
new file mode 100644 (file)
index 0000000..19f06e9
--- /dev/null
@@ -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 ();
+}