aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/search.c26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/struct-hack1.C38
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 {};
+