From patchwork Tue Sep 7 15:05:39 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 05:05:39 -0000 From: Arnaud Charlet X-Patchwork-Id: 64029 Message-Id: <20100907150539.GA2877@adacore.com> To: Jakub Jelinek Cc: Mark Mitchell , Jason Merrill , gcc-patches@gcc.gnu.org, Arnaud Charlet > It would be more consistent with other parts of gcc if the new function was > called build_lang_decl_loc, we have lots of *_loc functions that take the > extra location_t argument, but no *_ex functions. Indeed, done. OK for trunk? --- 2010-09-07 Arnaud Charlet * cp-tree.h (build_enumerator): Add new location_t parameter. (build_lang_decl_loc): New function. * decl.c (build_enumerator): New parameter loc. Use it when calling build_decl. Replace build_lang_decl with build_lang_decl_loc. * pt.c (tsubst_enum): Adjust call to build_enumerator. * parser.c (cp_parser_enumerator_definition): Ditto. * lex.c (build_lang_decl_loc): New function. -- Index: decl.c =================================================================== --- decl.c (revision 163920) +++ decl.c (working copy) @@ -11627,10 +11627,11 @@ finish_enum (tree enumtype) /* Build and install a CONST_DECL for an enumeration constant of the enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. + LOC is the location of NAME. Assignment of sequential values by default is handled here. */ void -build_enumerator (tree name, tree value, tree enumtype) +build_enumerator (tree name, tree value, tree enumtype, location_t loc) { tree decl; tree context; @@ -11745,12 +11746,12 @@ build_enumerator (tree name, tree value, if (context && context == current_class_type) /* This enum declaration is local to the class. We need the full lang_decl so that we can record DECL_CLASS_CONTEXT, for example. */ - decl = build_lang_decl (CONST_DECL, name, type); + decl = build_lang_decl_loc (loc, CONST_DECL, name, type); else /* It's a global enum, or it's local to a function. (Note local to - a function could mean local to a class method. */ - decl = build_decl (input_location, CONST_DECL, name, type); - + a function could mean local to a class method. */ + decl = build_decl (loc, CONST_DECL, name, type); + DECL_CONTEXT (decl) = FROB_CONTEXT (context); TREE_CONSTANT (decl) = 1; TREE_READONLY (decl) = 1; Index: ChangeLog =================================================================== --- ChangeLog (revision 163920) +++ ChangeLog (working copy) @@ -1,3 +1,13 @@ +2010-09-07 Arnaud Charlet + + * cp-tree.h (build_enumerator): Add new location_t parameter. + (build_lang_decl_loc): New function. + * decl.c (build_enumerator): New parameter loc. Use it when calling + build_decl. Replace build_lang_decl with build_lang_decl_loc. + * pt.c (tsubst_enum): Adjust call to build_enumerator. + * parser.c (cp_parser_enumerator_definition): Ditto. + * lex.c (build_lang_decl_loc): New function. + 2010-09-06 Arnaud Charlet * parser.c (make_pointer_declarator, make_reference_declarator, Index: pt.c =================================================================== --- pt.c (revision 163920) +++ pt.c (working copy) @@ -17294,7 +17294,8 @@ tsubst_enum (tree tag, tree newtag, tree set_current_access_from_decl (decl); /* Actually build the enumerator itself. */ - build_enumerator (DECL_NAME (decl), value, newtag); + build_enumerator + (DECL_NAME (decl), value, newtag, DECL_SOURCE_LOCATION (decl)); } finish_enum (newtag); Index: parser.c =================================================================== --- parser.c (revision 163920) +++ parser.c (working copy) @@ -13135,6 +13135,11 @@ cp_parser_enumerator_definition (cp_pars { tree identifier; tree value; + location_t loc; + + /* Save the input location because we are interested in the location + of the identifier and not the location of the explicit value. */ + loc = cp_lexer_peek_token (parser->lexer)->location; /* Look for the identifier. */ identifier = cp_parser_identifier (parser); @@ -13160,7 +13165,7 @@ cp_parser_enumerator_definition (cp_pars value = error_mark_node; /* Create the enumerator. */ - build_enumerator (identifier, value, type); + build_enumerator (identifier, value, type, loc); } /* Parse a namespace-name. Index: cp-tree.h =================================================================== --- cp-tree.h (revision 163920) +++ cp-tree.h (working copy) @@ -4771,7 +4771,7 @@ extern tree xref_tag_from_type (tree, extern bool xref_basetypes (tree, tree); extern tree start_enum (tree, tree, bool); extern void finish_enum (tree); -extern void build_enumerator (tree, tree, tree); +extern void build_enumerator (tree, tree, tree, location_t); extern tree lookup_enumerator (tree, tree); extern void start_preparsed_function (tree, tree, int); extern int start_function (cp_decl_specifier_seq *, const cp_declarator *, tree); @@ -4943,6 +4943,7 @@ extern void yyungetc (int, int); extern tree unqualified_name_lookup_error (tree); extern tree unqualified_fn_lookup_error (tree); extern tree build_lang_decl (enum tree_code, tree, tree); +extern tree build_lang_decl_loc (location_t, enum tree_code, tree, tree); extern void retrofit_lang_decl (tree); extern tree copy_decl (tree); extern tree copy_type (tree); Index: lex.c =================================================================== --- lex.c (revision 163920) +++ lex.c (working copy) @@ -507,13 +507,25 @@ unqualified_fn_lookup_error (tree name) return unqualified_name_lookup_error (name); } +/* Wrapper around build_lang_decl_loc(). Should gradually move to + build_lang_decl_loc() and then rename build_lang_decl_loc() back to + build_lang_decl(). */ + tree build_lang_decl (enum tree_code code, tree name, tree type) { + return build_lang_decl_loc (input_location, code, name, type); +} + +/* Build a decl from CODE, NAME, TYPE declared at LOC, and then add + DECL_LANG_SPECIFIC info to the result. */ + +tree +build_lang_decl_loc (location_t loc, enum tree_code code, tree name, tree type) +{ tree t; - t = build_decl (input_location, - code, name, type); + t = build_decl (loc, code, name, type); retrofit_lang_decl (t); return t;