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:
parent
81a34a6b68
commit
951c6f3dd9
3 changed files with 25 additions and 2 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
19
gcc/testsuite/g++.dg/cpp2a/nontype-class24.C
Normal file
19
gcc/testsuite/g++.dg/cpp2a/nontype-class24.C
Normal 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>);
|
Loading…
Add table
Reference in a new issue