Commit a1e3b3d9 by Laurynas Biveinis Committed by Laurynas Biveinis

2010-04-22 Laurynas Biveinis <laurynas.biveinis@gmail.com>

	* c-tree.h (push_init_level, pop_init_level, set_init_index)
	(process_init_element): New argument of type struct obstack *.

	* c-typeck.c (push_init_level, pop_init_level, set_designator)
	(set_init_index, set_init_label, set_nonincremental_init)
	(set_nonincremental_init_from_string, find_init_member)
	(output_init_element, output_pending_init_elements)
	(process_init_element): New argument braced_init_obstack.  Pass it
	down.
	(push_range_stack, add_pending_init): New argument
	braced_init_obstack.  Use obstack allocation.

	* c-parser.c (c_parser_initelt, c_parser_initval): New argument
	braced_init_obstack.  Pass it down.
	(c_parser_braced_init): New variables ret, braced_init_obstack.
	Initialize obstack, pass it down and finally free it.

From-SVN: r158634
parent 5b58b39b
2010-04-22 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* c-tree.h (push_init_level, pop_init_level, set_init_index)
(process_init_element): New argument of type struct obstack *.
* c-typeck.c (push_init_level, pop_init_level, set_designator)
(set_init_index, set_init_label, set_nonincremental_init)
(set_nonincremental_init_from_string, find_init_member)
(output_init_element, output_pending_init_elements)
(process_init_element): New argument braced_init_obstack. Pass it
down.
(push_range_stack, add_pending_init): New argument
braced_init_obstack. Use obstack allocation.
* c-parser.c (c_parser_initelt, c_parser_initval): New argument
braced_init_obstack. Pass it down.
(c_parser_braced_init): New variables ret, braced_init_obstack.
Initialize obstack, pass it down and finally free it.
2010-04-22 Bernd Schmidt <bernds@codesourcery.com> 2010-04-22 Bernd Schmidt <bernds@codesourcery.com>
PR middle-end/29274 PR middle-end/29274
......
...@@ -906,8 +906,9 @@ static tree c_parser_attributes (c_parser *); ...@@ -906,8 +906,9 @@ static tree c_parser_attributes (c_parser *);
static struct c_type_name *c_parser_type_name (c_parser *); static struct c_type_name *c_parser_type_name (c_parser *);
static struct c_expr c_parser_initializer (c_parser *); static struct c_expr c_parser_initializer (c_parser *);
static struct c_expr c_parser_braced_init (c_parser *, tree, bool); static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
static void c_parser_initelt (c_parser *); static void c_parser_initelt (c_parser *, struct obstack *);
static void c_parser_initval (c_parser *, struct c_expr *); static void c_parser_initval (c_parser *, struct c_expr *,
struct obstack *);
static tree c_parser_compound_statement (c_parser *); static tree c_parser_compound_statement (c_parser *);
static void c_parser_compound_statement_nostart (c_parser *); static void c_parser_compound_statement_nostart (c_parser *);
static void c_parser_label (c_parser *); static void c_parser_label (c_parser *);
...@@ -3088,11 +3089,14 @@ c_parser_initializer (c_parser *parser) ...@@ -3088,11 +3089,14 @@ c_parser_initializer (c_parser *parser)
static struct c_expr static struct c_expr
c_parser_braced_init (c_parser *parser, tree type, bool nested_p) c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
{ {
struct c_expr ret;
struct obstack braced_init_obstack;
location_t brace_loc = c_parser_peek_token (parser)->location; location_t brace_loc = c_parser_peek_token (parser)->location;
gcc_obstack_init (&braced_init_obstack);
gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE)); gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (nested_p) if (nested_p)
push_init_level (0); push_init_level (0, &braced_init_obstack);
else else
really_start_incremental_init (type); really_start_incremental_init (type);
if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
...@@ -3105,7 +3109,7 @@ c_parser_braced_init (c_parser *parser, tree type, bool nested_p) ...@@ -3105,7 +3109,7 @@ c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
comma. */ comma. */
while (true) while (true)
{ {
c_parser_initelt (parser); c_parser_initelt (parser, &braced_init_obstack);
if (parser->error) if (parser->error)
break; break;
if (c_parser_next_token_is (parser, CPP_COMMA)) if (c_parser_next_token_is (parser, CPP_COMMA))
...@@ -3118,22 +3122,24 @@ c_parser_braced_init (c_parser *parser, tree type, bool nested_p) ...@@ -3118,22 +3122,24 @@ c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
} }
if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE)) if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
{ {
struct c_expr ret;
ret.value = error_mark_node; ret.value = error_mark_node;
ret.original_code = ERROR_MARK; ret.original_code = ERROR_MARK;
ret.original_type = NULL; ret.original_type = NULL;
c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>"); c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
pop_init_level (0); pop_init_level (0, &braced_init_obstack);
obstack_free (&braced_init_obstack, NULL);
return ret; return ret;
} }
c_parser_consume_token (parser); c_parser_consume_token (parser);
return pop_init_level (0); ret = pop_init_level (0, &braced_init_obstack);
obstack_free (&braced_init_obstack, NULL);
return ret;
} }
/* Parse a nested initializer, including designators. */ /* Parse a nested initializer, including designators. */
static void static void
c_parser_initelt (c_parser *parser) c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack)
{ {
/* Parse any designator or designator list. A single array /* Parse any designator or designator list. A single array
designator may have the subsequent "=" omitted in GNU C, but a designator may have the subsequent "=" omitted in GNU C, but a
...@@ -3142,7 +3148,8 @@ c_parser_initelt (c_parser *parser) ...@@ -3142,7 +3148,8 @@ c_parser_initelt (c_parser *parser)
&& c_parser_peek_2nd_token (parser)->type == CPP_COLON) && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
{ {
/* Old-style structure member designator. */ /* Old-style structure member designator. */
set_init_label (c_parser_peek_token (parser)->value); set_init_label (c_parser_peek_token (parser)->value,
braced_init_obstack);
/* Use the colon as the error location. */ /* Use the colon as the error location. */
pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_pedantic, pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_pedantic,
"obsolete use of designated initializer with %<:%>"); "obsolete use of designated initializer with %<:%>");
...@@ -3170,7 +3177,8 @@ c_parser_initelt (c_parser *parser) ...@@ -3170,7 +3177,8 @@ c_parser_initelt (c_parser *parser)
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME)) if (c_parser_next_token_is (parser, CPP_NAME))
{ {
set_init_label (c_parser_peek_token (parser)->value); set_init_label (c_parser_peek_token (parser)->value,
braced_init_obstack);
c_parser_consume_token (parser); c_parser_consume_token (parser);
} }
else else
...@@ -3181,7 +3189,7 @@ c_parser_initelt (c_parser *parser) ...@@ -3181,7 +3189,7 @@ c_parser_initelt (c_parser *parser)
init.original_type = NULL; init.original_type = NULL;
c_parser_error (parser, "expected identifier"); c_parser_error (parser, "expected identifier");
c_parser_skip_until_found (parser, CPP_COMMA, NULL); c_parser_skip_until_found (parser, CPP_COMMA, NULL);
process_init_element (init, false); process_init_element (init, false, braced_init_obstack);
return; return;
} }
} }
...@@ -3262,7 +3270,7 @@ c_parser_initelt (c_parser *parser) ...@@ -3262,7 +3270,7 @@ c_parser_initelt (c_parser *parser)
/* Now parse and process the remainder of the /* Now parse and process the remainder of the
initializer, starting with this message initializer, starting with this message
expression as a primary-expression. */ expression as a primary-expression. */
c_parser_initval (parser, &mexpr); c_parser_initval (parser, &mexpr, braced_init_obstack);
return; return;
} }
c_parser_consume_token (parser); c_parser_consume_token (parser);
...@@ -3281,7 +3289,7 @@ c_parser_initelt (c_parser *parser) ...@@ -3281,7 +3289,7 @@ c_parser_initelt (c_parser *parser)
if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
{ {
c_parser_consume_token (parser); c_parser_consume_token (parser);
set_init_index (first, second); set_init_index (first, second, braced_init_obstack);
if (second) if (second)
pedwarn (ellipsis_loc, OPT_pedantic, pedwarn (ellipsis_loc, OPT_pedantic,
"ISO C forbids specifying range of elements to initialize"); "ISO C forbids specifying range of elements to initialize");
...@@ -3313,13 +3321,13 @@ c_parser_initelt (c_parser *parser) ...@@ -3313,13 +3321,13 @@ c_parser_initelt (c_parser *parser)
init.original_type = NULL; init.original_type = NULL;
c_parser_error (parser, "expected %<=%>"); c_parser_error (parser, "expected %<=%>");
c_parser_skip_until_found (parser, CPP_COMMA, NULL); c_parser_skip_until_found (parser, CPP_COMMA, NULL);
process_init_element (init, false); process_init_element (init, false, braced_init_obstack);
return; return;
} }
} }
} }
} }
c_parser_initval (parser, NULL); c_parser_initval (parser, NULL, braced_init_obstack);
} }
/* Parse a nested initializer; as c_parser_initializer but parses /* Parse a nested initializer; as c_parser_initializer but parses
...@@ -3329,7 +3337,8 @@ c_parser_initelt (c_parser *parser) ...@@ -3329,7 +3337,8 @@ c_parser_initelt (c_parser *parser)
initializer. */ initializer. */
static void static void
c_parser_initval (c_parser *parser, struct c_expr *after) c_parser_initval (c_parser *parser, struct c_expr *after,
struct obstack * braced_init_obstack)
{ {
struct c_expr init; struct c_expr init;
gcc_assert (!after || c_dialect_objc ()); gcc_assert (!after || c_dialect_objc ());
...@@ -3344,7 +3353,7 @@ c_parser_initval (c_parser *parser, struct c_expr *after) ...@@ -3344,7 +3353,7 @@ c_parser_initval (c_parser *parser, struct c_expr *after)
&& TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR) && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
init = default_function_array_read_conversion (loc, init); init = default_function_array_read_conversion (loc, init);
} }
process_init_element (init, false); process_init_element (init, false, braced_init_obstack);
} }
/* Parse a compound statement (possibly a function body) (C90 6.6.2, /* Parse a compound statement (possibly a function body) (C90 6.6.2,
......
...@@ -539,11 +539,11 @@ extern void maybe_warn_string_init (tree, struct c_expr); ...@@ -539,11 +539,11 @@ extern void maybe_warn_string_init (tree, struct c_expr);
extern void start_init (tree, tree, int); extern void start_init (tree, tree, int);
extern void finish_init (void); extern void finish_init (void);
extern void really_start_incremental_init (tree); extern void really_start_incremental_init (tree);
extern void push_init_level (int); extern void push_init_level (int, struct obstack *);
extern struct c_expr pop_init_level (int); extern struct c_expr pop_init_level (int, struct obstack *);
extern void set_init_index (tree, tree); extern void set_init_index (tree, tree, struct obstack *);
extern void set_init_label (tree); extern void set_init_label (tree, struct obstack *);
extern void process_init_element (struct c_expr, bool); extern void process_init_element (struct c_expr, bool, struct obstack *);
extern tree build_compound_literal (location_t, tree, tree, bool); extern tree build_compound_literal (location_t, tree, tree, bool);
extern void check_compound_literal_type (location_t, struct c_type_name *); extern void check_compound_literal_type (location_t, struct c_type_name *);
extern tree c_start_case (location_t, location_t, tree); extern tree c_start_case (location_t, location_t, tree);
......
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