Skip to content
Snippets Groups Projects
Commit 4797f010 authored by Jason Merrill's avatar Jason Merrill
Browse files

c++: class nttp ICE

The new testcase from P2308 crashed trying to expand 'this' without an
object to refer to, because we stripped the TARGET_EXPR in
create_template_parm_object.  So let's leave it on for giving an error.

gcc/cp/ChangeLog:

	* pt.cc (create_template_parm_object): Pass TARGET_EXPR to
	cxx_constant_value.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/nontype-class64.C: New test.
parent 0535c203
No related branches found
No related tags found
No related merge requests found
......@@ -7308,14 +7308,15 @@ invalid_tparm_referent_p (tree type, tree expr, tsubst_flags_t complain)
static tree
create_template_parm_object (tree expr, tsubst_flags_t complain)
{
tree orig = expr;
if (TREE_CODE (expr) == TARGET_EXPR)
expr = TARGET_EXPR_INITIAL (expr);
 
if (!TREE_CONSTANT (expr))
{
if ((complain & tf_error)
&& require_rvalue_constant_expression (expr))
cxx_constant_value (expr);
&& require_rvalue_constant_expression (orig))
cxx_constant_value (orig);
return error_mark_node;
}
if (invalid_tparm_referent_p (TREE_TYPE (expr), expr, complain))
......
// Testcase from P2308R1
// { dg-do compile { target c++20 } }
template<auto n> struct B { /* ... */ };
B<5> b1; // OK, template parameter type is int
B<'a'> b2; // OK, template parameter type is char
B<2.5> b3; // OK, template parameter type is double
B<void(0)> b4; // { dg-error "void" }
template<int i> struct C { /* ... */ };
C<{ 42 }> c1; // OK
struct J1 {
J1 *self=this;
};
B<J1{}> j1; // { dg-error "not a constant expression" }
struct J2 {
J2 *self=this;
constexpr J2() {}
constexpr J2(const J2&) {}
};
B<J2{}> j2; // { dg-error "" }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment