We crash in the loop at the end of treat_lvalue_as_rvalue_p for code
like
template <class T>
concept Throwable = requires(T x) { throw x; };
because the code assumes that we eventually reach sk_function_parms or
sk_try and bail, but in a concept we're in a sk_namespace.
We're already checking sk_try so we don't crash in a function-try-block,
but I've added a test anyway.
PR c++/112437
gcc/cp/ChangeLog:
* typeck.cc (treat_lvalue_as_rvalue_p): Bail out on sk_namespace in
the move on throw of parms loop.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/concepts-throw1.C: New test.
* g++.dg/eh/throw4.C: New test.
(cherry picked from commit
65b105b4f399559685200e1598ead8c7d0935c04)
for (tree decl = b->names; decl; decl = TREE_CHAIN (decl))
if (decl == retval)
return set_implicit_rvalue_p (move (expr));
- if (b->kind == sk_function_parms || b->kind == sk_try)
+ if (b->kind == sk_function_parms
+ || b->kind == sk_try
+ || b->kind == sk_namespace)
return NULL_TREE;
}
}
--- /dev/null
+// PR c++/112437
+// { dg-do compile { target c++20 } }
+
+struct S {};
+template <class T>
+concept Throwable = requires(T x) { throw x; };
+
+bool a = Throwable<S>;
--- /dev/null
+// PR c++/112437
+// { dg-do compile }
+
+struct S {};
+
+S
+foo (S s)
+try {
+ throw s;
+}
+catch (...) {
+ throw s;
+}