When register_local_var_uses iterates a BIND_EXPRs BIND_EXPR_VARS, it
fails to account for the fact that FUNCTION_DECLs might be present, and
later passes it to DECL_HAS_VALUE_EXPR_P. This leads to a tree check
failure in DECL_HAS_VALUE_EXPR_P:
tree check: expected var_decl or parm_decl or result_decl, have
function_decl in register_local_var_uses
We only care about PARM_DECL and VAR_DECL, so select only those.
PR c++/115906 - [coroutines] missing diagnostic and ICE when co_await used as default argument in function declaration
gcc/cp/ChangeLog:
PR c++/115906
* coroutines.cc (register_local_var_uses): Only process
PARM_DECL and VAR_DECLs.
gcc/testsuite/ChangeLog:
PR c++/115906
* g++.dg/coroutines/coro-function-decl.C: New test.
local_var.field_idx = local_var.field_id = NULL_TREE;
/* Make sure that we only present vars to the tests below. */
- if (TREE_CODE (lvar) == TYPE_DECL
- || TREE_CODE (lvar) == NAMESPACE_DECL)
+ if (TREE_CODE (lvar) != PARM_DECL
+ && TREE_CODE (lvar) != VAR_DECL)
continue;
/* We don't move static vars into the frame. */
--- /dev/null
+#include <coroutine>
+
+struct task
+{
+ struct promise_type
+ {
+ std::suspend_always initial_suspend () { return {}; }
+ std::suspend_always final_suspend () noexcept { return {}; }
+ void unhandled_exception () {}
+ task get_return_object () noexcept { return {}; }
+ void return_void () {}
+ };
+};
+
+task foo ()
+{
+ void bar ();
+ co_return;
+}