I've committed this set of minor cleanups from the modules branch.
nathan -- Nathan Sidwell
2020-05-13 Nathan Sidwell <nat...@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. diff --git i/gcc/cp/pt.c w/gcc/cp/pt.c index 7911293571e..ff15a926db9 100644 --- i/gcc/cp/pt.c +++ w/gcc/cp/pt.c @@ -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; diff --git i/gcc/cp/semantics.c w/gcc/cp/semantics.c index 4d1592ab0d2..d90816eabc9 100644 --- i/gcc/cp/semantics.c +++ w/gcc/cp/semantics.c @@ -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 ();