ChuanqiXu added inline comments.

================
Comment at: clang/lib/Sema/Scope.cpp:152-154
+  // Consider the variable as NRVO candidate if the return slot is available
+  // for it in the current scope, or if it can be available in outer scopes.
+  NRVO = CanBePutInReturnSlot ? VD : nullptr;
----------------
rusyaev-roman wrote:
> ChuanqiXu wrote:
> > What if NRVO contains a value already? It is possible due to the value of 
> > NRVO could be set by its children.
> Actually this is intention. If the parent has already NRVO candidate, then it 
> should be invalidated (or not). Let's consider the following examples:
> 
> 
> ```
> X foo(bool b) {
>    X x;
>    X y;
>    if (b)
>       return x;
>    else
>       return y; // when we process this return statement, the parent has 
> already NRVO and it will be invalidated (this is correct behavior)
> }
> ```
> 
> ```
> X foo(bool b) {
>    X x;
>    if (b)
>       return x;
>    
>    X y;
>    // when we process this return statement, the parent has already NRVO and 
> it WON't be invalidated
>    //  (this is correct behavior), because a return slot will be available 
> for it
>    return y;
> }
> ```
> 
> ```
> X foo(bool b) {
>    X x;
>    if (b)
>       return x;
> 
>    // when we process this return statement, the parent has already NRVO and 
> it WON't be invalidated (this is correct behavior)
>    return x;
> }
> ```
> 
> ```
> X foo(bool b, X x) {
>    X y;
>    
>    if (b)
>       return x;
> 
>    // when we process this return statement, the parent contains nullptr 
> (invalid candidate) and it will be invalidated (this is correct behavior)
>    return y;
> }
> ```
> 
> ```
> X foo(bool b, X x) {
>    if (b)
>       return x;
> 
>    X y;
>    // when we process this return statement, the parent contains nullptr 
> (invalid candidate) and it WON't be invalidated (this is correct behavior)
>    return y;
> }
> ```
Oh, I see. Tricky. I don't find invalid cases now. But I recommend to comment 
that the children would maintain the `ReturnSlots` of their parents. (This is 
anti-intuition)

Have you tested any larger projects? Like libc++, libstdc++ or something like 
folly. I feel we need to do such tests to avoid we get anything wrong.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D119792

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

Reply via email to