From 73e7f63ffaacf018b1fad331d2369bf891620e97 Mon Sep 17 00:00:00 2001
From: Patrick Palka <ppalka@redhat.com>
Date: Mon, 2 Dec 2024 10:58:50 -0500
Subject: c++: some further concepts cleanups

This patch further cleans up the concepts code following the removal of
Concepts TS support:

  * concept-ids are now the only kind of "concept check", so we can
    simplify some code accordingly.  In particular resolve_concept_check
    seems like a no-op and can be removed.
  * In turn, deduce_constrained_parameter doesn't seem to do anything
    interesting.
  * In light of the above we might as well inline finish_type_constraints
    into its only caller.
  * Introduce and use a helper for obtaining the prototype parameter of
    a concept, i.e. its first template parameter.
  * placeholder_extract_concept_and_args is only ever called on a
    concept-id, so it's simpler to inline it into its callers.
  * There's no such thing as a template-template-parameter with a
    type-constraint, so we can remove such handling from the parser.
    This means is_constrained_parameter is currently equivalent to
    declares_constrained_type_template_parameter, so let's prefer
    to use the latter.
  * Remove WILDCARD_DECL and instead use the concept's prototype parameter
    as the dummy first argument of a type-constraint during template
    argument coercion.
  * Remove a redundant concept_definition_p overload.

gcc/cp/ChangeLog:

	* constraint.cc (resolve_concept_check): Remove.
	(deduce_constrained_parameter): Remove.
	(finish_type_constraints): Inline into its only caller
	cp_parser_placeholder_type_specifier and remove.
	(build_concept_check_arguments): Coding style tweaks.
	(build_standard_check): Inline into its only caller ...
	(build_concept_check): ... here.
	(build_type_constraint): Use the prototype parameter as the
	first template argument.
	(finish_shorthand_constraint): Remove function concept
	handling.  Use concept_prototype_parameter.
	(placeholder_extract_concept_and_args): Inline into its
	callers and remove.
	(equivalent_placeholder_constraints): Adjust after
	placeholder_extract_concept_and_args removal.
	(iterative_hash_placeholder_constraint): Likewise.
	* cp-objcp-common.cc (cp_common_init_ts): Remove WILDCARD_DECL
	handling.
	* cp-tree.def (WILDCARD_DECL): Remove.
	* cp-tree.h (WILDCARD_PACK_P): Remove.
	(type_uses_auto_or_concept): Remove declaration of nonexistent
	function.
	(append_type_to_template_for_access_check): Likewise.
	(finish_type_constraints): Remove declaration.
	(placeholder_extract_concept_and_args): Remove declaration.
	(deduce_constrained_parameter): Remove declaration.
	(resolve_constraint_check): Remove declaration.
	(valid_requirements_p): Remove declaration of nonexistent
	function.
	(finish_concept_name): Likewise.
	(concept_definition_p): Remove redundant overload.
	(concept_prototype_parameter): Define.
	* cxx-pretty-print.cc (pp_cxx_constrained_type_spec): Adjust
	after placeholder_extract_concept_and_args.
	* error.cc (dump_decl) <case WILDCARD_DECL>: Remove.
	(dump_expr) <case WILDCARD_DECL>: Likewise.
	* parser.cc (is_constrained_parameter): Inline into
	declares_constrained_type_template_parameter and remove.
	(cp_parser_check_constrained_type_parm): Declare static.
	(finish_constrained_template_template_parm): Remove.
	(cp_parser_constrained_template_template_parm): Remove.
	(finish_constrained_parameter): Remove dead code guarded by
	cp_parser_constrained_template_template_parm.
	(declares_constrained_type_template_parameter): Adjust after
	is_constrained_parameter removal.
	(declares_constrained_template_template_parameter): Remove.
	(cp_parser_placeholder_type_specifier): Adjust after
	finish_type_constraints removal.  Check the prototype parameter
	earlier, before build_type_constraint.
	Use concept_prototype_parameter.
	(cp_parser_parameter_declaration): Remove dead code guarded by
	declares_constrained_template_template_parameter.
	* pt.cc (convert_wildcard_argument): Remove.
	(convert_template_argument): Remove WILDCARD_DECL handling.
	(coerce_template_parameter_pack): Likewise.
	(tsubst) <case TEMPLATE_TYPE_PARM>: Likewise.
	(type_dependent_expression_p): Likewise.
	(make_constrained_placeholder_type): Remove function concept
	handling.
	(placeholder_type_constraint_dependent_p): Remove WILDCARD_DECL
	handling.

Reviewed-by: Jason Merrill <jason@redhat.com>
---
 gcc/cp/cp-tree.h | 36 ++++++++++++++----------------------
 1 file changed, 14 insertions(+), 22 deletions(-)

(limited to 'gcc/cp/cp-tree.h')

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index e70d215..0d6fce0 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -438,7 +438,6 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
       TINFO_HAS_ACCESS_ERRORS (in TEMPLATE_INFO)
       SIZEOF_EXPR_TYPE_P (in SIZEOF_EXPR)
       COMPOUND_REQ_NOEXCEPT_P (in COMPOUND_REQ)
-      WILDCARD_PACK_P (in WILDCARD_DECL)
       BLOCK_OUTER_CURLY_BRACE_P (in BLOCK)
       FOLD_EXPR_MODIFY_P (*_FOLD_EXPR)
       IF_STMT_CONSTEXPR_P (IF_STMT)
@@ -4068,9 +4067,6 @@ struct GTY(()) lang_decl {
 #define PACK_INDEX_PARENTHESIZED_P(NODE) \
   TREE_LANG_FLAG_1 (TREE_CHECK (NODE, PACK_INDEX_EXPR))
 
-/* True iff the wildcard can match a template parameter pack.  */
-#define WILDCARD_PACK_P(NODE) TREE_LANG_FLAG_0 (NODE)
-
 /* Determine if this is an argument pack.  */
 #define ARGUMENT_PACK_P(NODE)                          \
   (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK              \
@@ -7558,9 +7554,6 @@ extern tree do_auto_deduction                   (tree, tree, tree,
 						 int = LOOKUP_NORMAL,
 						 tree = NULL_TREE);
 extern tree type_uses_auto			(tree);
-extern tree type_uses_auto_or_concept		(tree);
-extern void append_type_to_template_for_access_check (tree, tree, tree,
-						      location_t);
 extern tree convert_generic_types_to_packs	(tree, int, int);
 extern tree splice_late_return_type		(tree, tree);
 extern bool is_auto				(const_tree);
@@ -8627,15 +8620,9 @@ extern tree build_type_constraint		(tree, tree, tsubst_flags_t);
 extern tree build_concept_check                 (tree, tree, tsubst_flags_t);
 extern tree build_concept_check                 (tree, tree, tree, tsubst_flags_t);
 
-extern tree_pair finish_type_constraints	(tree, tree, tsubst_flags_t);
 extern tree build_constrained_parameter         (tree, tree, tree = NULL_TREE);
-extern void placeholder_extract_concept_and_args (tree, tree&, tree&);
 extern bool equivalent_placeholder_constraints  (tree, tree);
 extern hashval_t iterative_hash_placeholder_constraint	(tree, hashval_t);
-extern bool deduce_constrained_parameter        (tree, tree&, tree&);
-extern tree resolve_constraint_check            (tree);
-extern bool valid_requirements_p                (tree);
-extern tree finish_concept_name                 (tree);
 extern tree finish_shorthand_constraint         (tree, tree);
 extern tree finish_requires_expr                (location_t, tree, tree);
 extern tree finish_simple_requirement           (location_t, tree);
@@ -8920,17 +8907,9 @@ variable_template_p (tree t)
 /* True iff T is a concept.  */
 
 inline bool
-concept_definition_p (tree t)
-{
-  return TREE_CODE (STRIP_TEMPLATE (t)) == CONCEPT_DECL;
-}
-
-/* Same as above, but for const trees.  */
-
-inline bool
 concept_definition_p (const_tree t)
 {
-  return concept_definition_p (const_cast<tree> (t));
+  return TREE_CODE (STRIP_TEMPLATE (t)) == CONCEPT_DECL;
 }
 
 /* True if t is an expression that checks a concept.  */
@@ -8943,6 +8922,19 @@ concept_check_p (const_tree t)
   return false;
 }
 
+/* Return the prototype parameter of the concept T,
+   i.e. its first declared template parameter.  */
+
+inline tree
+concept_prototype_parameter (const_tree t)
+{
+  gcc_checking_assert (concept_definition_p (t));
+  if (TREE_CODE (t) == CONCEPT_DECL)
+    t = DECL_TI_TEMPLATE (t);
+  tree parms = DECL_INNERMOST_TEMPLATE_PARMS (t);
+  return TREE_VALUE (TREE_VEC_ELT (parms, 0));
+}
+
 /* Helpers for IMPLICIT_RVALUE_P to look through automatic dereference.  */
 
 inline bool
-- 
cgit v1.1