From patchwork Tue Sep 7 18:41:07 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [C] use better sloc for enum literals Date: Tue, 07 Sep 2010 08:41:07 -0000 From: Arnaud Charlet X-Patchwork-Id: 64050 Message-Id: <20100907184107.GA3907@adacore.com> To: gcc-patches@gcc.gnu.org, joseph@codesourcery.com, rth@redhat.com This is the C front-end patch corresponding to the following C++ change: http://gcc.gnu.org/ml/gcc-patches/2010-09/msg00520.html This is for setting the sloc of an enum literal decl to its declaration rather than to the location of the '=' operator (when present) as in: enum enum1 { FOO = 1, BAR = 2 }; This patch keeps the current behavior when generating error messages related to the enum values which point to the '=' operator sloc, so no tests are impacted. Tested on x86_64-pc-linux-gnu, OK for trunk? 2010-09-07 Arnaud Charlet * c-tree.h, c-decl.c (build_enumerator): Add location parameter. * c-parser.c (c_parser_enum_specifier): Adjust call to build_enumerator. --- Index: c-tree.h =================================================================== --- c-tree.h (revision 163920) +++ c-tree.h (working copy) @@ -427,7 +427,8 @@ extern int quals_from_declspecs (const s extern struct c_declarator *build_array_declarator (location_t, tree, struct c_declspecs *, bool, bool); -extern tree build_enumerator (location_t, struct c_enum_contents *, tree, tree); +extern tree build_enumerator (location_t, location_t, struct c_enum_contents *, + tree, tree); extern tree check_for_loop_decls (location_t); extern void mark_forward_parm_decls (void); extern void declare_parm_level (void); Index: c-decl.c =================================================================== --- c-decl.c (revision 163920) +++ c-decl.c (working copy) @@ -7343,12 +7343,13 @@ finish_enum (tree enumtype, tree values, /* Build and install a CONST_DECL for one value of the current enumeration type (one that was begun with start_enum). - LOC is the location of the enumerator. + DECL_LOC is the location of the enumerator. + LOC is the location of the '=' operator if any, DECL_LOC otherwise. Return a tree-list containing the CONST_DECL and its value. Assignment of sequential values by default is handled here. */ tree -build_enumerator (location_t loc, +build_enumerator (location_t decl_loc, location_t loc, struct c_enum_contents *the_enum, tree name, tree value) { tree decl, type; @@ -7436,7 +7437,7 @@ build_enumerator (location_t loc, >= TYPE_PRECISION (integer_type_node) && TYPE_UNSIGNED (type))); - decl = build_decl (loc, CONST_DECL, name, type); + decl = build_decl (decl_loc, CONST_DECL, name, type); DECL_INITIAL (decl) = convert (type, value); pushdecl (decl); Index: c-parser.c =================================================================== --- c-parser.c (revision 163920) +++ c-parser.c (working copy) @@ -1833,7 +1833,7 @@ c_parser_enum_specifier (c_parser *parse bool seen_comma; c_token *token; location_t comma_loc = UNKNOWN_LOCATION; /* Quiet warning. */ - location_t value_loc; + location_t decl_loc, value_loc; if (c_parser_next_token_is_not (parser, CPP_NAME)) { c_parser_error (parser, "expected identifier"); @@ -1845,7 +1845,7 @@ c_parser_enum_specifier (c_parser *parse enum_id = token->value; /* Set the location in case we create a decl now. */ c_parser_set_source_position_from_token (token); - value_loc = token->location; + decl_loc = value_loc = token->location; c_parser_consume_token (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { @@ -1855,7 +1855,7 @@ c_parser_enum_specifier (c_parser *parse } else enum_value = NULL_TREE; - enum_decl = build_enumerator (value_loc, + enum_decl = build_enumerator (decl_loc, value_loc, &the_enum, enum_id, enum_value); TREE_CHAIN (enum_decl) = values; values = enum_decl;