From c566721f93bb378064b5101a9d5156ce6018159b Mon Sep 17 00:00:00 2001 From: Giovanni Bajo Date: Tue, 15 Jun 2004 01:46:21 +0000 Subject: [PATCH] re PR c++/15967 (ICE on ambiguous operator new in class hierarchy) PR c++/15967 * search.c (lookup_field): Propagate the ambiguity list. (lookup_fnfields): Likewise. PR c++/15967 * g++.dg/lookup/crash3.C: New test. From-SVN: r83158 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/search.c | 10 ++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/crash3.C | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/crash3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7148f222edc..1fc8ec0fbab 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-06-14 Giovanni Bajo + + PR c++/15967 + * search.c (lookup_field): Propagate the ambiguity list. + (lookup_fnfields): Likewise. + 2004-06-14 Giovanni Bajo PR c++/15947 diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 5f4c91c3ec0..ca86b13dedb 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1332,8 +1332,9 @@ lookup_field (tree xbasetype, tree name, int protect, bool want_type) { tree rval = lookup_member (xbasetype, name, protect, want_type); - /* Ignore functions. */ - if (rval && BASELINK_P (rval)) + /* Ignore functions, but propagate the ambiguity list. */ + if (!error_operand_p (rval) + && (rval && BASELINK_P (rval))) return NULL_TREE; return rval; @@ -1347,8 +1348,9 @@ lookup_fnfields (tree xbasetype, tree name, int protect) { tree rval = lookup_member (xbasetype, name, protect, /*want_type=*/false); - /* Ignore non-functions. */ - if (rval && !BASELINK_P (rval)) + /* Ignore non-functions, but propagate the ambiguity list. */ + if (!error_operand_p (rval) + && (rval && !BASELINK_P (rval))) return NULL_TREE; return rval; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ec7738ddee..79a84175526 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-06-14 Giovanni Bajo + + PR c++/15967 + * g++.dg/lookup/crash3.C: New test. + 2004-06-14 Giovanni Bajo PR c++/15947 diff --git a/gcc/testsuite/g++.dg/lookup/crash3.C b/gcc/testsuite/g++.dg/lookup/crash3.C new file mode 100644 index 00000000000..ef025fa76aa --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash3.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// Contributed by Wolfgang Wieser +// PR c++/15967: ICE with ambiguous operator new + +typedef unsigned int size_t; + +struct A { void *operator new(size_t s){} }; // { dg-error "operator new" } +struct B { void *operator new(size_t s){} }; // { dg-error "operator new" } + +struct C : A,B {}; + +int crash() +{ + C *c=new C(); // { dg-error "ambiguous" } +} -- 2.30.2