https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77312
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code Status|UNCONFIRMED |NEW Last reconfirmed| |2016-08-22 Version|unknown |5.4.1 Ever confirmed|0 |1 --- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced: struct function_impl_base { virtual ~function_impl_base() = default; virtual void invoke() = 0; }; template<typename F> struct function_impl : function_impl_base { function_impl(F f) : f(f) { } void invoke() { f(); } F f; }; struct function { template<typename F> function(F f) : impl(new function_impl<F>{f}) { } ~function() { delete impl; } function(const function&) = delete; function_impl_base* impl; void operator()() { impl->invoke(); } }; template <class U> struct LambdaHolder { LambdaHolder() : lambda_{[this]() { delete this; }} { } void Run() { lambda_(); } function lambda_; }; int main() { LambdaHolder<int>* l = new LambdaHolder<int>(); l->Run(); } There's no reason this should need to access the freed memory. Clang and EDG don't.