File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -114,10 +114,8 @@ class write_now
114114 std::stop_token token_;
115115 bool done_ = false ;
116116
117- // GCC 14 ICEs on any template type instantiated
118- // with an IoAwaitable in the coroutine frame, even
119- // trivial ones. Type-erase behind function pointers
120- // so the frame sees only a non-template struct.
117+ // GCC 14 ICE bisection: trivially destructible
118+ // aggregate with full interface
121119 struct erased_io_awaiter
122120 {
123121 void * inner_;
@@ -148,48 +146,6 @@ class write_now
148146 inner_ = nullptr ;
149147 return r;
150148 }
151-
152- erased_io_awaiter (
153- void * inner,
154- promise_type* p,
155- bool (*ready)(void *),
156- coro (*suspend)(
157- void *, coro,
158- executor_ref, std::stop_token),
159- io_result<std::size_t> (*resume)(void *),
160- void (*destroy)(void *)) noexcept
161- : inner_(inner)
162- , p_(p)
163- , ready_(ready)
164- , suspend_(suspend)
165- , resume_(resume)
166- , destroy_(destroy)
167- {
168- }
169-
170- ~erased_io_awaiter ()
171- {
172- if (inner_)
173- destroy_ (inner_);
174- }
175-
176- erased_io_awaiter (
177- erased_io_awaiter&& o) noexcept
178- : inner_(std::exchange(o.inner_, nullptr ))
179- , p_(o.p_)
180- , ready_(o.ready_)
181- , suspend_(o.suspend_)
182- , resume_(o.resume_)
183- , destroy_(o.destroy_)
184- {
185- }
186-
187- erased_io_awaiter (
188- erased_io_awaiter const &) = delete;
189- erased_io_awaiter& operator =(
190- erased_io_awaiter const &) = delete ;
191- erased_io_awaiter& operator =(
192- erased_io_awaiter&&) = delete ;
193149 };
194150
195151 op_type get_return_object ()
You can’t perform that action at this time.
0 commit comments