cp-tree.h (build_enumerator): Add new location_t parameter.

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

From-SVN: r163959
This commit is contained in:
Arnaud Charlet 2010-09-07 16:12:09 +00:00 committed by Arnaud Charlet
parent 86e033e21a
commit 4cc2a7227a
6 changed files with 40 additions and 10 deletions

View File

@ -1,3 +1,13 @@
2010-09-07 Arnaud Charlet <charlet@adacore.com>
* 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 Dodji Seketeli <dodji@redhat.com>
PR c++/45200

View File

@ -4771,7 +4771,7 @@ extern tree xref_tag_from_type (tree, tree, tag_scope);
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);

View File

@ -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, tree enumtype)
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;

View File

@ -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;

View File

@ -13135,6 +13135,11 @@ cp_parser_enumerator_definition (cp_parser* parser, tree type)
{
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_parser* parser, tree type)
value = error_mark_node;
/* Create the enumerator. */
build_enumerator (identifier, value, type);
build_enumerator (identifier, value, type, loc);
}
/* Parse a namespace-name.

View File

@ -17294,7 +17294,8 @@ tsubst_enum (tree tag, tree newtag, tree args)
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);