PR c++/92150 - partial specialization with class NTTP.

Here unify was getting confused by the VIEW_CONVERT_EXPR we add in
finish_id_expression_1 to make class NTTP const when they're used in an
expression.

Tested x86_64-pc-linux-gnu, applying to trunk.

	* pt.c (unify): Handle VIEW_CONVERT_EXPR.

From-SVN: r277901
This commit is contained in:
Jason Merrill 2019-11-06 19:31:52 -05:00 committed by Jason Merrill
parent 81a34a6b68
commit 951c6f3dd9
3 changed files with 25 additions and 2 deletions

View file

@ -1,5 +1,8 @@
2019-11-06 Jason Merrill <jason@redhat.com>
PR c++/92150 - partial specialization with class NTTP.
* pt.c (unify): Handle VIEW_CONVERT_EXPR.
* pt.c (use_pack_expansion_extra_args_p): Still do substitution if
all packs are simple pack expansions.
(add_extra_args): Check that the extra args aren't dependent.

View file

@ -22571,8 +22571,9 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
/* I don't think this will do the right thing with respect to types.
But the only case I've seen it in so far has been array bounds, where
signedness is the only information lost, and I think that will be
okay. */
while (CONVERT_EXPR_P (parm))
okay. VIEW_CONVERT_EXPR can appear with class NTTP, thanks to
finish_id_expression_1, and are also OK. */
while (CONVERT_EXPR_P (parm) || TREE_CODE (parm) == VIEW_CONVERT_EXPR)
parm = TREE_OPERAND (parm, 0);
if (arg == error_mark_node)

View file

@ -0,0 +1,19 @@
// PR c++/92150
// { dg-do compile { target c++2a } }
struct X {
int value;
// auto operator==(const X&) = default;
};
template<typename T, X N>
struct b;
template<typename T>
inline constexpr bool is_b = false;
template<typename T, X N>
inline constexpr bool is_b<b<T, N>> = true;
using my_b = b<int, X{1}>;
static_assert(is_b<my_b>);