This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix set_designator breakage
- To: gcc-patches at gcc dot gnu dot org
- Subject: [PATCH] Fix set_designator breakage
- From: Jakub Jelinek <jakub at redhat dot com>
- Date: Sat, 27 Jan 2001 16:25:19 +0100
- Cc: Kaoru Fukui <k_fukui at highway dot ne dot jp>
- References: <20010127195104.Postino-000124@smtp01.highway.ne.jp>
- Reply-To: Jakub Jelinek <jakub at redhat dot com>
Hi!
On Sat, Jan 27, 2001 at 07:51:04PM +0900, Kaoru Fukui wrote:
> I get this problem on my linuxppc,
> When gcc-2.97 was compiling kernel-2.4.1-pre10,glibc is glibc-2.1.3.
> Gcc-2.95.3pre is noproblem there.
...
> brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
> { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = 0 } }; <-- here is line 42
This should be fixed by the patch below. constructor_range_stack has to be
saved/restored on explicit opening/closing braces. I've added some more
tests into testsuite so that this bug is covered, the relevant testcases
seem to work, full bootstrap/regression testing is running ATM.
Ok to commit provided that both bootstrap and make check are successful?
2001-01-27 Jakub Jelinek <jakub@redhat.com>
* c-typeck.c (struct constructor_stack): Add range_stack member.
(really_start_incremental_init): Clear it.
(push_init_level): Save constructor_range_stack and clear it if
pushing explicit braces.
(pop_init_level): abort if constructor_range_stack is non-zero at
explicit closing brace. Restore saved constructor_range_stack if
not implicit.
* gcc.dg/gnu99-init-1.c: Add 3 more designated range initializer
tests.
--- gcc/c-typeck.c.jj Mon Jan 22 13:58:05 2001
+++ gcc/c-typeck.c Sat Jan 27 17:05:07 2001
@@ -4954,6 +4954,8 @@ static int designator_errorneous;
structuring in the initializer, including the outermost one. It
saves the values of most of the variables above. */
+struct constructor_range_stack;
+
struct constructor_stack
{
struct constructor_stack *next;
@@ -4965,12 +4967,13 @@ struct constructor_stack
tree unfilled_fields;
tree bit_index;
tree elements;
- int offset;
struct init_node *pending_elts;
+ int offset;
int depth;
/* If nonzero, this value should replace the entire
constructor at this level. */
tree replacement_value;
+ struct constructor_range_stack *range_stack;
char constant;
char simple;
char implicit;
@@ -5159,6 +5162,7 @@ really_start_incremental_init (type)
p->depth = constructor_depth;
p->replacement_value = 0;
p->implicit = 0;
+ p->range_stack = 0;
p->outer = 0;
p->incremental = constructor_incremental;
p->next = 0;
@@ -5272,6 +5276,7 @@ push_init_level (implicit)
p->outer = 0;
p->incremental = constructor_incremental;
p->next = constructor_stack;
+ p->range_stack = 0;
constructor_stack = p;
constructor_constant = 1;
@@ -5282,6 +5287,8 @@ push_init_level (implicit)
constructor_pending_elts = 0;
if (!implicit)
{
+ p->range_stack = constructor_range_stack;
+ constructor_range_stack = 0;
designator_depth = 0;
designator_errorneous = 0;
}
@@ -5404,6 +5411,9 @@ pop_init_level (implicit)
pop any inner levels that didn't have explicit braces. */
while (constructor_stack->implicit)
process_init_element (pop_init_level (1));
+
+ if (constructor_range_stack)
+ abort ();
}
p = constructor_stack;
@@ -5531,6 +5541,8 @@ pop_init_level (implicit)
constructor_incremental = p->incremental;
constructor_pending_elts = p->pending_elts;
constructor_depth = p->depth;
+ if (!p->implicit)
+ constructor_range_stack = p->range_stack;
RESTORE_SPELLING_DEPTH (constructor_depth);
constructor_stack = p->next;
--- gcc/testsuite/gcc.dg/gnu99-init-1.c.jj Fri Jan 12 11:55:29 2001
+++ gcc/testsuite/gcc.dg/gnu99-init-1.c Sat Jan 27 16:56:49 2001
@@ -19,6 +19,11 @@ struct H m = { .J = {}, 3 };
struct I { int J; int K[3]; int L; };
struct M { int N; struct I O[3]; int P; };
struct M n[] = { [0 ... 5].O[1 ... 2].K[0 ... 1] = 4, 5, 6, 7 };
+struct M o[] = { [0 ... 5].O = { [1 ... 2].K[0 ... 1] = 4 },
+ [5].O[2].K[2] = 5, 6, 7 };
+struct M p[] = { [0 ... 5].O[1 ... 2].K = { [0 ... 1] = 4 },
+ [5].O[2].K[2] = 5, 6, 7 };
+int q[3][3] = { [0 ... 1] = { [1 ... 2] = 23 }, [1][2] = 24 };
int main (void)
{
@@ -57,6 +62,16 @@ int main (void)
abort ();
}
if (n[5].O[2].K[2] != 5 || n[5].O[2].L != 6 || n[5].P != 7)
+ abort ();
+ if (memcmp (n, o, sizeof (n)) || sizeof (n) != sizeof (o))
+ abort ();
+ if (memcmp (n, p, sizeof (n)) || sizeof (n) != sizeof (p))
+ abort ();
+ if (q[0][0] || q[0][1] != 23 || q[0][2] != 23)
+ abort ();
+ if (q[1][0] || q[1][1] != 23 || q[1][2] != 24)
+ abort ();
+ if (q[2][0] || q[2][1] || q[2][2])
abort ();
exit (0);
}
Jakub