Commit 951c6f3d by Jason Merrill Committed by Jason Merrill

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
parent 81a34a6b
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.
......
......@@ -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)
......
// 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>);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment