re PR c++/16889 (ambiguity is not detected)

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.

From-SVN: r86488
This commit is contained in:
Nathan Sidwell 2004-08-24 16:06:22 +00:00 committed by Nathan Sidwell
parent 97dc04b39a
commit f8ad2d219e
5 changed files with 70 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2004-08-24 Nathan Sidwell <nathan@codesourcery.com>
PR c++/16889
* (is_subobject_of_p): Resurrect & optimize.
(lookup_field_r): Use it.
2004-08-24 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/16706

View File

@ -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

View File

@ -1,3 +1,8 @@
2004-08-24 Nathan Sidwell <nathan@codesourcery.com>
PR c++/16889
* g++.dg/lookup/ambig[12].C: New.
2004-08-24 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/16706

View File

@ -0,0 +1,17 @@
// { 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" "" }

View File

@ -0,0 +1,17 @@
// { 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" "" }