diff options
-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 {}; + |