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
This commit is contained in:
Nathan Sidwell 2003-04-20 11:48:36 +00:00 committed by Nathan Sidwell
parent 1613e52bdd
commit de0c0e694f
4 changed files with 64 additions and 11 deletions

View File

@ -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

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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 {};