From: Giovanni Bajo Date: Tue, 15 Jun 2004 01:46:21 +0000 (+0000) Subject: re PR c++/15967 (ICE on ambiguous operator new in class hierarchy) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c566721f93bb378064b5101a9d5156ce6018159b;p=platform%2Fupstream%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7148f22..1fc8ec0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 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 * parser.c (cp_parser_template_name): Ctors/dtors never need a template keyword to disambiguate. diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 5f4c91c..ca86b13 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 7ec7738..79a8417 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2004-06-14 Giovanni Bajo + PR c++/15967 + * g++.dg/lookup/crash3.C: New test. + +2004-06-14 Giovanni Bajo + PR c++/15947 * g++.dg/parse/dtor4.C: New test. diff --git a/gcc/testsuite/g++.dg/lookup/crash3.C b/gcc/testsuite/g++.dg/lookup/crash3.C new file mode 100644 index 0000000..ef025fa --- /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" } +}