https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67036
Bug ID: 67036 Summary: GCC does not warn of throwing destructors in C++11, even when they lack noexcept(false) and std::uncaught_exception Product: gcc Version: 5.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: noloader at gmail dot com Target Milestone: --- Compiling under -Wall -Wextra does not produce a warning: $ cat test-throw.cpp #include <stdexcept> #include <iostream> struct useless { useless() { std::cout << "in" << std::endl; } ~useless() { std::cout << "out" << std::endl; throw std::runtime_error("who knows..."); } }; int main(int argc, char* argv[]) { useless u; return argc; } $ gcc -O1 -Wall -Wextra -c test-throw.cpp test-throw.cpp:10:26: warning: unused parameter 'argv' [-Wunused-parameter] int main(int argc, char* argv[]) ^ 1 warning generated. ***** Same result with C++11: $ gcc -std=c++11 -O1 -Wall -Wextra -c test-throw.cpp test-throw.cpp:10:26: warning: unused parameter 'argv' [-Wunused-parameter] int main(int argc, char* argv[]) ^ 1 warning generated. Microsoft Visual Studio will warn. ***** The warning is useful because it brings attention to a potential sore spot: throwing during an unwind due to an exception. Maybe the gap could be turned into a full fledged diagnostic: if the dtor throws and (1) lacks noexcept(false) under C++11 or (2) and lacks a check for std::uncaught_exception(), then the warning should be applied aggressively (say at -Wall). Otherwise, have the throwing destructor generate a warning at -Wall. Or maybe something else along similar lines... I can state from experience the Visual Studio warning alerted us to look at a particular dtor, and it was not checking for !std::uncaught_exception() before throwing. (It was one of two classes among hundreds that threw, so it was easy to miss throughout the day). And as soon as Visual Studio caught it, two people on the team asked why GCC did not catch it. (GCC is held in higher regard).