c++: Cleanup some decl pushing apis
In cleaning up local decl handling, here's an initial patch that takes advantage of C++'s default args for the is_friend parm of pushdecl, duplicate_decls and push_template_decl_real and the scope & tpl_header parms of xref_tag. Then many of the calls simply not mention these. I also rename push_template_decl_real to push_template_decl, deleting the original forwarding function. This'll make my later patches changing their types less intrusive. There are 2 functional changes: 1) push_template_decl requires is_friend to be correct, it doesn't go checking for a friend function (an assert is added). 2) debug_overload prints out Hidden and Using markers for the overload set. gcc/cp/ * cp-tree.h (duplicate_decls): Default is_friend to false. (xref_tag): Default tag_scope & tpl_header_p to ts_current & false. (push_template_decl_real): Default is_friend to false. Rename to ... (push_template_decl): ... here. Delete original decl. * name-lookup.h (pushdecl_namespace_level): Default is_friend to false. (pushtag): Default tag_scope to ts_current. * coroutines.cc (morph_fn_to_coro): Drop default args to xref_tag. * decl.c (start_decl): Drop default args to duplicate_decls. (start_enum): Drop default arg to pushtag & xref_tag. (start_preparsed_function): Pass DECL_FRIEND_P to push_template_decl. (grokmethod): Likewise. * friend.c (do_friend): Rename push_template_decl_real calls. * lambda.c (begin_lamnbda_type): Drop default args to xref_tag. (vla_capture_type): Likewise. * name-lookup.c (maybe_process_template_type_declaration): Rename push_template_decl_real call. (pushdecl_top_level_and_finish): Drop default arg to pushdecl_namespace_level. * pt.c (push_template_decl_real): Assert no surprising friend functions. Rename to ... (push_template_decl): ... here. Delete original function. (lookup_template_class_1): Drop default args from pushtag. (instantiate_class_template_1): Likewise. * ptree.c (debug_overload): Print hidden and using markers. * rtti.c (init_rtti_processing): Drop refault args from xref_tag. (build_dynamic_cast_1, tinfo_base_init): Likewise. * semantics.c (begin_class_definition): Drop default args to pushtag. gcc/objcp/ * objcp-decl.c (objcp_start_struct): Drop default args to xref_tag. (objcp_xref_tag): Likewise. libcc1/ * libcp1plugin.cc (supplement_binding): Drop default args to duplicate_decls. (safe_pushtag): Drop scope parm. Drop default args to pushtag. (safe_pushdecl_maybe_friend): Rename to ... (safe_pushdecl): ... here. Drop is_friend parm. Drop default args to pushdecl. (plugin_build_decl): Adjust safe_pushdecl & safe_pushtag calls. (plugin_build_constant): Adjust safe_pushdecl call.
This commit is contained in:
parent
6b6c89b37b
commit
d13c0ae859
13 changed files with 52 additions and 58 deletions
|
@ -4011,7 +4011,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
|
|||
/* 2. Types we need to define or look up. */
|
||||
|
||||
tree fr_name = get_fn_local_identifier (orig, "frame");
|
||||
tree coro_frame_type = xref_tag (record_type, fr_name, ts_current, false);
|
||||
tree coro_frame_type = xref_tag (record_type, fr_name);
|
||||
DECL_CONTEXT (TYPE_NAME (coro_frame_type)) = current_scope ();
|
||||
tree coro_frame_ptr = build_pointer_type (coro_frame_type);
|
||||
tree act_des_fn_type
|
||||
|
|
|
@ -6461,7 +6461,8 @@ extern void note_iteration_stmt_body_end (bool);
|
|||
extern void determine_local_discriminator (tree);
|
||||
extern int decls_match (tree, tree, bool = true);
|
||||
extern bool maybe_version_functions (tree, tree, bool);
|
||||
extern tree duplicate_decls (tree, tree, bool);
|
||||
extern tree duplicate_decls (tree, tree,
|
||||
bool is_friend = false);
|
||||
extern tree declare_local_label (tree);
|
||||
extern tree define_label (location_t, tree);
|
||||
extern void check_goto (tree);
|
||||
|
@ -6501,7 +6502,9 @@ extern tree get_scope_of_declarator (const cp_declarator *);
|
|||
extern void grok_special_member_properties (tree);
|
||||
extern bool grok_ctor_properties (const_tree, const_tree);
|
||||
extern bool grok_op_properties (tree, bool);
|
||||
extern tree xref_tag (enum tag_types, tree, tag_scope, bool);
|
||||
extern tree xref_tag (tag_types, tree,
|
||||
tag_scope = ts_current,
|
||||
bool tpl_header_p = false);
|
||||
extern void xref_basetypes (tree, tree);
|
||||
extern tree start_enum (tree, tree, tree, tree, bool, bool *);
|
||||
extern void finish_enum_value_list (tree);
|
||||
|
@ -6849,8 +6852,7 @@ extern void end_template_parm_list (void);
|
|||
extern void end_template_decl (void);
|
||||
extern tree maybe_update_decl_type (tree, tree);
|
||||
extern bool check_default_tmpl_args (tree, tree, bool, bool, int);
|
||||
extern tree push_template_decl (tree);
|
||||
extern tree push_template_decl_real (tree, bool);
|
||||
extern tree push_template_decl (tree, bool is_friend = false);
|
||||
extern tree add_inherited_template_parms (tree, tree);
|
||||
extern void template_parm_level_and_index (tree, int*, int*);
|
||||
extern bool redeclare_class_template (tree, tree, tree);
|
||||
|
|
|
@ -5361,8 +5361,7 @@ start_decl (const cp_declarator *declarator,
|
|||
about this situation, and so we check here. */
|
||||
if (initialized && DECL_INITIALIZED_IN_CLASS_P (field))
|
||||
error ("duplicate initialization of %qD", decl);
|
||||
field = duplicate_decls (decl, field,
|
||||
/*newdecl_is_friend=*/false);
|
||||
field = duplicate_decls (decl, field);
|
||||
if (field == error_mark_node)
|
||||
return error_mark_node;
|
||||
else if (field)
|
||||
|
@ -5376,8 +5375,7 @@ start_decl (const cp_declarator *declarator,
|
|||
? current_template_parms
|
||||
: NULL_TREE);
|
||||
if (field && field != error_mark_node
|
||||
&& duplicate_decls (decl, field,
|
||||
/*newdecl_is_friend=*/false))
|
||||
&& duplicate_decls (decl, field))
|
||||
decl = field;
|
||||
}
|
||||
|
||||
|
@ -15476,7 +15474,7 @@ start_enum (tree name, tree enumtype, tree underlying_type,
|
|||
|| TREE_CODE (enumtype) != ENUMERAL_TYPE)
|
||||
{
|
||||
enumtype = cxx_make_type (ENUMERAL_TYPE);
|
||||
enumtype = pushtag (name, enumtype, /*tag_scope=*/ts_current);
|
||||
enumtype = pushtag (name, enumtype);
|
||||
|
||||
/* std::byte aliases anything. */
|
||||
if (enumtype != error_mark_node
|
||||
|
@ -15485,8 +15483,7 @@ start_enum (tree name, tree enumtype, tree underlying_type,
|
|||
TYPE_ALIAS_SET (enumtype) = 0;
|
||||
}
|
||||
else
|
||||
enumtype = xref_tag (enum_type, name, /*tag_scope=*/ts_current,
|
||||
false);
|
||||
enumtype = xref_tag (enum_type, name);
|
||||
|
||||
if (enumtype == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
@ -16257,7 +16254,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
|
|||
by push_nested_class.) */
|
||||
if (processing_template_decl)
|
||||
{
|
||||
tree newdecl1 = push_template_decl (decl1);
|
||||
tree newdecl1 = push_template_decl (decl1, DECL_FRIEND_P (decl1));
|
||||
if (newdecl1 == error_mark_node)
|
||||
{
|
||||
if (ctype || DECL_STATIC_FUNCTION_P (decl1))
|
||||
|
@ -17362,7 +17359,7 @@ grokmethod (cp_decl_specifier_seq *declspecs,
|
|||
/* We process method specializations in finish_struct_1. */
|
||||
if (processing_template_decl && !DECL_TEMPLATE_SPECIALIZATION (fndecl))
|
||||
{
|
||||
fndecl = push_template_decl (fndecl);
|
||||
fndecl = push_template_decl (fndecl, DECL_FRIEND_P (fndecl));
|
||||
if (fndecl == error_mark_node)
|
||||
return fndecl;
|
||||
}
|
||||
|
|
|
@ -558,7 +558,7 @@ do_friend (tree ctype, tree declarator, tree decl,
|
|||
else if (class_template_depth)
|
||||
/* We rely on tsubst_friend_function to check the
|
||||
validity of the declaration later. */
|
||||
decl = push_template_decl_real (decl, /*is_friend=*/true);
|
||||
decl = push_template_decl (decl, /*is_friend=*/true);
|
||||
else
|
||||
decl = check_classfn (ctype, decl,
|
||||
template_member_p
|
||||
|
@ -611,7 +611,7 @@ do_friend (tree ctype, tree declarator, tree decl,
|
|||
general, such a declaration depends on template
|
||||
parameters. Instead, we call pushdecl when the class
|
||||
is instantiated. */
|
||||
decl = push_template_decl_real (decl, /*is_friend=*/true);
|
||||
decl = push_template_decl (decl, /*is_friend=*/true);
|
||||
else if (current_function_decl)
|
||||
/* pushdecl will check there's a local decl already. */
|
||||
decl = pushdecl (decl, /*is_friend=*/true);
|
||||
|
|
|
@ -134,8 +134,7 @@ begin_lambda_type (tree lambda)
|
|||
IDENTIFIER_LAMBDA_P (name) = true;
|
||||
|
||||
/* Create the new RECORD_TYPE for this lambda. */
|
||||
tree type = xref_tag (/*tag_code=*/record_type, name,
|
||||
/*scope=*/ts_current, /*template_header_p=*/false);
|
||||
tree type = xref_tag (/*tag_code=*/record_type, name);
|
||||
if (type == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
|
@ -476,7 +475,7 @@ static GTY(()) tree max_id;
|
|||
static tree
|
||||
vla_capture_type (tree array_type)
|
||||
{
|
||||
tree type = xref_tag (record_type, make_anon_name (), ts_current, false);
|
||||
tree type = xref_tag (record_type, make_anon_name ());
|
||||
xref_basetypes (type, NULL_TREE);
|
||||
type = begin_class_definition (type);
|
||||
if (!ptr_id)
|
||||
|
|
|
@ -6723,11 +6723,11 @@ maybe_process_template_type_declaration (tree type, int is_friend,
|
|||
|
||||
if (processing_template_decl)
|
||||
{
|
||||
/* This may change after the call to
|
||||
push_template_decl_real, but we want the original value. */
|
||||
/* This may change after the call to push_template_decl, but
|
||||
we want the original value. */
|
||||
tree name = DECL_NAME (decl);
|
||||
|
||||
decl = push_template_decl_real (decl, is_friend);
|
||||
decl = push_template_decl (decl, is_friend);
|
||||
if (decl == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
|
@ -7301,7 +7301,7 @@ pushdecl_top_level_and_finish (tree x, tree init)
|
|||
{
|
||||
bool subtime = timevar_cond_start (TV_NAME_LOOKUP);
|
||||
do_push_to_top_level ();
|
||||
x = pushdecl_namespace_level (x, false);
|
||||
x = pushdecl_namespace_level (x);
|
||||
cp_finish_decl (x, init, false, NULL_TREE, 0);
|
||||
do_pop_from_top_level ();
|
||||
timevar_cond_stop (TV_NAME_LOOKUP, subtime);
|
||||
|
|
|
@ -341,7 +341,7 @@ extern tree lookup_qualified_name (tree scope, const char *name,
|
|||
bool = true);
|
||||
extern bool is_local_extern (tree);
|
||||
extern bool pushdecl_class_level (tree);
|
||||
extern tree pushdecl_namespace_level (tree, bool);
|
||||
extern tree pushdecl_namespace_level (tree, bool is_friend = false);
|
||||
extern bool push_class_level_binding (tree, tree);
|
||||
extern tree get_local_decls ();
|
||||
extern int function_parm_depth (void);
|
||||
|
@ -371,7 +371,7 @@ extern tree pushdecl (tree, bool is_friend = false);
|
|||
extern tree pushdecl_outermost_localscope (tree);
|
||||
extern tree pushdecl_top_level (tree, bool is_friend = false);
|
||||
extern tree pushdecl_top_level_and_finish (tree, tree);
|
||||
extern tree pushtag (tree, tree, tag_scope);
|
||||
extern tree pushtag (tree, tree, tag_scope = ts_current);
|
||||
extern int push_namespace (tree, bool make_inline = false);
|
||||
extern void pop_namespace (void);
|
||||
extern void push_nested_namespace (tree);
|
||||
|
|
19
gcc/cp/pt.c
19
gcc/cp/pt.c
|
@ -5669,7 +5669,7 @@ template_parm_outer_level (tree t, void *data)
|
|||
If IS_FRIEND is true, DECL is a friend declaration. */
|
||||
|
||||
tree
|
||||
push_template_decl_real (tree decl, bool is_friend)
|
||||
push_template_decl (tree decl, bool is_friend)
|
||||
{
|
||||
tree tmpl;
|
||||
tree args;
|
||||
|
@ -5694,8 +5694,10 @@ push_template_decl_real (tree decl, bool is_friend)
|
|||
&& DECL_TEMPLATE_SPECIALIZATION (decl)
|
||||
&& TINFO_USED_TEMPLATE_ID (DECL_TEMPLATE_INFO (decl))));
|
||||
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FRIEND_P (decl))
|
||||
is_friend = true;
|
||||
/* No surprising friend functions. */
|
||||
gcc_checking_assert (is_friend
|
||||
|| !(TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& DECL_FRIEND_P (decl)));
|
||||
|
||||
if (is_friend)
|
||||
/* For a friend, we want the context of the friend, not
|
||||
|
@ -6096,12 +6098,6 @@ push_template_decl_real (tree decl, bool is_friend)
|
|||
return DECL_TEMPLATE_RESULT (tmpl);
|
||||
}
|
||||
|
||||
tree
|
||||
push_template_decl (tree decl)
|
||||
{
|
||||
return push_template_decl_real (decl, false);
|
||||
}
|
||||
|
||||
/* FN is an inheriting constructor that inherits from the constructor
|
||||
template INHERITED; turn FN into a constructor template with a matching
|
||||
template header. */
|
||||
|
@ -9943,7 +9939,7 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
|
|||
|
||||
/* A local class. Make sure the decl gets registered properly. */
|
||||
if (context == current_function_decl)
|
||||
if (pushtag (DECL_NAME (gen_tmpl), t, /*tag_scope=*/ts_current)
|
||||
if (pushtag (DECL_NAME (gen_tmpl), t)
|
||||
== error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
|
@ -11897,7 +11893,7 @@ instantiate_class_template_1 (tree type)
|
|||
tsubst_enum. */
|
||||
if (name)
|
||||
SET_IDENTIFIER_TYPE_VALUE (name, newtag);
|
||||
pushtag (name, newtag, /*tag_scope=*/ts_current);
|
||||
pushtag (name, newtag);
|
||||
}
|
||||
}
|
||||
else if (DECL_DECLARES_FUNCTION_P (t))
|
||||
|
@ -12077,6 +12073,7 @@ instantiate_class_template_1 (tree type)
|
|||
/* friend class C<T>; */
|
||||
friend_type = tsubst (friend_type, args,
|
||||
tf_warning_or_error, NULL_TREE);
|
||||
|
||||
/* Otherwise it's
|
||||
|
||||
friend class C;
|
||||
|
|
|
@ -332,8 +332,12 @@ debug_overload (tree node)
|
|||
tree decl = *iter;
|
||||
auto xloc = expand_location (DECL_SOURCE_LOCATION (decl));
|
||||
auto fullname = decl_as_string (decl, 0);
|
||||
bool using_p = iter.using_p ();
|
||||
bool hidden_p = iter.hidden_p ();
|
||||
|
||||
fprintf (file, "%p: %s:%d:%d \"%s\"\n", (void *)decl,
|
||||
fprintf (file, "%p:%c%c %s:%d:%d \"%s\"\n", (void *)decl,
|
||||
hidden_p ? 'H' : '-',
|
||||
using_p ? 'U' : '-',
|
||||
xloc.file, xloc.line, xloc.column, fullname);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -169,8 +169,7 @@ init_rtti_processing (void)
|
|||
tree type_info_type;
|
||||
|
||||
push_nested_namespace (std_node);
|
||||
type_info_type = xref_tag (class_type, get_identifier ("type_info"),
|
||||
/*tag_scope=*/ts_current, false);
|
||||
type_info_type = xref_tag (class_type, get_identifier ("type_info"));
|
||||
pop_nested_namespace (std_node);
|
||||
const_type_info_type_node
|
||||
= cp_build_qualified_type (type_info_type, TYPE_QUAL_CONST);
|
||||
|
@ -761,9 +760,7 @@ build_dynamic_cast_1 (location_t loc, tree type, tree expr,
|
|||
|
||||
push_abi_namespace ();
|
||||
tinfo_ptr = xref_tag (class_type,
|
||||
get_identifier ("__class_type_info"),
|
||||
/*tag_scope=*/ts_current, false);
|
||||
|
||||
get_identifier ("__class_type_info"));
|
||||
tinfo_ptr = build_pointer_type
|
||||
(cp_build_qualified_type
|
||||
(tinfo_ptr, TYPE_QUAL_CONST));
|
||||
|
@ -948,10 +945,8 @@ tinfo_base_init (tinfo_s *ti, tree target)
|
|||
vtable_ptr = ti->vtable;
|
||||
if (!vtable_ptr)
|
||||
{
|
||||
tree real_type;
|
||||
push_abi_namespace ();
|
||||
real_type = xref_tag (class_type, ti->name,
|
||||
/*tag_scope=*/ts_current, false);
|
||||
tree real_type = xref_tag (class_type, ti->name);
|
||||
pop_abi_namespace ();
|
||||
|
||||
if (!COMPLETE_TYPE_P (real_type))
|
||||
|
|
|
@ -3216,13 +3216,13 @@ begin_class_definition (tree t)
|
|||
if (t == error_mark_node || ! MAYBE_CLASS_TYPE_P (t))
|
||||
{
|
||||
t = make_class_type (RECORD_TYPE);
|
||||
pushtag (make_anon_name (), t, /*tag_scope=*/ts_current);
|
||||
pushtag (make_anon_name (), t);
|
||||
}
|
||||
|
||||
if (TYPE_BEING_DEFINED (t))
|
||||
{
|
||||
t = make_class_type (TREE_CODE (t));
|
||||
pushtag (TYPE_IDENTIFIER (t), t, /*tag_scope=*/ts_current);
|
||||
pushtag (TYPE_IDENTIFIER (t), t);
|
||||
}
|
||||
maybe_process_partial_specialization (t);
|
||||
pushclass (t);
|
||||
|
|
|
@ -41,7 +41,7 @@ objcp_start_struct (location_t loc ATTRIBUTE_UNUSED,
|
|||
if (!name)
|
||||
name = make_anon_name ();
|
||||
|
||||
s = xref_tag (record_type, name, ts_global, 0);
|
||||
s = xref_tag (record_type, name, ts_global);
|
||||
CLASSTYPE_DECLARED_CLASS (s) = 0; /* this is a 'struct', not a 'class'. */
|
||||
xref_basetypes (s, NULL_TREE); /* no base classes here! */
|
||||
|
||||
|
@ -84,7 +84,7 @@ objcp_finish_function (void)
|
|||
tree
|
||||
objcp_xref_tag (enum tree_code code ATTRIBUTE_UNUSED, tree name)
|
||||
{
|
||||
return xref_tag (record_type, name, ts_global, false);
|
||||
return xref_tag (record_type, name, ts_global);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -407,7 +407,7 @@ supplement_binding (cxx_binding *binding, tree decl)
|
|||
&& DECL_EXTERNAL (target_decl) && DECL_EXTERNAL (target_bval)
|
||||
&& !DECL_CLASS_SCOPE_P (target_decl))
|
||||
{
|
||||
duplicate_decls (decl, binding->value, /*newdecl_is_friend=*/false);
|
||||
duplicate_decls (decl, binding->value);
|
||||
ok = false;
|
||||
}
|
||||
else if (TREE_CODE (decl) == NAMESPACE_DECL
|
||||
|
@ -785,14 +785,14 @@ safe_push_template_decl (tree decl)
|
|||
}
|
||||
|
||||
static inline tree
|
||||
safe_pushtag (tree name, tree type, tag_scope scope)
|
||||
safe_pushtag (tree name, tree type)
|
||||
{
|
||||
void (*save_oracle) (enum cp_oracle_request, tree identifier);
|
||||
|
||||
save_oracle = cp_binding_oracle;
|
||||
cp_binding_oracle = NULL;
|
||||
|
||||
tree ret = pushtag (name, type, scope);
|
||||
tree ret = pushtag (name, type);
|
||||
|
||||
cp_binding_oracle = save_oracle;
|
||||
|
||||
|
@ -800,14 +800,14 @@ safe_pushtag (tree name, tree type, tag_scope scope)
|
|||
}
|
||||
|
||||
static inline tree
|
||||
safe_pushdecl_maybe_friend (tree decl, bool is_friend)
|
||||
safe_pushdecl (tree decl)
|
||||
{
|
||||
void (*save_oracle) (enum cp_oracle_request, tree identifier);
|
||||
|
||||
save_oracle = cp_binding_oracle;
|
||||
cp_binding_oracle = NULL;
|
||||
|
||||
tree ret = pushdecl (decl, is_friend);
|
||||
tree ret = pushdecl (decl);
|
||||
|
||||
cp_binding_oracle = save_oracle;
|
||||
|
||||
|
@ -1514,7 +1514,7 @@ plugin_build_decl (cc1_plugin::connection *self,
|
|||
if (template_decl_p)
|
||||
{
|
||||
if (RECORD_OR_UNION_CODE_P (code))
|
||||
safe_pushtag (identifier, TREE_TYPE (decl), ts_current);
|
||||
safe_pushtag (identifier, TREE_TYPE (decl));
|
||||
else
|
||||
decl = safe_push_template_decl (decl);
|
||||
|
||||
|
@ -1533,11 +1533,11 @@ plugin_build_decl (cc1_plugin::connection *self,
|
|||
finish_member_declaration (tdecl);
|
||||
}
|
||||
else if (RECORD_OR_UNION_CODE_P (code))
|
||||
safe_pushtag (identifier, TREE_TYPE (decl), ts_current);
|
||||
safe_pushtag (identifier, TREE_TYPE (decl));
|
||||
else if (class_member_p)
|
||||
finish_member_declaration (decl);
|
||||
else
|
||||
decl = safe_pushdecl_maybe_friend (decl, false);
|
||||
decl = safe_pushdecl (decl);
|
||||
|
||||
if ((ctor || dtor)
|
||||
/* Don't crash after a duplicate declaration of a cdtor. */
|
||||
|
@ -3608,7 +3608,7 @@ plugin_build_constant (cc1_plugin::connection *self, gcc_type type_in,
|
|||
TREE_STATIC (decl) = 1;
|
||||
TREE_READONLY (decl) = 1;
|
||||
cp_finish_decl (decl, cst, true, NULL, LOOKUP_ONLYCONVERTING);
|
||||
safe_pushdecl_maybe_friend (decl, false);
|
||||
safe_pushdecl (decl);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue