Patchwork [C] use better sloc for enum literals

login
register
mail settings
Submitter Arnaud Charlet
Date Sept. 7, 2010, 6:41 p.m.
Message ID <20100907184107.GA3907@adacore.com>
Download mbox | patch
Permalink /patch/64050/
State New
Headers show

Comments

Arnaud Charlet - Sept. 7, 2010, 6:41 p.m.
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.

--
Joseph S. Myers - Sept. 7, 2010, 7:59 p.m.
On Tue, 7 Sep 2010, Arnaud Charlet wrote:

> 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.

OK.

Patch

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;