aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/search.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2004-08-24 16:06:22 +0000
committerNathan Sidwell <nathan@codesourcery.com>2004-08-24 16:06:22 +0000
commit0a0e56bfb84c38f1dcda5d53d78676d0a9d681f2 (patch)
tree86fd999adb0b2315ae129f8e8afc5084c8e45778 /gcc/cp/search.c
parent63745024d95c894d80f92360804f484b2efbd64e (diff)
cp:
PR c++/16889 * (is_subobject_of_p): Resurrect & optimize. (lookup_field_r): Use it. testsuite: PR c++/16889 * g++.dg/lookup/ambig[12].C: New. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@86488 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/search.c')
-rw-r--r--gcc/cp/search.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 81226d13d33..4aadf78adf8 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -45,6 +45,7 @@ struct vbase_info
tree inits;
};
+static int is_subobject_of_p (tree, tree);
static tree dfs_check_overlap (tree, void *);
static tree dfs_no_overlap_yet (tree, int, void *);
static base_kind lookup_base_r (tree, tree, base_access, bool, tree *);
@@ -1018,7 +1019,6 @@ template_self_reference_p (tree type, tree decl)
&& DECL_NAME (decl) == constructor_name (type));
}
-
/* Nonzero for a class member means that it is shared between all objects
of that class.
@@ -1048,6 +1048,26 @@ shared_member_p (tree t)
return 0;
}
+/* Routine to see if the sub-object denoted by the binfo PARENT can be
+ found as a base class and sub-object of the object denoted by
+ BINFO. */
+
+static int
+is_subobject_of_p (tree parent, tree binfo)
+{
+ tree probe;
+
+ for (probe = parent; probe; probe = BINFO_INHERITANCE_CHAIN (probe))
+ {
+ if (probe == binfo)
+ return 1;
+ if (BINFO_VIRTUAL_P (probe))
+ return (binfo_for_vbase (BINFO_TYPE (probe), BINFO_TYPE (binfo))
+ != NULL_TREE);
+ }
+ return 0;
+}
+
/* DATA is really a struct lookup_field_info. Look for a field with
the name indicated there in BINFO. If this function returns a
non-NULL value it is the result of the lookup. Called from
@@ -1115,12 +1135,14 @@ lookup_field_r (tree binfo, void *data)
/* If the lookup already found a match, and the new value doesn't
hide the old one, we might have an ambiguity. */
- if (lfi->rval_binfo && !original_binfo (lfi->rval_binfo, binfo))
+ if (lfi->rval_binfo
+ && !is_subobject_of_p (lfi->rval_binfo, binfo))
+
{
if (nval == lfi->rval && shared_member_p (nval))
/* The two things are really the same. */
;
- else if (original_binfo (binfo, lfi->rval_binfo))
+ else if (is_subobject_of_p (binfo, lfi->rval_binfo))
/* The previous value hides the new one. */
;
else