https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82560
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Known to work| |6.4.0 Keywords| |wrong-code Last reconfirmed| |2017-10-16 See Also| |https://gcc.gnu.org/bugzill | |a/show_bug.cgi?id=49372 Ever confirmed|0 |1 Summary|Temporary object created as |[7/8 Regression] Temporary |a default argument not |object created as a default |destructed |argument not destructed Target Milestone|--- |7.3 Known to fail| |7.2.0, 8.0 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Confirmed: extern "C" int printf(const char*, ...); struct Foo { Foo(const char *) { printf("%p\tFoo(const char*)\n", this); } Foo(const Foo&) { printf("%p\tFoo(const Foo&)\n", this); } ~Foo() { printf("%p\t~Foo()\n", this); } }; struct Bar { Bar(Foo foo = "implicitly casted to Foo") : foo_(foo) { printf("%p\tBar(Foo)\n", this); } ~Bar() { printf("%p\t~Bar()\n", this); } Foo foo_; }; template<typename T> struct unique_ptr { unique_ptr(T* p) : p(p) { } ~unique_ptr() { delete p; } T* p; }; int main() { { printf("OK:\n"); unique_ptr<Bar> p1(new Bar); } { printf("Wrong:\n"); unique_ptr<Bar> p2(new Bar()); } }