Tested x86_64-pc-linux-gnu, applying to trunk.

-- >8 --
Fixed by r16-8015:
c++: error routines re-entered with uneval lambda [PR124397]

        PR c++/106957

gcc/testsuite/ChangeLog:

        * g++.dg/cpp2a/lambda-uneval32.C: New test.
---
 gcc/testsuite/g++.dg/cpp2a/lambda-uneval32.C | 25 ++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-uneval32.C

diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-uneval32.C 
b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval32.C
new file mode 100644
index 00000000000..63980896eb1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval32.C
@@ -0,0 +1,25 @@
+// PR c++/106957
+// { dg-do compile { target c++20 } }
+
+template<bool B>
+struct bool_constant {
+  static constexpr bool value = B;
+  constexpr operator bool() const { return value; }
+};
+
+using true_type = bool_constant<true>;
+using false_type = bool_constant<false>;
+
+constexpr auto f = [](int){}; // { dg-error "invalid conversion" }
+
+template<typename T>
+auto canCallFOn(T) -> decltype([]{ f(T{}); }(), true_type{}); // { dg-error 
"no match|invalid conversion" }
+
+constexpr false_type canCallFOn(...) {
+    return {};
+}
+
+int main() {
+    static_assert(!canCallFOn(1)); // { dg-error "" }
+    static_assert(!canCallFOn("")); // { dg-error "" }
+}

base-commit: b64700dec403f9b2b605df295e43c73b3185d0f5
-- 
2.54.0

Reply via email to