temporary1.C   [plain text]


// { dg-do run  }
extern "C" int printf (const char *, ...);

int c, d;
class Foo 
{
public:
   Foo() { printf("Foo() 0x%08lx\n", (__SIZE_TYPE__)this); ++c; }
   Foo(Foo const &) { printf("Foo(Foo const &) 0x%08lx\n", (__SIZE_TYPE__)this); }
   ~Foo() { printf("~Foo() 0x%08lx\n", (__SIZE_TYPE__)this); ++d; }
};

// Bar creates constructs a temporary Foo() as a default
class Bar 
{
public:
   Bar(Foo const & = Foo()) { printf("Bar(Foo const &) 0x%08lx\n", (__SIZE_TYPE__)this); }
};

void fakeRef(Bar *)
{
}

int main() 
{
   // Create array of Bar. Will use default argument on constructor.
   // The old compiler will loop constructing Bar. Each loop will
   // construct a temporary Foo() but will not destruct the Foo(). 
   // The Foo() temporary is destructed only once after the loop 
   // completes. This could lead to a memory leak if the constructor 
   // of Foo() allocates memory.
   Bar bar[2];

   fakeRef(bar);

   printf("Done\n");

   if (c == d && c == 2)
     return 0;
   return 1;
}