Hello, When writing code such as ... throw std::logic_error ("cold coffee"); ... currently the construction of std::string happens in the code that throws the exception, which results in code bloat. Implementing the const char* constructors as defined by C++11 fixes the issue. I'm not sure whether the #if __cplusplus >= 201103L checks are required. C++98 code could also benefit from the overloads.
Tested with 'make all' and 'make install', writing a hello world and checking the asm output. Cheers, Oleg libstdc++-v3/ChangeLog: * include/std/stdexcept (logic_error, domain_error, invalid_argument, length_error, out_of_range, runtime_error, range_error, overflow_error, underflow_error): Declare const char* constructors. * src/c++98/stdexcept.cc (logic_error, domain_error, invalid_argument, length_error, out_of_range, runtime_error, range_error, overflow_error, underflow_error): Implement them.
Index: libstdc++-v3/include/std/stdexcept =================================================================== --- libstdc++-v3/include/std/stdexcept (revision 206101) +++ libstdc++-v3/include/std/stdexcept (working copy) @@ -58,9 +58,12 @@ public: /** Takes a character string describing the error. */ - explicit + explicit logic_error(const string& __arg); - +#if __cplusplus >= 201103L + explicit + logic_error(const char* __arg); +#endif virtual ~logic_error() _GLIBCXX_USE_NOEXCEPT; /** Returns a C-style character string describing the general cause of @@ -75,6 +78,9 @@ { public: explicit domain_error(const string& __arg); +#if __cplusplus >= 201103L + explicit domain_error(const char* __arg); +#endif virtual ~domain_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -83,6 +89,9 @@ { public: explicit invalid_argument(const string& __arg); +#if __cplusplus >= 201103L + explicit invalid_argument(const char* __arg); +#endif virtual ~invalid_argument() _GLIBCXX_USE_NOEXCEPT; }; @@ -92,6 +101,9 @@ { public: explicit length_error(const string& __arg); +#if __cplusplus >= 201103L + explicit length_error(const char* __arg); +#endif virtual ~length_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -101,6 +113,9 @@ { public: explicit out_of_range(const string& __arg); +#if __cplusplus >= 201103L + explicit out_of_range(const char* __arg); +#endif virtual ~out_of_range() _GLIBCXX_USE_NOEXCEPT; }; @@ -115,9 +130,12 @@ public: /** Takes a character string describing the error. */ - explicit + explicit runtime_error(const string& __arg); - +#if __cplusplus >= 201103L + explicit + runtime_error(const char* __arg); +#endif virtual ~runtime_error() _GLIBCXX_USE_NOEXCEPT; /** Returns a C-style character string describing the general cause of @@ -131,6 +149,9 @@ { public: explicit range_error(const string& __arg); +#if __cplusplus >= 201103L + explicit range_error(const char* __arg); +#endif virtual ~range_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -139,6 +160,9 @@ { public: explicit overflow_error(const string& __arg); +#if __cplusplus >= 201103L + explicit overflow_error(const char* __arg); +#endif virtual ~overflow_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -147,6 +171,9 @@ { public: explicit underflow_error(const string& __arg); +#if __cplusplus >= 201103L + explicit underflow_error(const char* __arg); +#endif virtual ~underflow_error() _GLIBCXX_USE_NOEXCEPT; }; Index: libstdc++-v3/src/c++98/stdexcept.cc =================================================================== --- libstdc++-v3/src/c++98/stdexcept.cc (revision 206101) +++ libstdc++-v3/src/c++98/stdexcept.cc (working copy) @@ -36,6 +36,11 @@ logic_error::logic_error(const string& __arg) : exception(), _M_msg(__arg) { } +#if __cplusplus >= 201103L + logic_error::logic_error(const char* __arg) + : exception(), _M_msg(__arg) { } +#endif + logic_error::~logic_error() _GLIBCXX_USE_NOEXCEPT { } const char* @@ -45,26 +50,51 @@ domain_error::domain_error(const string& __arg) : logic_error(__arg) { } +#if __cplusplus >= 201103L + domain_error::domain_error(const char* __arg) + : logic_error(__arg) { } +#endif + domain_error::~domain_error() _GLIBCXX_USE_NOEXCEPT { } invalid_argument::invalid_argument(const string& __arg) : logic_error(__arg) { } +#if __cplusplus >= 201103L + invalid_argument::invalid_argument(const char* __arg) + : logic_error(__arg) { } +#endif + invalid_argument::~invalid_argument() _GLIBCXX_USE_NOEXCEPT { } length_error::length_error(const string& __arg) : logic_error(__arg) { } +#if __cplusplus >= 201103L + length_error::length_error(const char* __arg) + : logic_error(__arg) { } +#endif + length_error::~length_error() _GLIBCXX_USE_NOEXCEPT { } out_of_range::out_of_range(const string& __arg) : logic_error(__arg) { } +#if __cplusplus >= 201103L + out_of_range::out_of_range(const char* __arg) + : logic_error(__arg) { } +#endif + out_of_range::~out_of_range() _GLIBCXX_USE_NOEXCEPT { } runtime_error::runtime_error(const string& __arg) : exception(), _M_msg(__arg) { } +#if __cplusplus >= 201103L + runtime_error::runtime_error(const char* __arg) + : exception(), _M_msg(__arg) { } +#endif + runtime_error::~runtime_error() _GLIBCXX_USE_NOEXCEPT { } const char* @@ -74,16 +104,31 @@ range_error::range_error(const string& __arg) : runtime_error(__arg) { } +#if __cplusplus >= 201103L + range_error::range_error(const char* __arg) + : runtime_error(__arg) { } +#endif + range_error::~range_error() _GLIBCXX_USE_NOEXCEPT { } overflow_error::overflow_error(const string& __arg) : runtime_error(__arg) { } +#if __cplusplus >= 201103L + overflow_error:overflow_error(const char* __arg) + : runtime_error(__arg) { } +#endif + overflow_error::~overflow_error() _GLIBCXX_USE_NOEXCEPT { } underflow_error::underflow_error(const string& __arg) : runtime_error(__arg) { } +#if __cplusplus >= 201103L + underflow_error::underflow_error(const char* __arg) + : runtime_error(__arg) { } +#endif + underflow_error::~underflow_error() _GLIBCXX_USE_NOEXCEPT { } _GLIBCXX_END_NAMESPACE_VERSION