http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58050

            Bug ID: 58050
           Summary: RVO fails when calling static function through unnamed
                    temporary
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: scovich at gmail dot com

Return value optimization is not applied when calling a static member function
via an unnamed temporary (value or pointer, it doesn't matter). Calling the
function directly, or through a named value/pointer, works as expected:

// <<<--- bug.cpp --->>>
extern "C" int puts(char const*);
struct B {
    ~B() { puts("\t~B"); }
};
struct A {
    static B make() { return B(); }
} a;
A *ap() { return &a; }
int main () {
    puts("b1");
    {B b = A::make();}
    puts("b2");
    {B B = a.make();}
    puts("b3");
    {B b = ap()->make();}
    puts("b4");
    {B b = A().make();}
}
// <<<--- end bug.cpp --->>>

Output is (same for both 4.8.1 and 4.6.3):
$ g++ bug.cpp && ./a.out
b1
        ~B
b2
        ~B
b3
        ~B
        ~B
b4
        ~B
        ~B

The workaround is simple enough to apply, if you happen to notice all the extra
object copies being made; I isolated the test case from an app that used 5x
more malloc bandwidth than necessary because a single static function called
the wrong way returned a largish STL object by value.

Reply via email to