]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/22238 (Awful error messages with virtual functions)
authorGabriel Dos Reis <gdr@integrable-solutions.net>
Tue, 22 Nov 2005 17:04:12 +0000 (17:04 +0000)
committerGabriel Dos Reis <gdr@gcc.gnu.org>
Tue, 22 Nov 2005 17:04:12 +0000 (17:04 +0000)
        PR c++/22238
        * error.c (resolve_virtual_fun_from_obj_type_ref): New.
        (dump_expr): Use it in <case CALL_EXPR>.

From-SVN: r107366

gcc/cp/ChangeLog
gcc/cp/error.c

index 87e4598263bec8e24ecccb7cf08da75e1aef01c6..17094dd3f69a60c4cd2863d73f5116ca9c91a151 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-21  Gabriel Dos Reis  <gdr@integrable-solutions.net>
+
+       PR c++/22238
+       * error.c (resolve_virtual_fun_from_obj_type_ref): New.
+       (dump_expr): Use it in <case CALL_EXPR>.
+
 2005-11-21  Richard Henderson  <rth@redhat.com>
 
        * cp-objcp-common.h, name-lookup.c, name-lookup.h: Revert 11-18 patch.
index 674e407055fb48e0009d1e796a3d9f4a62af09b1..be0ee5968eedc673fa8bc8c8b0ee0f866d7fe102 100644 (file)
@@ -1278,6 +1278,23 @@ dump_expr_init_vec (VEC(constructor_elt,gc) *v, int flags)
 }
 
 
+/* We've gotten an indirect REFERENCE (an OBJ_TYPE_REF) to a virtual
+   function.  Resolve it to a close relative -- in the sense of static
+   type -- variant being overridden.  That is close to what was written in
+   the source code.  Subroutine of dump_expr.  */
+
+static tree
+resolve_virtual_fun_from_obj_type_ref (tree ref)
+{
+  tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref));
+  int index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1);
+  tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type)));
+    while (index--)
+      fun = TREE_CHAIN (fun);
+
+  return BV_FN (fun);
+}
+
 /* Print out an expression E under control of FLAGS.  */
 
 static void
@@ -1386,6 +1403,10 @@ dump_expr (tree t, int flags)
        if (TREE_CODE (fn) == ADDR_EXPR)
          fn = TREE_OPERAND (fn, 0);
 
+        /* Nobody is interested in seeing the guts of vcalls.  */
+        if (TREE_CODE (fn) == OBJ_TYPE_REF)
+          fn = resolve_virtual_fun_from_obj_type_ref (fn);
+
        if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE)
          {
            tree ob = TREE_VALUE (args);