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.
/* 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)
--- /dev/null
+// 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>);