Commit e5e7e50d by Bogdan Harjoc Committed by Joseph Myers

Avoid infinite loop with duplicate anonymous union fields (PR c/86690).

If a struct contains an anonymous union and both have a field with the
same name, detect_field_duplicates_hash() will replace one of them
with NULL.  If compilation doesn't stop immediately, it may later call
lookup_field() on the union, which falsely assumes the union's
LANG_SPECIFIC array is sorted, and may loop indefinitely because of
this.

2018-08-03  Bogdan Harjoc  <harjoc@gmail.com>

	PR c/86690
gcc/c:
	* c-typeck.c (lookup_field): Do not use TYPE_LANG_SPECIFIC after
	errors.

gcc/testsuite:
	* gcc.dg/union-duplicate-field.c: New test.

From-SVN: r263294
parent d198fc5a
2018-08-03 Bogdan Harjoc <harjoc@gmail.com>
PR c/86690
* c-typeck.c (lookup_field): Do not use TYPE_LANG_SPECIFIC after
errors.
2018-08-01 Martin Sebor <msebor@redhat.com> 2018-08-01 Martin Sebor <msebor@redhat.com>
PR tree-optimization/86650 PR tree-optimization/86650
......
...@@ -2207,9 +2207,14 @@ lookup_field (tree type, tree component) ...@@ -2207,9 +2207,14 @@ lookup_field (tree type, tree component)
/* If TYPE_LANG_SPECIFIC is set, then it is a sorted array of pointers /* If TYPE_LANG_SPECIFIC is set, then it is a sorted array of pointers
to the field elements. Use a binary search on this array to quickly to the field elements. Use a binary search on this array to quickly
find the element. Otherwise, do a linear search. TYPE_LANG_SPECIFIC find the element. Otherwise, do a linear search. TYPE_LANG_SPECIFIC
will always be set for structures which have many elements. */ will always be set for structures which have many elements.
if (TYPE_LANG_SPECIFIC (type) && TYPE_LANG_SPECIFIC (type)->s) Duplicate field checking replaces duplicates with NULL_TREE so
TYPE_LANG_SPECIFIC arrays are potentially no longer sorted. In that
case just iterate using DECL_CHAIN. */
if (TYPE_LANG_SPECIFIC (type) && TYPE_LANG_SPECIFIC (type)->s
&& !seen_error ())
{ {
int bot, top, half; int bot, top, half;
tree *field_array = &TYPE_LANG_SPECIFIC (type)->s->elts[0]; tree *field_array = &TYPE_LANG_SPECIFIC (type)->s->elts[0];
......
2018-08-03 Bogdan Harjoc <harjoc@gmail.com>
PR c/86690
* gcc.dg/union-duplicate-field.c: New test.
2018-08-03 Jason Merrill <jason@redhat.com> 2018-08-03 Jason Merrill <jason@redhat.com>
PR c++/86706 PR c++/86706
......
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
int a0;
struct S
{
int a1;
union {
int a0;
int a1; /* { dg-error "duplicate member" } */
int a2, a3, a4, a5, a6, a7, a8, a9;
int a10, a11, a12, a13, a14, a15;
};
};
int f()
{
struct S s;
return s.a0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment