From 7f58e7acc1e35e69a4dbb9c6e8318601c163f7b9 Mon Sep 17 00:00:00 2001 From: Gabriel Dos Reis Date: Tue, 22 Nov 2005 17:04:12 +0000 Subject: [PATCH] re PR c++/22238 (Awful error messages with virtual functions) PR c++/22238 * error.c (resolve_virtual_fun_from_obj_type_ref): New. (dump_expr): Use it in . From-SVN: r107366 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/error.c | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87e4598263b..17094dd3f69 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-11-21 Gabriel Dos Reis + + PR c++/22238 + * error.c (resolve_virtual_fun_from_obj_type_ref): New. + (dump_expr): Use it in . + 2005-11-21 Richard Henderson * cp-objcp-common.h, name-lookup.c, name-lookup.h: Revert 11-18 patch. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 674e407055f..be0ee5968ee 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -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);