mizvekov added a comment.

In D99696#2817126 <https://reviews.llvm.org/D99696#2817126>, @rjmccall wrote:

> When `__block` variables get moved to the heap, they're supposed to be moved 
> if possible, not copied.  It looks like PerformMoveOrCopyInitialization 
> requires NRVO info to be passed in to ever do a move.  Maybe it's being 
> passed in wrong when building `__block` copy expressions in some situation.

Found the culprit, that functionality was implemented in checkEscapingByref, 
and it was a bit of a shocker that such a thing was just hiding in a function 
with such an unassuming name :)
Also surprising to find here another user of the two-step overload resolution, 
that also escaped our radar.
There is a C++ proposal (P2266 <https://reviews.llvm.org/P2266>) to replace 
that mechanism with something much simpler.

So since this is an ObjectiveC thing, how is the semantics of this interaction 
defined, just in terms of C++ NRVO?
As this reuses `PerformMoveOrCopyInitialization`, it is also affected by the 
change going into C++20 where the restriction on only converting constructors 
was lifted. Was this accidental and nobody noticed?

For this patch I am going to revert to the original behavior, but I think this 
could be revisited in the future so it gets aligned with the C++2b rules after 
P2266 <https://reviews.llvm.org/P2266>, which would be just having VarRef be an 
XValue unconditionally and perform the regular copy initialization.

> Was there really not a test case covering those semantics?

Nope...


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D99696

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

Reply via email to