diff options
| author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-20 11:48:36 +0000 |
|---|---|---|
| committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-20 11:48:36 +0000 |
| commit | 03c8911ca0554955d34dc4dc439cd50b705c0134 (patch) | |
| tree | e581bf7754f4355768ae4c9b814d1df04746f00e /gcc | |
| parent | 2cbf1359092416d271b02844198e7ad6e5e56284 (diff) | |
| download | ppe42-gcc-03c8911ca0554955d34dc4dc439cd50b705c0134.tar.gz ppe42-gcc-03c8911ca0554955d34dc4dc439cd50b705c0134.zip | |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65846 138bc75d-0d04-0410-961f-82ee72b054a4
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 05545f13c66..0667a971805 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 9fc84311d38..433e1ac13ae 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 41df38fa7aa..408d817eea3 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 00000000000..e84d65b3355 --- /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 {}; + |

