Re: [C++] template arg comparison

2020-05-15 Thread Nathan Sidwell

On 5/14/20 3:17 PM, Arseny Solokha wrote:

Hi,



-  if (TREE_CODE (nt) == TREE_VEC)
+  if (TREE_CODE (nt) == TREE_VEC || TREE_CODE (nt) == TREE_VEC)


Shouldn't there be

   if (TREE_CODE (ot) == TREE_VEC || TREE_CODE (nt) == TREE_VEC)



+  else if (TYPE_P (nt) || TYPE_P (nt))


And here:

   else if (TYPE_P (ot) || TYPE_P (nt))


Whoops, I flubbed that.  Fixed thusly.

In other news, someone's reading my patches!  Seriously, thanks!

nathan

--
Nathan Sidwell
2020-05-15  Nathan Sidwell  

	* pt.c (template_args_equal): Fix thinkos in previous 'cleanup'.

diff --git i/gcc/cp/pt.c w/gcc/cp/pt.c
index 2a0b18f5517..bfeeebc2b38 100644
--- i/gcc/cp/pt.c
+++ w/gcc/cp/pt.c
@@ -9087,7 +9087,7 @@ template_args_equal (tree ot, tree nt, bool partial_order /* = false */)
   if (class_nttp_const_wrapper_p (ot))
 ot = TREE_OPERAND (ot, 0);
 
-  if (TREE_CODE (nt) == TREE_VEC || TREE_CODE (nt) == TREE_VEC)
+  if (TREE_CODE (nt) == TREE_VEC || TREE_CODE (ot) == TREE_VEC)
 /* For member templates */
 return TREE_CODE (ot) == TREE_CODE (nt) && comp_template_args (ot, nt);
   else if (PACK_EXPANSION_P (ot) || PACK_EXPANSION_P (nt))
@@ -9100,7 +9100,7 @@ template_args_equal (tree ot, tree nt, bool partial_order /* = false */)
 return cp_tree_equal (ot, nt);
   else if (TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
 gcc_unreachable ();
-  else if (TYPE_P (nt) || TYPE_P (nt))
+  else if (TYPE_P (nt) || TYPE_P (ot))
 {
   if (!(TYPE_P (nt) && TYPE_P (ot)))
 	return false;


Re: [C++] template arg comparison

2020-05-14 Thread Arseny Solokha
Hi,


> When fixing up the template specialization hasher I was confused by the
> control flow through template_args_equal.  This reorders the category
> checking, so it is clearer as to what kind of node can reach which point.
>
> nathan
>
> 2020-05-13  Nathan Sidwell  
>
>   * pt.c (template_args_equal): Reorder category checking for
>   clarity.
>
> diff --git i/gcc/cp/pt.c w/gcc/cp/pt.c
> index a732ced2d8d..a36f603761c 100644
> --- i/gcc/cp/pt.c
> +++ w/gcc/cp/pt.c
> @@ -9092,22 +9084,22 @@ template_args_equal (tree ot, tree nt, bool 
> partial_order /* = false */)
>if (class_nttp_const_wrapper_p (ot))
>  ot = TREE_OPERAND (ot, 0);
>
> -  if (TREE_CODE (nt) == TREE_VEC)
> +  if (TREE_CODE (nt) == TREE_VEC || TREE_CODE (nt) == TREE_VEC)

Shouldn't there be

  if (TREE_CODE (ot) == TREE_VEC || TREE_CODE (nt) == TREE_VEC)

?


>  /* For member templates */
> -return TREE_CODE (ot) == TREE_VEC && comp_template_args (ot, nt);
> -  else if (PACK_EXPANSION_P (ot))
> -return (PACK_EXPANSION_P (nt)
> +return TREE_CODE (ot) == TREE_CODE (nt) && comp_template_args (ot, nt);
> +  else if (PACK_EXPANSION_P (ot) || PACK_EXPANSION_P (nt))
> +return (PACK_EXPANSION_P (ot) && PACK_EXPANSION_P (nt)
>   && template_args_equal (PACK_EXPANSION_PATTERN (ot),
>   PACK_EXPANSION_PATTERN (nt))
>   && template_args_equal (PACK_EXPANSION_EXTRA_ARGS (ot),
>   PACK_EXPANSION_EXTRA_ARGS (nt)));
>else if (ARGUMENT_PACK_P (ot) || ARGUMENT_PACK_P (nt))
>  return cp_tree_equal (ot, nt);
> -  else if (ot && TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
> +  else if (TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
>  gcc_unreachable ();
> -  else if (TYPE_P (nt))
> +  else if (TYPE_P (nt) || TYPE_P (nt))

And here:

  else if (TYPE_P (ot) || TYPE_P (nt))

?

Thanks,

Arseny.


>  {
> -  if (!TYPE_P (ot))
> +  if (!(TYPE_P (nt) && TYPE_P (ot)))
>   return false;
>/* Don't treat an alias template specialization with dependent
>arguments as equivalent to its underlying type when used as a
> @@ -9125,8 +9117,6 @@ template_args_equal (tree ot, tree nt, bool 
> partial_order /* = false */)
>else
>   return same_type_p (ot, nt);
>  }
> -  else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot))
> -return 0;
>else
>  {
>/* Try to treat a template non-type argument that has been converted
> @@ -9136,6 +9126,7 @@ template_args_equal (tree ot, tree nt, bool 
> partial_order /* = false */)
>|| code1 == NON_LVALUE_EXPR;
>  code1 = TREE_CODE (ot))
>   ot = TREE_OPERAND (ot, 0);
> +
>for (enum tree_code code2 = TREE_CODE (nt);
>  CONVERT_EXPR_CODE_P (code2)
>|| code2 == NON_LVALUE_EXPR;


[C++] template arg comparison

2020-05-13 Thread Nathan Sidwell
When fixing up the template specialization hasher I was confused by the 
control flow through template_args_equal.  This reorders the category 
checking, so it is clearer as to what kind of node can reach which point.


nathan

--
Nathan Sidwell
2020-05-13  Nathan Sidwell  

	* pt.c (template_args_equal): Reorder category checking for
	clarity.

diff --git i/gcc/cp/pt.c w/gcc/cp/pt.c
index a732ced2d8d..a36f603761c 100644
--- i/gcc/cp/pt.c
+++ w/gcc/cp/pt.c
@@ -9092,22 +9084,22 @@ template_args_equal (tree ot, tree nt, bool partial_order /* = false */)
   if (class_nttp_const_wrapper_p (ot))
 ot = TREE_OPERAND (ot, 0);
 
-  if (TREE_CODE (nt) == TREE_VEC)
+  if (TREE_CODE (nt) == TREE_VEC || TREE_CODE (nt) == TREE_VEC)
 /* For member templates */
-return TREE_CODE (ot) == TREE_VEC && comp_template_args (ot, nt);
-  else if (PACK_EXPANSION_P (ot))
-return (PACK_EXPANSION_P (nt)
+return TREE_CODE (ot) == TREE_CODE (nt) && comp_template_args (ot, nt);
+  else if (PACK_EXPANSION_P (ot) || PACK_EXPANSION_P (nt))
+return (PACK_EXPANSION_P (ot) && PACK_EXPANSION_P (nt)
 	&& template_args_equal (PACK_EXPANSION_PATTERN (ot),
 PACK_EXPANSION_PATTERN (nt))
 	&& template_args_equal (PACK_EXPANSION_EXTRA_ARGS (ot),
 PACK_EXPANSION_EXTRA_ARGS (nt)));
   else if (ARGUMENT_PACK_P (ot) || ARGUMENT_PACK_P (nt))
 return cp_tree_equal (ot, nt);
-  else if (ot && TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
+  else if (TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
 gcc_unreachable ();
-  else if (TYPE_P (nt))
+  else if (TYPE_P (nt) || TYPE_P (nt))
 {
-  if (!TYPE_P (ot))
+  if (!(TYPE_P (nt) && TYPE_P (ot)))
 	return false;
   /* Don't treat an alias template specialization with dependent
 	 arguments as equivalent to its underlying type when used as a
@@ -9125,8 +9117,6 @@ template_args_equal (tree ot, tree nt, bool partial_order /* = false */)
   else
 	return same_type_p (ot, nt);
 }
-  else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot))
-return 0;
   else
 {
   /* Try to treat a template non-type argument that has been converted
@@ -9136,6 +9126,7 @@ template_args_equal (tree ot, tree nt, bool partial_order /* = false */)
 	 || code1 == NON_LVALUE_EXPR;
 	   code1 = TREE_CODE (ot))
 	ot = TREE_OPERAND (ot, 0);
+
   for (enum tree_code code2 = TREE_CODE (nt);
 	   CONVERT_EXPR_CODE_P (code2)
 	 || code2 == NON_LVALUE_EXPR;