https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102704

            Bug ID: 102704
           Summary: NRVO for throw expression
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vanyacpp at gmail dot com
  Target Milestone: ---

Consider this code:

struct mytype
{
    mytype();
    mytype(mytype const&);
    mytype(mytype&&);
};

void test()
{
    mytype e;
    throw e;
}

Currently for function test() GCC generates the following sequence of calls
(pseudocode):

    char e[sizeof(mytype)];
    mytype_default_ctor(e);
    p = __cxa_allocate_exception();
    mytype_move_ctor(p, e);
    __cxa_throw(p);

I believe a trick similar to NRVO for returns can be made here. When a variable
meets NRVO criteria, compiler can remove the local variable and replace it with
a storage allocated by __cxa_allocate_exception. Here what I believe can be
generated:

    p = __cxa_allocate_exception();
    mytype_default_ctor(p);
    __cxa_throw(p);

Reply via email to