]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: satisfaction value of type const bool [PR104410]
authorPatrick Palka <ppalka@redhat.com>
Tue, 8 Feb 2022 14:11:29 +0000 (09:11 -0500)
committerPatrick Palka <ppalka@redhat.com>
Tue, 8 Feb 2022 14:11:29 +0000 (09:11 -0500)
Here constant evaluation of the atomic constraint use_func_v<T>
sensibly yields an INTEGER_CST of type const bool, but the assert in
satisfaction_value expects unqualified bool.  So let's just relax the
assert to accept cv-qualified bool.

PR c++/104410

gcc/cp/ChangeLog:

* constraint.cc (satisfaction_value): Relax assert to accept
cv-qualified bool.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-pr104410.C: New test.

gcc/cp/constraint.cc
gcc/testsuite/g++.dg/cpp2a/concepts-pr104410.C [new file with mode: 0644]

index b7b9439f34bbf1e264f3ff581b421b01b027cd35..12db7e5cf14e8cf3e3675fb58a18a40b6ec5e638 100644 (file)
@@ -2818,7 +2818,8 @@ satisfaction_value (tree t)
     return t;
 
   gcc_assert (TREE_CODE (t) == INTEGER_CST
-             && same_type_p (TREE_TYPE (t), boolean_type_node));
+             && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (t),
+                                                           boolean_type_node));
   if (integer_zerop (t))
     return boolean_false_node;
   else
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr104410.C b/gcc/testsuite/g++.dg/cpp2a/concepts-pr104410.C
new file mode 100644 (file)
index 0000000..dac08e1
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/104410
+// { dg-do compile { target c++20 } }
+
+template<class T> constexpr bool use_func_v{};
+template<class T> void f() requires use_func_v<T> || true { }
+template void f<int>();