[C++] template arg comparison

Arseny Solokha asolokha@gmx.com
Thu May 14 19:17:54 GMT 2020


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  <nathan@acm.org>
>
> 	* 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;


More information about the Gcc-patches mailing list