On 9/30/22 18:50, Iain Sandoe wrote:
Hi Jason,
On 30 Sep 2022, at 23:06, Jason Merrill <ja...@redhat.com> wrote:
You can't use CONVERT_EXPR to convert between two class types, and it was
breaking copy elision.
Unfortunately, this patch breaks symmetric-transfer-00-basic.C, where
susp_type is Loopy<int>::handle_type. How is this supposed to work?
We are trying to save a type-erased handle (which the symmetric transfer makes
and indirect call through, nothing else).
The problem is you're treating one class directly as another class here,
without the indirection involved in usual type-erasure idioms.
It does seem that the gimplifier handles this fine, but it doesn't
correspond to anything in the language and much of the front end assumes
that CONVERT_EXPR is only used for scalars. VIEW_CONVERT_EXPR would
better express that we're not doing anything to the value, just cheating
the type system. That's still dodgy from a language perspective, but
probably safe enough in this case.
Note that I was wrong to mention copy elision above; it's irrelevant to
codegen here since the handle type returns in a register.
so, I suppose the equivalent could be:
conthand = coroutine_handle::from_address (suspend.address())
That sounds more correct, yes.
Jason