This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C patch] use better sloc for enum literals
- From: Arnaud Charlet <charlet at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org, joseph at codesourcery dot com, rth at redhat dot com
- Date: Tue, 7 Sep 2010 20:41:07 +0200
- Subject: [C patch] use better sloc for enum literals
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 <charlet@adacore.com>
* 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;