Re: [C++] template arg comparison
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
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
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;