// { 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; }