https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64399
Bug ID: 64399 Summary: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor Product: gcc Version: 4.8.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: mw_triad at users dot sourceforge.net Consider the following code: #include <memory> struct X { ~X(); }; struct Y : X { ~Y(); }; std::unique_ptr<Y> f(); void g() { std::unique_ptr<X> x = f(); } This code is almost certainly broken; ownership of the constructed Y is transferred to an owning unique_ptr in a way that will most likely (in general; "always" in this specific example) result in Y's destructor never being called. It seems pretty silly that there is no diagnostic for this. There ought to be a warning in unique_ptr's conversion operator converting from Derived to Base if ~Base is not virtual. (Arranging at the library level to trip -Wnon-virtual-dtor seems logical.)