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 *);
&& DECL_NAME (decl) == constructor_name (type));
}
-
/* Nonzero for a class member means that it is shared between all objects
of that class.
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
/* 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
--- /dev/null
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// Bug 16889:Undetected ambiguity.
+
+struct B {
+ int f(); // { dg-error "int B::f" "" }
+};
+
+struct B1 : virtual B {};
+struct B2 : B {};
+struct BB : B1, B2 {};
+
+int i = BB().f(); // { dg-error "ambiguous" "" }
--- /dev/null
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+// Bug 16889:Undetected ambiguity.
+
+struct B {
+ int i; // { dg-error "int B::i" "" }
+};
+
+struct B1 : virtual B {};
+struct B2 : B {};
+struct BB : B1, B2 {};
+
+int i = BB().i; // { dg-error "ambiguous" "" }