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/cp/search.c | |
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/cp/search.c')
-rw-r--r-- | gcc/cp/search.c | 26 |
1 files changed, 15 insertions, 11 deletions
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; } } |