public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] c++: some assorted code improvements
@ 2023-05-04 16:33 Patrick Palka
  2023-05-04 18:00 ` Jason Merrill
  0 siblings, 1 reply; 2+ messages in thread
From: Patrick Palka @ 2023-05-04 16:33 UTC (permalink / raw)
  To: gcc-patches; +Cc: jason, Patrick Palka

* Harden some tree accessor macros and fix some incorrect uses of
  PLACEHOLDER_TYPE_CONSTRAINTS.
* Use strip_innermost_template_args in outer_template_args.
* Add !processing_template_decl early exit tests to some dependence
  predicates.

gcc/cp/ChangeLog:

	* cp-tree.h (PLACEHOLDER_TYPE_CONSTRAINTS_INFO): Use
	TEMPLATE_TYPE_PARM_CHECK.
	(TPARMS_PRIMARY_TEMPLATE): Use TREE_VEC_CHECK.
	(TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL): Use
	TEMPLATE_TEMPLATE_PARM_CHECK.
	* cxx-pretty-print.cc (cxx_pretty_printer::simple_type_specifier):
	Only use PLACEHOLDER_TYPE_CONSTRAINTS on TEMPLATE_TYPE_PARM.
	* error.cc (dump_type) <case TEMPLATE_TYPE_PARM>: Use separate
	variable for CLASS_PLACEHOLDER_TEMPLATE result.
	* pt.cc (outer_template_args): Use strip_innermost_template_args.
	(any_type_dependent_arguments_p): Return false if
	!processing_template_decl.  Use range-based for.
	(any_dependent_template_arguments_p): Likewise.
---
 gcc/cp/cp-tree.h           |  6 +++---
 gcc/cp/cxx-pretty-print.cc |  5 +++--
 gcc/cp/error.cc            |  4 ++--
 gcc/cp/pt.cc               | 30 ++++++++++++------------------
 4 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index c9c4cd6f32f..a02461481a2 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1636,7 +1636,7 @@ check_constraint_info (tree t)
    holds the set of template parameters that were in-scope when this 'auto'
    was formed.  */
 #define PLACEHOLDER_TYPE_CONSTRAINTS_INFO(NODE) \
-  DECL_SIZE_UNIT (TYPE_NAME (NODE))
+  DECL_SIZE_UNIT (TYPE_NAME (TEMPLATE_TYPE_PARM_CHECK (NODE)))
 
 /* The constraints on the 'auto' placeholder type NODE.  */
 #define PLACEHOLDER_TYPE_CONSTRAINTS(NODE)		   \
@@ -5084,7 +5084,7 @@ get_vec_init_expr (tree t)
    templates are primary, too.  */
 
 /* Returns the primary template corresponding to these parameters.  */
-#define TPARMS_PRIMARY_TEMPLATE(NODE) (TREE_TYPE (NODE))
+#define TPARMS_PRIMARY_TEMPLATE(NODE) (TREE_TYPE (TREE_VEC_CHECK (NODE)))
 
 #define DECL_PRIMARY_TEMPLATE(NODE) \
   (TPARMS_PRIMARY_TEMPLATE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
@@ -6098,7 +6098,7 @@ const unsigned int STF_STRIP_DEPENDENT = 1U << 1;
 #define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE)	\
   ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM)	\
    ? TYPE_TI_TEMPLATE (NODE)				\
-   : TYPE_NAME (NODE))
+   : TYPE_NAME (TEMPLATE_TEMPLATE_PARM_CHECK (NODE)))
 
 /* in lex.cc  */
 
diff --git a/gcc/cp/cxx-pretty-print.cc b/gcc/cp/cxx-pretty-print.cc
index 4cda27f2b30..950295effc6 100644
--- a/gcc/cp/cxx-pretty-print.cc
+++ b/gcc/cp/cxx-pretty-print.cc
@@ -1364,8 +1364,9 @@ cxx_pretty_printer::simple_type_specifier (tree t)
     case TEMPLATE_PARM_INDEX:
     case BOUND_TEMPLATE_TEMPLATE_PARM:
       pp_cxx_unqualified_id (this, t);
-      if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
-        pp_cxx_constrained_type_spec (this, c);
+      if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
+	if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
+	  pp_cxx_constrained_type_spec (this, c);
       break;
 
     case TYPENAME_TYPE:
diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
index a5d888926a6..1cfa4f1a240 100644
--- a/gcc/cp/error.cc
+++ b/gcc/cp/error.cc
@@ -639,8 +639,8 @@ dump_type (cxx_pretty_printer *pp, tree t, int flags)
       pp_cxx_cv_qualifier_seq (pp, t);
       if (template_placeholder_p (t))
 	{
-	  t = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
-	  pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
+	  tree tmpl = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
+	  pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (tmpl));
 	  pp_string (pp, "<...auto...>");
 	}
       else if (TYPE_IDENTIFIER (t))
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 3f1cf139bbd..e62cca38195 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -4982,9 +4982,7 @@ outer_template_args (tree tmpl)
     return args;
   if (TMPL_ARGS_DEPTH (args) == 1)
     return NULL_TREE;
-  args = copy_node (args);
-  --TREE_VEC_LENGTH (args);
-  return args;
+  return strip_innermost_template_args (args, 1);
 }
 
 /* Update the declared TYPE by doing any lookups which were thought to be
@@ -28635,14 +28633,13 @@ type_dependent_expression_p_push (tree expr)
 bool
 any_type_dependent_arguments_p (const vec<tree, va_gc> *args)
 {
-  unsigned int i;
-  tree arg;
+  if (!processing_template_decl || !args)
+    return false;
+
+  for (tree arg : *args)
+    if (type_dependent_expression_p (arg))
+      return true;
 
-  FOR_EACH_VEC_SAFE_ELT (args, i, arg)
-    {
-      if (type_dependent_expression_p (arg))
-	return true;
-    }
   return false;
 }
 
@@ -28805,19 +28802,16 @@ any_template_arguments_need_structural_equality_p (tree args)
 bool
 any_dependent_template_arguments_p (const_tree args)
 {
-  int i;
-  int j;
-
-  if (!args)
-    return false;
   if (args == error_mark_node)
     return true;
+  if (!processing_template_decl || !args)
+    return false;
 
-  for (i = 0; i < TMPL_ARGS_DEPTH (args); ++i)
+  for (int i = 0, depth = TMPL_ARGS_DEPTH (args); i < depth; ++i)
     {
       const_tree level = TMPL_ARGS_LEVEL (args, i + 1);
-      for (j = 0; j < TREE_VEC_LENGTH (level); ++j)
-	if (dependent_template_arg_p (TREE_VEC_ELT (level, j)))
+      for (tree arg : tree_vec_range (CONST_CAST_TREE (level)))
+	if (dependent_template_arg_p (arg))
 	  return true;
     }
 
-- 
2.40.1.476.g69c786637d


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] c++: some assorted code improvements
  2023-05-04 16:33 [PATCH] c++: some assorted code improvements Patrick Palka
@ 2023-05-04 18:00 ` Jason Merrill
  0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2023-05-04 18:00 UTC (permalink / raw)
  To: Patrick Palka, gcc-patches

On 5/4/23 12:33, Patrick Palka wrote:
> * Harden some tree accessor macros and fix some incorrect uses of
>    PLACEHOLDER_TYPE_CONSTRAINTS.
> * Use strip_innermost_template_args in outer_template_args.
> * Add !processing_template_decl early exit tests to some dependence
>    predicates.

OK.

> gcc/cp/ChangeLog:
> 
> 	* cp-tree.h (PLACEHOLDER_TYPE_CONSTRAINTS_INFO): Use
> 	TEMPLATE_TYPE_PARM_CHECK.
> 	(TPARMS_PRIMARY_TEMPLATE): Use TREE_VEC_CHECK.
> 	(TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL): Use
> 	TEMPLATE_TEMPLATE_PARM_CHECK.
> 	* cxx-pretty-print.cc (cxx_pretty_printer::simple_type_specifier):
> 	Only use PLACEHOLDER_TYPE_CONSTRAINTS on TEMPLATE_TYPE_PARM.
> 	* error.cc (dump_type) <case TEMPLATE_TYPE_PARM>: Use separate
> 	variable for CLASS_PLACEHOLDER_TEMPLATE result.
> 	* pt.cc (outer_template_args): Use strip_innermost_template_args.
> 	(any_type_dependent_arguments_p): Return false if
> 	!processing_template_decl.  Use range-based for.
> 	(any_dependent_template_arguments_p): Likewise.
> ---
>   gcc/cp/cp-tree.h           |  6 +++---
>   gcc/cp/cxx-pretty-print.cc |  5 +++--
>   gcc/cp/error.cc            |  4 ++--
>   gcc/cp/pt.cc               | 30 ++++++++++++------------------
>   4 files changed, 20 insertions(+), 25 deletions(-)
> 
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index c9c4cd6f32f..a02461481a2 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -1636,7 +1636,7 @@ check_constraint_info (tree t)
>      holds the set of template parameters that were in-scope when this 'auto'
>      was formed.  */
>   #define PLACEHOLDER_TYPE_CONSTRAINTS_INFO(NODE) \
> -  DECL_SIZE_UNIT (TYPE_NAME (NODE))
> +  DECL_SIZE_UNIT (TYPE_NAME (TEMPLATE_TYPE_PARM_CHECK (NODE)))
>   
>   /* The constraints on the 'auto' placeholder type NODE.  */
>   #define PLACEHOLDER_TYPE_CONSTRAINTS(NODE)		   \
> @@ -5084,7 +5084,7 @@ get_vec_init_expr (tree t)
>      templates are primary, too.  */
>   
>   /* Returns the primary template corresponding to these parameters.  */
> -#define TPARMS_PRIMARY_TEMPLATE(NODE) (TREE_TYPE (NODE))
> +#define TPARMS_PRIMARY_TEMPLATE(NODE) (TREE_TYPE (TREE_VEC_CHECK (NODE)))
>   
>   #define DECL_PRIMARY_TEMPLATE(NODE) \
>     (TPARMS_PRIMARY_TEMPLATE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
> @@ -6098,7 +6098,7 @@ const unsigned int STF_STRIP_DEPENDENT = 1U << 1;
>   #define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE)	\
>     ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM)	\
>      ? TYPE_TI_TEMPLATE (NODE)				\
> -   : TYPE_NAME (NODE))
> +   : TYPE_NAME (TEMPLATE_TEMPLATE_PARM_CHECK (NODE)))
>   
>   /* in lex.cc  */
>   
> diff --git a/gcc/cp/cxx-pretty-print.cc b/gcc/cp/cxx-pretty-print.cc
> index 4cda27f2b30..950295effc6 100644
> --- a/gcc/cp/cxx-pretty-print.cc
> +++ b/gcc/cp/cxx-pretty-print.cc
> @@ -1364,8 +1364,9 @@ cxx_pretty_printer::simple_type_specifier (tree t)
>       case TEMPLATE_PARM_INDEX:
>       case BOUND_TEMPLATE_TEMPLATE_PARM:
>         pp_cxx_unqualified_id (this, t);
> -      if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
> -        pp_cxx_constrained_type_spec (this, c);
> +      if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
> +	if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
> +	  pp_cxx_constrained_type_spec (this, c);
>         break;
>   
>       case TYPENAME_TYPE:
> diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
> index a5d888926a6..1cfa4f1a240 100644
> --- a/gcc/cp/error.cc
> +++ b/gcc/cp/error.cc
> @@ -639,8 +639,8 @@ dump_type (cxx_pretty_printer *pp, tree t, int flags)
>         pp_cxx_cv_qualifier_seq (pp, t);
>         if (template_placeholder_p (t))
>   	{
> -	  t = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
> -	  pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
> +	  tree tmpl = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
> +	  pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (tmpl));
>   	  pp_string (pp, "<...auto...>");
>   	}
>         else if (TYPE_IDENTIFIER (t))
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 3f1cf139bbd..e62cca38195 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -4982,9 +4982,7 @@ outer_template_args (tree tmpl)
>       return args;
>     if (TMPL_ARGS_DEPTH (args) == 1)
>       return NULL_TREE;
> -  args = copy_node (args);
> -  --TREE_VEC_LENGTH (args);
> -  return args;
> +  return strip_innermost_template_args (args, 1);
>   }
>   
>   /* Update the declared TYPE by doing any lookups which were thought to be
> @@ -28635,14 +28633,13 @@ type_dependent_expression_p_push (tree expr)
>   bool
>   any_type_dependent_arguments_p (const vec<tree, va_gc> *args)
>   {
> -  unsigned int i;
> -  tree arg;
> +  if (!processing_template_decl || !args)
> +    return false;
> +
> +  for (tree arg : *args)
> +    if (type_dependent_expression_p (arg))
> +      return true;
>   
> -  FOR_EACH_VEC_SAFE_ELT (args, i, arg)
> -    {
> -      if (type_dependent_expression_p (arg))
> -	return true;
> -    }
>     return false;
>   }
>   
> @@ -28805,19 +28802,16 @@ any_template_arguments_need_structural_equality_p (tree args)
>   bool
>   any_dependent_template_arguments_p (const_tree args)
>   {
> -  int i;
> -  int j;
> -
> -  if (!args)
> -    return false;
>     if (args == error_mark_node)
>       return true;
> +  if (!processing_template_decl || !args)
> +    return false;
>   
> -  for (i = 0; i < TMPL_ARGS_DEPTH (args); ++i)
> +  for (int i = 0, depth = TMPL_ARGS_DEPTH (args); i < depth; ++i)
>       {
>         const_tree level = TMPL_ARGS_LEVEL (args, i + 1);
> -      for (j = 0; j < TREE_VEC_LENGTH (level); ++j)
> -	if (dependent_template_arg_p (TREE_VEC_ELT (level, j)))
> +      for (tree arg : tree_vec_range (CONST_CAST_TREE (level)))
> +	if (dependent_template_arg_p (arg))
>   	  return true;
>       }
>   


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-05-04 18:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-04 16:33 [PATCH] c++: some assorted code improvements Patrick Palka
2023-05-04 18:00 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).