https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118980
Bug ID: 118980 Summary: std::system_error should not be default constructible Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: accepts-invalid Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- We have a non-standard default argument on this constructor: system_error(error_code __ec = error_code()) The system_error(error_code) constructor was added to the C++0x WP by https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2422.htm#Issue24 That ctor was added to libstdc++ by r0-86777-g4514bed67d02fb but with a default argument, but I don't know why. We don't have any tests that We should split the constructor into two, deprecate the default ctor for GCC 16, then remove it: --- a/libstdc++-v3/include/std/system_error +++ b/libstdc++-v3/include/std/system_error @@ -561,7 +561,9 @@ namespace __adl_only error_code _M_code; public: - system_error(error_code __ec = error_code()) + [[__deprecated__]] system_error() : system_error(error_code{}) { } + + system_error(error_code __ec) : runtime_error(__ec.message()), _M_code(__ec) { } system_error(error_code __ec, const string& __what) We need to fix one test that currently uses the default constructor: FAIL: 19_diagnostics/system_error/cons_virtual_derivation.cc -std=gnu++17 (test for excess errors) For now the fix will be to add a dg-warning for the -Wdeprecated-declaration warning (or suppress it) but after we remove the default constructor we'll need to find some way to construct a std::system_error in the diamond_derivation_error class, which assumes that either it's default constructible or can be constructed from a const char*. N.B. https://cplusplus.github.io/LWG/issue3162 says the system_error(error_code) ctor should be explicit, but it hasn't been approved.