aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/search.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2003-04-20 11:48:36 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2003-04-20 11:48:36 +0000
commitde0c0e694f430d942db00e60e6218d9e1715f119 (patch)
treee581bf7754f4355768ae4c9b814d1df04746f00e /gcc/cp/search.c
parent1613e52bdd61cfd2e00fb326c5cfef8e07f8c797 (diff)
downloadgcc-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.c26
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;
}
}