diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2003-04-20 11:48:36 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2003-04-20 11:48:36 +0000 |
commit | de0c0e694f430d942db00e60e6218d9e1715f119 (patch) | |
tree | e581bf7754f4355768ae4c9b814d1df04746f00e /gcc | |
parent | 1613e52bdd61cfd2e00fb326c5cfef8e07f8c797 (diff) | |
download | gcc-de0c0e694f430d942db00e60e6218d9e1715f119.zip gcc-de0c0e694f430d942db00e60e6218d9e1715f119.tar.gz gcc-de0c0e694f430d942db00e60e6218d9e1715f119.tar.bz2 |
re PR c++/10405 (Segfault in setup_class_bindings)
cp:
PR c++/10405
* search.c (lookup_field_1): Final scan goes backwards for
types, forwards for non-types.
testsuite:
PR c++/10405
* g++.dg/lookup/struct-hack1.C: New test.
From-SVN: r65846
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/search.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/struct-hack1.C | 38 |
4 files changed, 64 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 05545f1..0667a97 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-04-19 Nathan Sidwell <nathan@codesourcery.com> + + PR c++/10405 + * search.c (lookup_field_1): Final scan goes backwards for + types, forwards for non-types. + 2003-04-17 Roger Sayle <roger@eyesopen.com> PR c/10375 diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 9fc8431..433e1ac 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -472,19 +472,23 @@ lookup_field_1 (tree type, tree name, bool want_type) /* We might have a nested class and a field with the same name; we sorted them appropriately via - field_decl_cmp, so just look for the last field with - this name. */ - while (true) + field_decl_cmp, so just look for the first or last + field with this name. */ + if (want_type) { - if (!want_type - || TREE_CODE (fields[i]) == TYPE_DECL - || DECL_CLASS_TEMPLATE_P (fields[i])) - field = fields[i]; - if (i + 1 == hi || DECL_NAME (fields[i+1]) != name) - break; - i++; + do + field = fields[i--]; + while (i >= lo && DECL_NAME (fields[i]) == name); + if (TREE_CODE (field) != TYPE_DECL + && !DECL_CLASS_TEMPLATE_P (field)) + field = NULL_TREE; + } + else + { + do + field = fields[i++]; + while (i < hi && DECL_NAME (fields[i]) == name); } - return field; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41df38f..408d817 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-04-19 Nathan Sidwell <nathan@codesourcery.com> + + PR c++/10405 + * g++.dg/lookup/struct-hack1.C: New test. + 2003-04-20 Neil Booth <neil@daikokuya.co.uk> * ucs.c: Update diagnostic messages. diff --git a/gcc/testsuite/g++.dg/lookup/struct-hack1.C b/gcc/testsuite/g++.dg/lookup/struct-hack1.C new file mode 100644 index 0000000..e84d65b --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/struct-hack1.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 19 Apr 2003 <nathan@codesourcery.com> + +// PR 10405. ICE + +#define MEM_ENUM(name) int name; enum name {}; + +struct Base +{ + MEM_ENUM (a) + MEM_ENUM (b) + MEM_ENUM (c) + MEM_ENUM (d) + MEM_ENUM (e) + MEM_ENUM (f) + MEM_ENUM (g) + MEM_ENUM (h) + MEM_ENUM (i) + MEM_ENUM (j) + MEM_ENUM (k) + MEM_ENUM (l) + MEM_ENUM (m) + MEM_ENUM (n) + MEM_ENUM (o) + MEM_ENUM (p) + MEM_ENUM (q) + MEM_ENUM (r) + MEM_ENUM (s) + MEM_ENUM (t) + MEM_ENUM (u) + MEM_ENUM (v) + MEM_ENUM (w) + }; + +struct D : Base {}; + |