GCC 在简单协程上中断编译并显示此消息“内部编译器错误:in instantiate_type”

问题描述 投票:0回答:1

编译我的代码时收到 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编译它也很好。

可能有人遇到过这个问题并且知道这个问题的根源。 您可以发布一些错误报告或调查此问题的文章的链接吗?

gcc g++ c++20 coroutine
1个回答
0
投票

可能有人遇到过这个问题并且知道这个问题的根源 问题。您能否发布一些错误报告或文章的链接 调查这个问题。

无论用户的代码格式是否良好,内部编译器错误始终表示编译器错误,这已在PR108620中进行了跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.