c++: Kill DECL_ANTICIPATED

Here's the patch to remove DECL_ANTICIPATED, and with it hiddenness is
managed entirely in the symbol table.  Sadly I couldn't get rid of the
actual field without more investigation -- it's repurposed for
OMP_PRIVATIZED_MEMBER.  It looks like a the VAR-related flags in
lang_decl_base are not completely orthogonal, so perhaps some can be
turned into an enumeration or something.  But that's more than I want
to do right now.

DECL_FRIEND_P Is still slightly suspect as it appears to mean more
than just in-class definition.  However, I'm leaving that for now.

	gcc/cp/
	* cp-tree.h (lang_decl_base): anticipated_p is not used for
	anticipatedness.
	(DECL_ANTICIPATED): Delete.
	* decl.c (duplicate_decls): Delete DECL_ANTICIPATED_management,
	use was_hidden.
	(cxx_builtin_function): Drop DECL_ANTICIPATED setting.
	(xref_tag_1): Drop DECL_ANTICIPATED assert.
	* name-lookup.c (name_lookup::adl_class_only): Drop
	DECL_ANTICIPATED check.
	(name_lookup::search_adl): Always dedup.
	(anticipated_builtin_p): Reimplement.
	(do_pushdecl): Drop DECL_ANTICIPATED asserts & update.
	(lookup_elaborated_type_1): Drop DECL_ANTICIPATED update.
	(do_pushtag): Drop DECL_ANTICIPATED setting.
	* pt.c (push_template_decl): Likewise.
	(tsubst_friend_class): Likewise.
	libcc1/
	* libcp1plugin.cc (libcp1plugin.cc): Drop DECL_ANTICIPATED test.
This commit is contained in:
Nathan Sidwell 2020-10-02 12:21:08 -07:00
parent 7ee1c0413e
commit 679dbc9dce
5 changed files with 21 additions and 83 deletions

View File

@ -2657,8 +2657,10 @@ struct GTY(()) lang_decl_base {
unsigned not_really_extern : 1; /* var or fn */
unsigned initialized_in_class : 1; /* var or fn */
unsigned threadprivate_or_deleted_p : 1; /* var or fn */
unsigned anticipated_p : 1; /* fn, type or template */
/* anticipated_p reused as DECL_OMP_PRIVATIZED_MEMBER in var */
/* anticipated_p is no longer used for anticipated_decls (fn, type
or template). It is used as DECL_OMP_PRIVATIZED_MEMBER in
var. */
unsigned anticipated_p : 1;
unsigned friend_or_tls : 1; /* var, fn, type or template */
unsigned unknown_bound_p : 1; /* var */
unsigned odr_used : 1; /* var or fn */
@ -4037,13 +4039,6 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
#define DECL_BUILTIN_P(NODE) \
(DECL_SOURCE_LOCATION(NODE) == BUILTINS_LOCATION)
/* Nonzero if NODE is a DECL which we know about but which has not
been explicitly declared, such as a built-in function or a friend
declared inside a class. */
#define DECL_ANTICIPATED(NODE) \
(DECL_LANG_SPECIFIC (TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK (NODE)) \
->u.base.anticipated_p)
/* True for artificial decls added for OpenMP privatized non-static
data members. */
#define DECL_OMP_PRIVATIZED_MEMBER(NODE) \

View File

@ -1444,7 +1444,7 @@ tree
duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
{
unsigned olddecl_uid = DECL_UID (olddecl);
int olddecl_friend = 0, types_match = 0, hidden_friend = 0;
int olddecl_friend = 0, types_match = 0;
int olddecl_hidden_friend = 0;
int new_defines_function = 0;
tree new_template_info;
@ -1473,7 +1473,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
{
/* Avoid warnings redeclaring built-ins which have not been
explicitly declared. */
if (DECL_ANTICIPATED (olddecl))
if (was_hidden)
{
if (TREE_PUBLIC (newdecl)
&& CP_DECL_CONTEXT (newdecl) == global_namespace)
@ -1645,7 +1645,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
/* If a function is explicitly declared "throw ()", propagate that to
the corresponding builtin. */
if (DECL_BUILT_IN_CLASS (olddecl) == BUILT_IN_NORMAL
&& DECL_ANTICIPATED (olddecl)
&& was_hidden
&& TREE_NOTHROW (newdecl)
&& !TREE_NOTHROW (olddecl))
{
@ -2139,9 +2139,6 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
{
olddecl_friend = DECL_FRIEND_P (STRIP_TEMPLATE (olddecl));
olddecl_hidden_friend = olddecl_friend && was_hidden;
hidden_friend = olddecl_hidden_friend && hiding;
if (!hidden_friend)
DECL_ANTICIPATED (olddecl) = false;
}
if (TREE_CODE (newdecl) == TEMPLATE_DECL)
@ -2890,8 +2887,6 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
DECL_UID (olddecl) = olddecl_uid;
if (olddecl_friend)
DECL_FRIEND_P (olddecl) = true;
if (hidden_friend)
DECL_ANTICIPATED (olddecl) = true;
/* NEWDECL contains the merged attribute lists.
Update OLDDECL to be the same. */
@ -4690,21 +4685,15 @@ cxx_builtin_function (tree decl)
const char *name = IDENTIFIER_POINTER (id);
bool hiding = false;
if (name[0] != '_' || name[1] != '_')
{
/* In the user's namespace, it must be declared before use. */
DECL_ANTICIPATED (decl) = 1;
hiding = true;
}
/* In the user's namespace, it must be declared before use. */
hiding = true;
else if (IDENTIFIER_LENGTH (id) > strlen ("___chk")
&& 0 != strncmp (name + 2, "builtin_", strlen ("builtin_"))
&& 0 == memcmp (name + IDENTIFIER_LENGTH (id) - strlen ("_chk"),
"_chk", strlen ("_chk") + 1))
{
/* Treat __*_chk fortification functions as anticipated as well,
unless they are __builtin_*_chk. */
DECL_ANTICIPATED (decl) = 1;
hiding = true;
}
/* Treat __*_chk fortification functions as anticipated as well,
unless they are __builtin_*_chk. */
hiding = true;
/* All builtins that don't begin with an '_' should additionally
go in the 'std' namespace. */
@ -15063,10 +15052,6 @@ xref_tag_1 (enum tag_types tag_code, tree name,
inform (location_of (t), "previous declaration %qD", t);
return error_mark_node;
}
gcc_checking_assert (how == TAG_how::HIDDEN_FRIEND
|| !(DECL_LANG_SPECIFIC (TYPE_NAME (t))
&& DECL_ANTICIPATED (TYPE_NAME (t))));
}
return t;

View File

@ -842,12 +842,6 @@ name_lookup::adl_class_only (tree type)
if (CP_DECL_CONTEXT (fn) != context)
continue;
/* Only interested in anticipated friends. (Non-anticipated
ones will have been inserted during the namespace
adl.) */
if (!DECL_ANTICIPATED (fn))
continue;
/* Template specializations are never found by name lookup.
(Templates themselves can be found, but not template
specializations.) */
@ -1079,11 +1073,8 @@ name_lookup::adl_template_arg (tree arg)
tree
name_lookup::search_adl (tree fns, vec<tree, va_gc> *args)
{
if (fns)
{
deduping = true;
lookup_mark (fns, true);
}
deduping = true;
lookup_mark (fns, true);
value = fns;
unsigned ix;
@ -2136,19 +2127,9 @@ strip_using_decl (tree decl)
static bool
anticipated_builtin_p (tree ovl)
{
if (TREE_CODE (ovl) != OVERLOAD)
return false;
if (!OVL_HIDDEN_P (ovl))
return false;
tree fn = OVL_FUNCTION (ovl);
gcc_checking_assert (DECL_ANTICIPATED (fn));
if (DECL_BUILTIN_P (fn))
return true;
return false;
return (TREE_CODE (ovl) == OVERLOAD
&& OVL_HIDDEN_P (ovl)
&& DECL_BUILTIN_P (OVL_FUNCTION (ovl)));
}
/* BINDING records an existing declaration for a name in the current scope.
@ -3079,14 +3060,6 @@ do_pushdecl (tree decl, bool hiding)
tree *slot = NULL; /* Binding slot in namespace. */
tree old = NULL_TREE;
if (!hiding)
/* We should never unknownly push an anticipated decl. */
gcc_checking_assert (!((TREE_CODE (decl) == TYPE_DECL
|| TREE_CODE (decl) == FUNCTION_DECL
|| TREE_CODE (decl) == TEMPLATE_DECL)
&& DECL_LANG_SPECIFIC (decl)
&& DECL_ANTICIPATED (decl)));
if (level->kind == sk_namespace)
{
/* We look in the decl's namespace for an existing
@ -3171,8 +3144,6 @@ do_pushdecl (tree decl, bool hiding)
/* Don't attempt to push it. */
return error_mark_node;
}
/* Hide it from ordinary lookup. */
DECL_ANTICIPATED (decl) = true;
}
}
@ -6730,7 +6701,6 @@ lookup_elaborated_type_1 (tree name, TAG_how how)
HIDDEN_TYPE_BINDING_P (iter) = false;
/* Unanticipate the decl itself. */
DECL_ANTICIPATED (found) = false;
DECL_FRIEND_P (found) = false;
gcc_checking_assert (TREE_CODE (found) != TEMPLATE_DECL);
@ -6738,7 +6708,6 @@ lookup_elaborated_type_1 (tree name, TAG_how how)
if (tree ti = TYPE_TEMPLATE_INFO (TREE_TYPE (found)))
{
tree tmpl = TI_TEMPLATE (ti);
DECL_ANTICIPATED (tmpl) = false;
DECL_FRIEND_P (tmpl) = false;
}
}
@ -6799,18 +6768,17 @@ lookup_elaborated_type_1 (tree name, TAG_how how)
if (reveal)
{
/* Reveal the previously hidden thing. */
DECL_ANTICIPATED (found) = false;
DECL_FRIEND_P (found) = false;
if (TREE_CODE (found) == TEMPLATE_DECL)
{
DECL_ANTICIPATED (DECL_TEMPLATE_RESULT (found)) = false;
DECL_FRIEND_P (DECL_TEMPLATE_RESULT (found)) = false;
tree res = DECL_TEMPLATE_RESULT (found);
if (DECL_LANG_SPECIFIC (res))
DECL_FRIEND_P (res) = false;
}
else if (tree ti = TYPE_TEMPLATE_INFO (TREE_TYPE (found)))
{
tree tmpl = TI_TEMPLATE (ti);
DECL_ANTICIPATED (tmpl) = false;
DECL_FRIEND_P (tmpl) = false;
}
}
@ -7019,7 +6987,6 @@ do_pushtag (tree name, tree type, TAG_how how)
ordinary name lookup. Its corresponding TEMPLATE_DECL
will be marked in push_template_decl. */
retrofit_lang_decl (tdef);
DECL_ANTICIPATED (tdef) = 1;
DECL_FRIEND_P (tdef) = 1;
}

View File

@ -6024,10 +6024,7 @@ push_template_decl (tree decl, bool is_friend)
{
/* Hide template friend classes that haven't been declared yet. */
if (is_friend && TREE_CODE (decl) == TYPE_DECL)
{
DECL_ANTICIPATED (tmpl) = 1;
DECL_FRIEND_P (tmpl) = 1;
}
DECL_FRIEND_P (tmpl) = 1;
tmpl = pushdecl_namespace_level (tmpl, /*hiding=*/is_friend);
if (tmpl == error_mark_node)
@ -11311,11 +11308,6 @@ tsubst_friend_class (tree friend_tmpl, tree args)
CLASSTYPE_TI_ARGS (TREE_TYPE (tmpl))
= INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (TREE_TYPE (tmpl)));
/* It is hidden. */
retrofit_lang_decl (DECL_TEMPLATE_RESULT (tmpl));
DECL_ANTICIPATED (tmpl)
= DECL_ANTICIPATED (DECL_TEMPLATE_RESULT (tmpl)) = true;
/* Substitute into and set the constraints on the new declaration. */
if (tree ci = get_constraints (friend_tmpl))
{

View File

@ -353,7 +353,6 @@ supplement_binding (cxx_binding *binding, tree decl)
/* If TARGET_BVAL is anticipated but has not yet been
declared, pretend it is not there at all. */
|| (TREE_CODE (target_bval) == FUNCTION_DECL
&& DECL_ANTICIPATED (target_bval)
&& DECL_BUILTIN_P (target_bval)))
binding->value = decl;
else if (TREE_CODE (target_bval) == TYPE_DECL