2020-05-13 Nathan Sidwell <nathan@acm.org>
Formatting fixups & some simplifications.
* pt.c (spec_hash_table): New typedef.
(decl_specializations, type_specializations): Use it.
(retrieve_specialization): Likewise.
(register_specialization): Remove unnecessary casts.
(push_template_decl_real): Reformat.
(instantiate_class_template_1): Use more RAII.
(make_argument_pack): Simplify.
(instantiate_template_1): Use gcc_checking_assert for expensive
asserts.
(instantiate_decl): Likewise.
(resolve_typename_type): Reformat comment.
* semantics.c (struct deferred_access): Remove unnecessary GTY on
member.
(begin_class_definition): Fix formatting.
@@ -48,9 +48,9 @@ along with GCC; see the file COPYING3. If not see
returning an int. */
typedef int (*tree_fn_t) (tree, void*);
-/* The PENDING_TEMPLATES is a TREE_LIST of templates whose
- instantiations have been deferred, either because their definitions
- were not yet available, or because we were putting off doing the work. */
+/* The PENDING_TEMPLATES is a list of templates whose instantiations
+ have been deferred, either because their definitions were not yet
+ available, or because we were putting off doing the work. */
struct GTY ((chain_next ("%h.next"))) pending_template
{
struct pending_template *next;
@@ -116,9 +116,10 @@ struct spec_hasher : ggc_ptr_hash<spec_entry>
static bool equal (spec_entry *, spec_entry *);
};
-static GTY (()) hash_table<spec_hasher> *decl_specializations;
-
-static GTY (()) hash_table<spec_hasher> *type_specializations;
+/* The general template is not in these tables. */
+typedef hash_table<spec_hasher> spec_hash_table;
+static GTY (()) spec_hash_table *decl_specializations;
+static GTY (()) spec_hash_table *type_specializations;
/* Contains canonical template parameter types. The vector is indexed by
the TEMPLATE_TYPE_IDX of the template parameter. Each element is a
@@ -1278,7 +1279,7 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash)
{
spec_entry *found;
spec_entry elt;
- hash_table<spec_hasher> *specializations;
+ spec_hash_table *specializations;
elt.tmpl = tmpl;
elt.args = args;
@@ -1573,10 +1574,9 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend,
if (hash == 0)
hash = spec_hasher::hash (&elt);
- slot =
- decl_specializations->find_slot_with_hash (&elt, hash, INSERT);
+ slot = decl_specializations->find_slot_with_hash (&elt, hash, INSERT);
if (*slot)
- fn = ((spec_entry *) *slot)->spec;
+ fn = (*slot)->spec;
else
fn = NULL_TREE;
}
@@ -4474,7 +4466,7 @@ reduce_template_parm_level (tree index, tree type, int levels, tree args,
TEMPLATE_PARM_PARAMETER_PACK (tpi)
= TEMPLATE_PARM_PARAMETER_PACK (index);
- /* Template template parameters need this. */
+ /* Template template parameters need this. */
tree inner = decl;
if (TREE_CODE (decl) == TEMPLATE_DECL)
{
@@ -5705,8 +5697,7 @@ push_template_decl_real (tree decl, bool is_friend)
template <typename T> friend void A<T>::f();
is not primary. */
is_primary = false;
- else if (TREE_CODE (decl) == TYPE_DECL
- && LAMBDA_TYPE_P (TREE_TYPE (decl)))
+ else if (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl)))
is_primary = false;
else
is_primary = template_parm_scope_p ();
@@ -5845,8 +5836,7 @@ push_template_decl_real (tree decl, bool is_friend)
if (!ctx
|| TREE_CODE (ctx) == FUNCTION_DECL
|| (CLASS_TYPE_P (ctx) && TYPE_BEING_DEFINED (ctx))
- || (TREE_CODE (decl) == TYPE_DECL
- && LAMBDA_TYPE_P (TREE_TYPE (decl)))
+ || (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl)))
|| (is_friend && !DECL_TEMPLATE_INFO (decl)))
{
if (DECL_LANG_SPECIFIC (decl)
@@ -11752,13 +11743,10 @@ instantiate_class_template_1 (tree type)
continue;
/* Build new CLASSTYPE_NESTED_UTDS. */
+ bool class_template_p = (TREE_CODE (t) != ENUMERAL_TYPE
+ && TYPE_LANG_SPECIFIC (t)
+ && CLASSTYPE_IS_TEMPLATE (t));
- tree newtag;
- bool class_template_p;
-
- class_template_p = (TREE_CODE (t) != ENUMERAL_TYPE
- && TYPE_LANG_SPECIFIC (t)
- && CLASSTYPE_IS_TEMPLATE (t));
/* If the member is a class template, then -- even after
substitution -- there may be dependent types in the
template argument list for the class. We increment
@@ -11767,7 +11755,7 @@ instantiate_class_template_1 (tree type)
when outside of a template. */
if (class_template_p)
++processing_template_decl;
- newtag = tsubst (t, args, tf_error, NULL_TREE);
+ tree newtag = tsubst (t, args, tf_error, NULL_TREE);
if (class_template_p)
--processing_template_decl;
if (newtag == error_mark_node)
@@ -11834,6 +11822,7 @@ instantiate_class_template_1 (tree type)
tree vec = NULL_TREE;
int len = 1;
+ gcc_checking_assert (TREE_CODE (t) != CONST_DECL);
/* The file and line for this declaration, to
assist in error message reporting. Since we
called push_tinst_level above, we don't need to
@@ -13067,8 +13056,8 @@ static tree
make_argument_pack (tree vec)
{
tree pack;
- tree elt = TREE_VEC_ELT (vec, 0);
- if (TYPE_P (elt))
+
+ if (TYPE_P (TREE_VEC_ELT (vec, 0)))
pack = cxx_make_type (TYPE_ARGUMENT_PACK);
else
{
@@ -20714,10 +20703,11 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain)
but it doesn't seem to be on the hot path. */
spec = retrieve_specialization (gen_tmpl, targ_ptr, 0);
- gcc_assert (tmpl == gen_tmpl
- || ((fndecl = retrieve_specialization (tmpl, orig_args, 0))
- == spec)
- || fndecl == NULL_TREE);
+ gcc_checking_assert (tmpl == gen_tmpl
+ || ((fndecl
+ = retrieve_specialization (tmpl, orig_args, 0))
+ == spec)
+ || fndecl == NULL_TREE);
if (spec != NULL_TREE)
{
@@ -22794,7 +22784,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
TREE_CONSTANT (result) = 1;
}
else
- result = cxx_make_type (TYPE_ARGUMENT_PACK);
+ result = cxx_make_type (TYPE_ARGUMENT_PACK);
SET_ARGUMENT_PACK_ARGS (result, new_args);
@@ -25422,13 +25412,14 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
gen_tmpl = most_general_template (tmpl);
gen_args = DECL_TI_ARGS (d);
- if (tmpl != gen_tmpl)
- /* We should already have the extra args. */
- gcc_assert (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (gen_tmpl))
- == TMPL_ARGS_DEPTH (gen_args));
+ /* We should already have the extra args. */
+ gcc_checking_assert (tmpl == gen_tmpl
+ || (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (gen_tmpl))
+ == TMPL_ARGS_DEPTH (gen_args)));
/* And what's in the hash table should match D. */
- gcc_assert ((spec = retrieve_specialization (gen_tmpl, gen_args, 0)) == d
- || spec == NULL_TREE);
+ gcc_checking_assert ((spec = retrieve_specialization (gen_tmpl, gen_args, 0))
+ == d
+ || spec == NULL_TREE);
/* This needs to happen before any tsubsting. */
if (! push_tinst_level (d))
@@ -27462,12 +27453,12 @@ resolve_typename_type (tree type, bool only_current_p)
gcc_checking_assert (uses_template_parms (scope));
/* Usually the non-qualified identifier of a TYPENAME_TYPE is
- TYPE_IDENTIFIER (type). But when 'type' is a typedef variant of
- a TYPENAME_TYPE node, then TYPE_NAME (type) is set to the TYPE_DECL representing
- the typedef. In that case TYPE_IDENTIFIER (type) is not the non-qualified
- identifier of the TYPENAME_TYPE anymore.
- So by getting the TYPE_IDENTIFIER of the _main declaration_ of the
- TYPENAME_TYPE instead, we avoid messing up with a possible
+ TYPE_IDENTIFIER (type). But when 'type' is a typedef variant of a
+ TYPENAME_TYPE node, then TYPE_NAME (type) is set to the TYPE_DECL
+ representing the typedef. In that case TYPE_IDENTIFIER (type) is
+ not the non-qualified identifier of the TYPENAME_TYPE anymore.
+ So by getting the TYPE_IDENTIFIER of the _main declaration_ of
+ the TYPENAME_TYPE instead, we avoid messing up with a possible
typedef variant case. */
name = TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (type));
@@ -27816,7 +27807,7 @@ finish_concept_definition (cp_expr id, tree init)
return error_mark_node;
}
- /* Initially build the concept declaration; it's type is bool. */
+ /* Initially build the concept declaration; its type is bool. */
tree decl = build_lang_decl_loc (loc, CONCEPT_DECL, *id, boolean_type_node);
DECL_CONTEXT (decl) = current_scope ();
DECL_INITIAL (decl) = init;
@@ -127,11 +127,10 @@ struct GTY(()) deferred_access {
A::B* A::f() { return 0; }
is valid, even though `A::B' is not generally accessible. */
- vec<deferred_access_check, va_gc> * GTY(()) deferred_access_checks;
+ vec<deferred_access_check, va_gc> *deferred_access_checks;
/* The current mode of access checks. */
enum deferring_kind deferring_access_checks_kind;
-
};
/* Data for deferred access checking. */
@@ -3216,7 +3215,7 @@ begin_class_definition (tree t)
SET_CLASSTYPE_INTERFACE_UNKNOWN_X
(t, finfo->interface_unknown);
}
- reset_specialization();
+ reset_specialization ();
/* Make a declaration for this class in its own scope. */
build_self_reference ();