[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