From 940ff66d0ba2ba6166a9788172385415663c622c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 27 Jan 2001 21:33:54 +0100 Subject: [PATCH] c-typeck.c (struct constructor_stack): Add range_stack member. * 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. From-SVN: r39302 --- gcc/ChangeLog | 10 ++++++++++ gcc/c-typeck.c | 14 +++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/gnu99-init-1.c | 15 +++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc2240df35d..74627719449 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2001-01-27 Jakub Jelinek + + * 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. + 2001-01-27 Alexandre Oliva * expr.c (emit_move_insn): Add REG_EQUAL note when constant loaded diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 97c43070b11..2b769815a2d 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cbe116f9b9b..fbfbe8ec842 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2001-01-27 Jakub Jelinek + + * gcc.dg/gnu99-init-1.c: Add 3 more designated range initializer + tests. + 2001-01-25 Jeffrey Oldham * gcc.c-torture/execute/ieee/20000320-1.c (main): For MIPS, change diff --git a/gcc/testsuite/gcc.dg/gnu99-init-1.c b/gcc/testsuite/gcc.dg/gnu99-init-1.c index c78f17647c8..9c22c90103b 100644 --- a/gcc/testsuite/gcc.dg/gnu99-init-1.c +++ b/gcc/testsuite/gcc.dg/gnu99-init-1.c @@ -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) { @@ -58,5 +63,15 @@ int main (void) } 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); } -- 2.30.2