ilya-biryukov added a comment.

Reverting the RVO breaks some coroutine code we have. The short repro is  
https://gcc.godbolt.org/z/1543qc8Ee (code at the end of the post, very similar 
to the deleted constructor in `warn-throw-out-noexcept-coro.cpp`):
The RVO seems to be mandated by the standard and D145641 
<https://reviews.llvm.org/D145641> is in the works to fix this.

Could we revert this change and wait for D145641 
<https://reviews.llvm.org/D145641> to land before reverting existing RVO 
behavior?
This would unblock our compiler releases (we live at head). This looks like the 
right trade-off given that previous behavior was in Clang for more than a year 
after D117087 <https://reviews.llvm.org/D117087> landed.

Reproducer <https://gcc.godbolt.org/z/1543qc8Ee> (works in Clang 15 and GCC, 
fails in trunk):

  #include <coroutine>
  
  struct MyTask{
    struct promise_type {
      MyTask get_return_object() { return 
MyTask{std::coroutine_handle<promise_type>::from_promise(*this)}; }
      std::suspend_always initial_suspend() { return {}; }
  
      void unhandled_exception();
      void return_void() {} 
  
      auto await_transform(MyTask task) {
        struct Awaiter {
          bool await_ready() { return false; }
          std::coroutine_handle<promise_type> 
await_suspend(std::coroutine_handle<promise_type> h);
          std::nullptr_t await_resume();
  
          promise_type& caller;
          promise_type& callee;
        };
  
        return Awaiter{*this, task.handle.promise()};
      }
      
      auto final_suspend() noexcept {
        struct Awaiter {
          bool await_ready() noexcept { return false; }
          std::coroutine_handle<promise_type> 
await_suspend(std::coroutine_handle<promise_type> h) noexcept;
          void await_resume() noexcept;
  
          std::coroutine_handle<promise_type> to_resume;
        };
  
        return Awaiter{resume_when_done};
      }
  
      // The coroutine to resume when we're done.
      std::coroutine_handle<promise_type> resume_when_done;
    };
  
    explicit MyTask(std::coroutine_handle<promise_type>);
    MyTask(MyTask&&) = delete;
  
    // A handle for the coroutine that returned this task.
    std::coroutine_handle<promise_type> handle;
  };
  
  MyTask DoNothing() {
    co_return;
  }


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