Patchwork const char* constructor overloads for stdexcept and system_error.

login
register
mail settings
Submitter Jonathan Wakely
Date June 24, 2012, 11:25 a.m.
Message ID <CAH6eHdRuJknRCxn_NHqMW-gaqzJ6RJdv5j3+8QvJjLvOjpVFEg@mail.gmail.com>
Download mbox | patch
Permalink /patch/166878/
State New
Headers show

Comments

Jonathan Wakely - June 24, 2012, 11:25 a.m.
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?

Patch

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
+};