On 1/13/21 12:05 PM, Patrick Palka wrote:
In the below testcase, the expression of the atomic constraint after
substitution is (int *) NON_LVALUE_EXPR <1> != 0B which is not a C++
constant expression, but its TREE_CONSTANT flag is set (from build2),
so satisfy_atom fails to notice that it's non-constant (and we end
up tripping over the assert in satisfaction_value).
Since TREE_CONSTANT doesn't necessarily correspond to C++ constantness,
this patch makes satisfy_atom instead check is_rvalue_constant_expression.
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk/10?
gcc/cp/ChangeLog:
PR c++/98644
* constraint.cc (satisfy_atom): Check is_rvalue_constant_expression
instead of TREE_CONSTANT.
gcc/testsuite/ChangeLog:
PR c++/98644
* g++.dg/cpp2a/concepts-pr98644.C: New test.
---
gcc/cp/constraint.cc | 2 +-
gcc/testsuite/g++.dg/cpp2a/concepts-pr98644.C | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-pr98644.C
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index 9049d087859..f99a25dc8a4 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -2969,7 +2969,7 @@ satisfy_atom (tree t, tree args, sat_info info)
{
result = maybe_constant_value (result, NULL_TREE,
/*manifestly_const_eval=*/true);
- if (!TREE_CONSTANT (result))
This should be sufficient. If the result isn't constant,
maybe_constant_value shouldn't return it with TREE_CONSTANT set. See
/* This isn't actually constant, so unset TREE_CONSTANT.
in cxx_eval_outermost_constant_expr.
Jason