From f8ad2d219e145753abb13bf84b606a41df1ad5bb Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 24 Aug 2004 16:06:22 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/search.c | 28 +++++++++++++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/ambig1.C | 17 +++++++++++++++++ gcc/testsuite/g++.dg/lookup/ambig2.C | 17 +++++++++++++++++ 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/ambig1.C create mode 100644 gcc/testsuite/g++.dg/lookup/ambig2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9ac0c74dfc4..cc0a9618942 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-08-24 Nathan Sidwell + + PR c++/16889 + * (is_subobject_of_p): Resurrect & optimize. + (lookup_field_r): Use it. + 2004-08-24 Kriang Lerdsuwanakij PR c++/16706 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7264db71fe6..313d5a2166e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-08-24 Nathan Sidwell + + PR c++/16889 + * g++.dg/lookup/ambig[12].C: New. + 2004-08-24 Kriang Lerdsuwanakij PR c++/16706 diff --git a/gcc/testsuite/g++.dg/lookup/ambig1.C b/gcc/testsuite/g++.dg/lookup/ambig1.C new file mode 100644 index 00000000000..1cf9ab4f0a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Aug 2004 +// Origin: Wolfgang Bangerth + +// 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" "" } diff --git a/gcc/testsuite/g++.dg/lookup/ambig2.C b/gcc/testsuite/g++.dg/lookup/ambig2.C new file mode 100644 index 00000000000..4d423d17069 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig2.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Aug 2004 +// Origin: Wolfgang Bangerth + +// 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" "" } -- 2.30.2