编译我的代码时收到 GCC 编译器内部错误消息。但是 MSVC 和 Clang 编译得很好。
这被简化为一个简单的“yield coroutine”示例。 我使用 x86-64 gcc 13.2 编译器,其他编译器标志是 -std=c++20 -O2。 “编译器资源管理器”的链接
#include <coroutine>
struct state_seq {
struct promise_type
{
struct _p_awaiter
{
bool await_ready() const { return false; }
void await_suspend(std::coroutine_handle<> handle) {}
int await_resume() const { return 42; }
};
[[noreturn]]
static void unhandled_exception() { throw; };
std::suspend_never initial_suspend() noexcept { return {}; }
std::suspend_always final_suspend() noexcept { return {};}
void return_value(int) { }
_p_awaiter yield_value(int) { return {}; }
state_seq get_return_object() {
return state_seq {
._handle = std::coroutine_handle<promise_type>::from_promise(*this)
};
}
};
std::coroutine_handle<promise_type> _handle;
};
template<int TUnused = 0> // If comment this line both cases compiled fine.
state_seq parse()
{
auto i = co_yield 5;
// const auto& r_i = co_yield 45; // OK: This line is compiled.
i = co_yield 45; // ERROR: internal compiler error: in instantiate_type, at cp/class.cc:8792
co_return i;
}
void test() { auto seq = parse(); }
编译结果:
<source>: In instantiation of 'state_seq parse() [with int TUnused = 0]':
<source>:41:32: required from here
<source>:37:7: internal compiler error: in instantiate_type, at cp/class.cc:8792
37 | i = co_yield 45; // ERROR: internal compiler error: in instantiate_type, at cp/class.cc:8792
| ~~^~~~~~~~~~
0x1ce7bde internal_error(char const*, ...)
???:0
0x7290fc fancy_abort(char const*, int, char const*)
???:0
0x92701d cp_build_modify_expr(unsigned int, tree_node*, tree_code, tree_node*, int)
???:0
0x927ae2 build_x_modify_expr(unsigned int, tree_node*, tree_code, tree_node*, tree_node*, int)
???:0
0x8beb17 instantiate_decl(tree_node*, bool, bool)
???:0
0x8d993b instantiate_pending_templates(int)
如果不使用函数模板
state_seq parse()
GCC编译它很好,或者如果co_yield
的结果被分配给const r_ref编译它也很好。
可能有人遇到过这个问题并且知道这个问题的根源。 您可以发布一些错误报告或调查此问题的文章的链接吗?
可能有人遇到过这个问题并且知道这个问题的根源 问题。您能否发布一些错误报告或文章的链接 调查这个问题。
无论用户的代码格式是否良好,内部编译器错误始终表示编译器错误,这已在PR108620中进行了跟踪。