On 24 June 2012 04:57, Ed Smith-Rowland wrote:
> Here is a beginning patch to add const char* constructors for the standard
> exception classes.
>
> I didn't bump the so version because I'm not positive how to do it. I tried
> changing libtool_VERSION in acinclude.m4 and running the autotools commands.
>  The diffs were very messy because my machine has autotools 1.11.3 rather
> than 1.11.1.  Also, we might want to wait for something cooler to bump the
> soname.

(CC'ing gcc-patches)

Could those new constructors be inline, avoiding the need for a new
file and version bump?
Index: include/std/system_error
===================================================================
--- include/std/system_error    (revision 188848)
+++ include/std/system_error    (working copy)
@@ -318,17 +318,13 @@
     system_error(error_code __ec, const string& __what)
     : runtime_error(__what + ": " + __ec.message()), _M_code(__ec) { }
 
-    /*
-     * TODO: Add const char* ctors to all exceptions.
-     *
-     * system_error(error_code __ec, const char* __what)
-     * : runtime_error(__what + (": " + __ec.message())), _M_code(__ec) { }
-     *
-     * system_error(int __v, const error_category& __ecat, const char* __what)
-     * : runtime_error(__what + (": " + __ec.message())),
-     *   _M_code(error_code(__v, __ecat)) { }
-     */
+    system_error(error_code __ec, const char* __what)
+    : runtime_error(__what + (": " + __ec.message())), _M_code(__ec) { }
 
+    system_error(int __v, const error_category& __ecat, const char* __what)
+    : runtime_error(__what + (": " + error_code(__v, __ecat).message())),
+      _M_code(__v, __ecat) { }
+
     system_error(int __v, const error_category& __ecat)
     : runtime_error(error_code(__v, __ecat).message()),
       _M_code(__v, __ecat) { }
Index: include/std/stdexcept
===================================================================
--- include/std/stdexcept       (revision 188848)
+++ include/std/stdexcept       (working copy)
@@ -61,6 +61,10 @@
     /** Takes a character string describing the error.  */
     explicit 
     logic_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit 
+    logic_error(const char* __arg);
+#endif
 
     virtual ~logic_error() _GLIBCXX_USE_NOEXCEPT;
 
@@ -76,6 +80,9 @@
   {
   public:
     explicit domain_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit domain_error(const char* __arg);
+#endif
     virtual ~domain_error() _GLIBCXX_USE_NOEXCEPT;
   };
 
@@ -84,6 +91,9 @@
   {
   public:
     explicit invalid_argument(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit invalid_argument(const char* __arg);
+#endif
     virtual ~invalid_argument() _GLIBCXX_USE_NOEXCEPT;
   };
 
@@ -93,6 +103,9 @@
   {
   public:
     explicit length_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit length_error(const char* __arg);
+#endif
     virtual ~length_error() _GLIBCXX_USE_NOEXCEPT;
   };
 
@@ -102,6 +115,9 @@
   {
   public:
     explicit out_of_range(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit out_of_range(const char* __arg);
+#endif
     virtual ~out_of_range() _GLIBCXX_USE_NOEXCEPT;
   };
 
@@ -118,6 +134,10 @@
     /** Takes a character string describing the error.  */
     explicit 
     runtime_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit 
+    runtime_error(const char* __arg);
+#endif
 
     virtual ~runtime_error() _GLIBCXX_USE_NOEXCEPT;
 
@@ -132,6 +152,9 @@
   {
   public:
     explicit range_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit range_error(const char* __arg);
+#endif
     virtual ~range_error() _GLIBCXX_USE_NOEXCEPT;
   };
 
@@ -140,6 +163,9 @@
   {
   public:
     explicit overflow_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit overflow_error(const char* __arg);
+#endif
     virtual ~overflow_error() _GLIBCXX_USE_NOEXCEPT;
   };
 
@@ -148,6 +174,9 @@
   {
   public:
     explicit underflow_error(const string& __arg);
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+    explicit underflow_error(const char* __arg);
+#endif
     virtual ~underflow_error() _GLIBCXX_USE_NOEXCEPT;
   };
 
Index: testsuite/util/testsuite_abi.cc
===================================================================
--- testsuite/util/testsuite_abi.cc     (revision 188848)
+++ testsuite/util/testsuite_abi.cc     (working copy)
@@ -195,6 +195,7 @@
       known_versions.push_back("GLIBCXX_3.4.15");
       known_versions.push_back("GLIBCXX_3.4.16");
       known_versions.push_back("GLIBCXX_3.4.17");
+      known_versions.push_back("GLIBCXX_3.4.18");
       known_versions.push_back("GLIBCXX_LDBL_3.4");
       known_versions.push_back("GLIBCXX_LDBL_3.4.7");
       known_versions.push_back("GLIBCXX_LDBL_3.4.10");
Index: src/c++11/Makefile.in
===================================================================
--- src/c++11/Makefile.in       (revision 188848)
+++ src/c++11/Makefile.in       (working copy)
@@ -69,7 +69,7 @@
 am__objects_1 = chrono.lo condition_variable.lo debug.lo \
        functexcept.lo functional.lo future.lo hash_c++0x.lo \
        hashtable_c++0x.lo limits.lo mutex.lo placeholders.lo regex.lo \
-       shared_ptr.lo system_error.lo thread.lo
+       shared_ptr.lo stdexcept-c++11.lo system_error.lo thread.lo
 @ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_2 = fstream-inst.lo \
 @ENABLE_EXTERN_TEMPLATE_TRUE@  string-inst.lo wstring-inst.lo
 am_libc__11convenience_la_OBJECTS = $(am__objects_1) $(am__objects_2)
@@ -311,6 +311,7 @@
        placeholders.cc \
        regex.cc  \
        shared_ptr.cc \
+       stdexcept-c++11.cc \
        system_error.cc \
        thread.cc
 
Index: src/c++11/stdexcept-c++11.cc
===================================================================
--- src/c++11/stdexcept-c++11.cc        (revision 0)
+++ src/c++11/stdexcept-c++11.cc        (revision 0)
@@ -0,0 +1,65 @@
+// Methods for Exception Support for -*- C++ -*-
+
+// Copyright (C) 2012
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+//
+// ISO C++ 14882: 19.1  Exception classes
+//
+
+#include <string>
+#include <stdexcept>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  logic_error::logic_error(const char* __arg)
+  : logic_error(string(__arg)) { }
+
+  domain_error::domain_error(const char* __arg)
+  : domain_error(string(__arg)) { }
+
+  invalid_argument::invalid_argument(const char* __arg)
+  : invalid_argument(string(__arg)) { }
+
+  length_error::length_error(const char* __arg)
+  : length_error(string(__arg)) { }
+
+  out_of_range::out_of_range(const char* __arg)
+  : out_of_range(string(__arg)) { }
+
+  runtime_error::runtime_error(const char* __arg)
+  : runtime_error(string(__arg)) { }
+
+  range_error::range_error(const char* __arg)
+  : range_error(string(__arg)) { }
+
+  overflow_error::overflow_error(const char* __arg)
+  : overflow_error(string(__arg)) { }
+
+  underflow_error::underflow_error(const char* __arg)
+  : underflow_error(string(__arg)) { }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
Index: src/c++11/Makefile.am
===================================================================
--- src/c++11/Makefile.am       (revision 188848)
+++ src/c++11/Makefile.am       (working copy)
@@ -43,6 +43,7 @@
        placeholders.cc \
        regex.cc  \
        shared_ptr.cc \
+       stdexcept-c++11.cc \
        system_error.cc \
        thread.cc
 
Index: config/abi/pre/gnu.ver
===================================================================
--- config/abi/pre/gnu.ver      (revision 188848)
+++ config/abi/pre/gnu.ver      (working copy)
@@ -1321,6 +1321,23 @@
 
 } GLIBCXX_3.4.16;
 
+GLIBCXX_3.4.18 {
+
+    # const char* ctors for stdexcept.
+    _ZNSt11logic_errorC1EPKc;
+    _ZNSt11range_errorC1EPKc;
+    _ZNSt12domain_errorC1EPKc;
+    _ZNSt12length_errorC1EPKc;
+    _ZNSt12out_of_rangeC1EPKc;
+    _ZNSt13runtime_errorC1EPKc;
+    _ZNSt14overflow_errorC1EPKc;
+    _ZNSt15underflow_errorC1EPKc;
+    _ZNSt16invalid_argumentC1EPKc;
+    _ZNSt12system_errorD1Ev;
+    _ZTVSt12system_error;
+
+} GLIBCXX_3.4.17;
+
 # Symbols in the support library (libsupc++) have their own tag.
 CXXABI_1.3 {
 
@@ -1522,4 +1539,4 @@
   global:
     __cxa_tm_cleanup;
 
-};
\ No newline at end of file
+};

Reply via email to