From 7114359fb661692c92e7d57f7cb96a8787eb0db3 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 4 Jun 2007 23:19:19 +0000 Subject: [PATCH] c-tree.h (start_enum): Update. * c-tree.h (start_enum): Update. (build_enumerator): Likewise. * c-decl.c (enum_next_value): Removed. (enum_overflow): Likewise. (start_enum): Add c_enum_contents argument. Don't use globals. (build_enumerator): Likewise. * c-tree.h (struct c_enum_contents): New struct. From-SVN: r125322 --- gcc/ChangeLog | 10 ++++++++++ gcc/c-decl.c | 29 +++++++++-------------------- gcc/c-parser.c | 7 ++++--- gcc/c-tree.h | 17 ++++++++++++++--- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e4c31ffd03d..98212c37554 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2007-06-04 Tom Tromey + + * c-tree.h (start_enum): Update. + (build_enumerator): Likewise. + * c-decl.c (enum_next_value): Removed. + (enum_overflow): Likewise. + (start_enum): Add c_enum_contents argument. Don't use globals. + (build_enumerator): Likewise. + * c-tree.h (struct c_enum_contents): New struct. + 2007-06-04 Tom Tromey * c-common.c (c_common_get_alias_set): Fix indentation. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 1f8943f05a7..838869c1782 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -81,18 +81,6 @@ location_t pending_invalid_xref_location; /* True means we've initialized exception handling. */ bool c_eh_initialized_p; -/* While defining an enum type, this is 1 plus the last enumerator - constant value. Note that will do not have to save this or `enum_overflow' - around nested function definition since such a definition could only - occur in an enum value expression and we don't use these variables in - that case. */ - -static tree enum_next_value; - -/* Nonzero means that there was overflow computing enum_next_value. */ - -static int enum_overflow; - /* The file and line that the prototype came from if this is an old-style definition; used for diagnostics in store_parm_decls_oldstyle. */ @@ -5801,7 +5789,7 @@ layout_array_type (tree t) may be used to declare the individual values as they are read. */ tree -start_enum (tree name) +start_enum (struct c_enum_contents *the_enum, tree name) { tree enumtype = 0; @@ -5833,8 +5821,8 @@ start_enum (tree name) TYPE_VALUES (enumtype) = 0; } - enum_next_value = integer_zero_node; - enum_overflow = 0; + the_enum->enum_next_value = integer_zero_node; + the_enum->enum_overflow = 0; if (flag_short_enums) TYPE_PACKED (enumtype) = 1; @@ -5987,7 +5975,7 @@ finish_enum (tree enumtype, tree values, tree attributes) Assignment of sequential values by default is handled here. */ tree -build_enumerator (tree name, tree value) +build_enumerator (struct c_enum_contents *the_enum, tree name, tree value) { tree decl, type; @@ -6017,8 +6005,8 @@ build_enumerator (tree name, tree value) in the default. */ if (value == 0) { - value = enum_next_value; - if (enum_overflow) + value = the_enum->enum_next_value; + if (the_enum->enum_overflow) error ("overflow in enumeration values"); } @@ -6031,8 +6019,9 @@ build_enumerator (tree name, tree value) } /* Set basis for default for next value. */ - enum_next_value = build_binary_op (PLUS_EXPR, value, integer_one_node, 0); - enum_overflow = tree_int_cst_lt (enum_next_value, value); + the_enum->enum_next_value = build_binary_op (PLUS_EXPR, value, + integer_one_node, 0); + the_enum->enum_overflow = tree_int_cst_lt (the_enum->enum_next_value, value); /* Now create a declaration for the enum value name. */ diff --git a/gcc/c-parser.c b/gcc/c-parser.c index b1f40a47faa..39c63d5945a 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -1,6 +1,6 @@ /* Parser for C and Objective-C. Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. Parser actions based on the old Bison parser; structure somewhat influenced by and fragments based on the C++ parser. @@ -1698,7 +1698,8 @@ c_parser_enum_specifier (c_parser *parser) if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) { /* Parse an enum definition. */ - tree type = start_enum (ident); + struct c_enum_contents the_enum; + tree type = start_enum (&the_enum, ident); tree postfix_attrs; /* We chain the enumerators in reverse order, then put them in forward order at the end. */ @@ -1726,7 +1727,7 @@ c_parser_enum_specifier (c_parser *parser) } else enum_value = NULL_TREE; - enum_decl = build_enumerator (enum_id, enum_value); + enum_decl = build_enumerator (&the_enum, enum_id, enum_value); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git a/gcc/c-tree.h b/gcc/c-tree.h index b2fe22893c4..e5f4a153fd5 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -1,6 +1,6 @@ /* Definitions for C parsing and type checking. Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of GCC. @@ -425,6 +425,17 @@ struct c_label_context_vm struct c_label_context_vm *next; }; +/* Used when parsing an enum. Initialized by start_enum. */ +struct c_enum_contents +{ + /* While defining an enum type, this is 1 plus the last enumerator + constant value. */ + tree enum_next_value; + + /* Nonzero means that there was overflow computing enum_next_value. */ + int enum_overflow; +}; + /* in c-parser.c */ extern void c_parse_init (void); @@ -448,7 +459,7 @@ extern void c_print_identifier (FILE *, tree, int); extern int quals_from_declspecs (const struct c_declspecs *); extern struct c_declarator *build_array_declarator (tree, struct c_declspecs *, bool, bool); -extern tree build_enumerator (tree, tree); +extern tree build_enumerator (struct c_enum_contents *, tree, tree); extern tree check_for_loop_decls (void); extern void mark_forward_parm_decls (void); extern void declare_parm_level (void); @@ -476,7 +487,7 @@ extern struct c_declarator *set_array_declarator_inner (struct c_declarator *, extern tree c_builtin_function (tree); extern void shadow_tag (const struct c_declspecs *); extern void shadow_tag_warned (const struct c_declspecs *, int); -extern tree start_enum (tree); +extern tree start_enum (struct c_enum_contents *, tree); extern int start_function (struct c_declspecs *, struct c_declarator *, tree); extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool, tree);