ChuanqiXu added a comment.

In D145639#4198837 <https://reviews.llvm.org/D145639#4198837>, @ilya-biryukov 
wrote:

> In D145639#4198794 <https://reviews.llvm.org/D145639#4198794>, @ChuanqiXu 
> wrote:
>
>>> ! In D145639#4198815 <https://reviews.llvm.org/D145639#4198815>, @ChuanqiXu 
>>> wrote:
>>>  The RVO seems to be mandated by the standard.
>>
>> Yeah, I thought so... But WG21 decided to not make it in a recent meeting... 
>> So we can only make it as a non-mandated compiler optimization.
>
> That's unexpected. Are there any wording change proposals published?
> Our understanding comes from the reading of dcl.fct.def.coroutine/7 
> <https://timsong-cpp.github.io/cppwp/n4868/dcl.fct.def.coroutine#7>
>
>> The expression promise.get_return_object() is used to initialize the glvalue 
>> result or prvalue result object of a call to a coroutine.
>
> And we **think** RVO is mandated when initializing the **result objects** 
> mentioned in general.
> Also, from https://github.com/llvm/llvm-project/issues/56532:
>
>> Q: if the initialization does occur later, by what mechanism the prvalue 
>> result of get_return_object is forwarded to that initialization.
>> A: (see below)
>> Case 1/2. Same type of get_return_object and coroutine return type.
>> **Constructed in the return slot.**
>> Case 3. Different types:
>> (1) Constructed temporary object prior to initial suspend initialized with a 
>> call to get_return_object()
>> (2) when coroutine needs to to return to the caller and needs to construct 
>> return value for the coroutine it is initialized with expiring value of the 
>> temporary obtained in step 1.

The formal file shouldn't be released yet. But we can find the issue report and 
the proposed solution in https://cplusplus.github.io/CWG/issues/2563.html.

The words you quoted is the recording of the wg21's discussion during the 
meeting. And that's the **intention** of the designers but it is not reflected 
to the wording.  What issue 2563 discussed is that if we should delay the 
conversion. And the RVO is a conclusion of that. But according to the result, 
we should say the compiler is allowed to do RVO if the types matched but it is 
not required.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145639/new/

https://reviews.llvm.org/D145639

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to