2006-11-07 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Nov 2006 18:36:32 +0000 (18:36 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Nov 2006 18:36:32 +0000 (18:36 +0000)
PR libstdc++/29722
* include/ext/concurrence.h (concurrence_lock_error): New.
(concurrence_unlock_error): New.
(__throw_concurrence_lock_error): New.
(__throw_concurrence_unlock_error): New.
(__mutex): Use functions.
(__recursive_mutex): Same.
* testsuite/abi/cxx_runtime_only_linkage.cc: New.

* include/ext/pb_ds/exception.hpp: Keep exception classes defined
even when -fno-exceptions is passed, consistent with other usage.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118564 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/concurrence.h
libstdc++-v3/include/ext/pb_ds/exception.hpp
libstdc++-v3/testsuite/abi/cxx_runtime_only_linkage.cc [new file with mode: 0644]

index caca3e7..e0ee343 100644 (file)
@@ -1,5 +1,19 @@
 2006-11-07  Benjamin Kosnik  <bkoz@redhat.com>
 
+       PR libstdc++/29722
+       * include/ext/concurrence.h (concurrence_lock_error): New.
+       (concurrence_unlock_error): New.
+       (__throw_concurrence_lock_error): New.
+       (__throw_concurrence_unlock_error): New.
+       (__mutex): Use functions.
+       (__recursive_mutex): Same.
+       * testsuite/abi/cxx_runtime_only_linkage.cc: New.
+
+       * include/ext/pb_ds/exception.hpp: Keep exception classes defined
+       even when -fno-exceptions is passed, consistent with other usage.
+       
+2006-11-07  Benjamin Kosnik  <bkoz@redhat.com>
+
        * include/ext/pb_ds/exception.hpp (pb_ds): Modify for -fno-exceptions.
        (__throw_container_error): New. Conditionalize based on __EXCEPTIONS.
        (__throw_insert_error): New.
index a19ba8e..868264d 100644 (file)
@@ -36,6 +36,8 @@
 #ifndef _CONCURRENCE_H
 #define _CONCURRENCE_H 1
 
+#include <cstdlib>
+#include <exception>
 #include <bits/gthr.h> 
 #include <bits/functexcept.h>
 
@@ -62,6 +64,45 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 #else
   _S_single;
 #endif
+  
+  // NB: As this is used in libsupc++, need to only depend on
+  // exception. No stdexception classes, no use of std::string.
+  class concurrence_lock_error : public std::exception
+  {
+  public:
+    virtual char const*
+    what() const throw()
+    { return "__gnu_cxx::concurrence_lock_error"; }
+  };
+
+  class concurrence_unlock_error : public std::exception
+  {
+  public:
+    virtual char const*
+    what() const throw()
+    { return "__gnu_cxx::concurrence_unlock_error"; }
+  };
+
+  // Substitute for concurrence_error object in the case of -fno-exceptions.
+  inline void
+  __throw_concurrence_lock_error()
+  {
+#if __EXCEPTIONS
+    throw concurrence_lock_error();
+#else
+    std::abort();
+#endif
+  }
+
+  inline void
+  __throw_concurrence_unlock_error()
+  {
+#if __EXCEPTIONS
+    throw concurrence_unlock_error();
+#else
+    std::abort();
+#endif
+  }
 
   class __mutex 
   {
@@ -93,7 +134,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       if (__gthread_active_p())
        {
          if (__gthread_mutex_lock(&_M_mutex) != 0)
-           std::__throw_runtime_error(__N("__mutex::lock"));
+           __throw_concurrence_lock_error();
        }
 #endif
     }
@@ -104,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       if (__gthread_active_p())
        {
          if (__gthread_mutex_unlock(&_M_mutex) != 0)
-           std::__throw_runtime_error(__N("__mutex::unlock"));
+           __throw_concurrence_unlock_error();
        }
 #endif
     }
@@ -140,7 +181,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       if (__gthread_active_p())
        {
          if (__gthread_recursive_mutex_lock(&_M_mutex) != 0)
-           std::__throw_runtime_error(__N("__recursive_mutex::lock"));
+           __throw_concurrence_lock_error();
        }
 #endif
     }
@@ -151,7 +192,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       if (__gthread_active_p())
        {
          if (__gthread_recursive_mutex_unlock(&_M_mutex) != 0)
-           std::__throw_runtime_error(__N("__recursive_mutex::unlock"));
+           __throw_concurrence_unlock_error();
        }
 #endif
     }
index d8eff17..896ff39 100644 (file)
 
 namespace pb_ds
 {
-#if __EXCEPTIONS
-
   // Base class for exceptions.
   struct container_error : public std::logic_error
   {
     container_error() 
-    : std::logic_error(__N("policy based data structure exception")) { }
+    : std::logic_error(__N("pb_ds::container_error")) { }
   };
 
   // An entry cannot be inserted into a container object for logical
@@ -72,6 +70,7 @@ namespace pb_ds
   // A container cannot be resized.
   struct resize_error : public container_error { };
 
+#if __EXCEPTIONS
   void
   __throw_container_error(void)
   { throw container_error(); }
@@ -87,9 +86,7 @@ namespace pb_ds
   void
   __throw_resize_error(void)
   { throw resize_error(); }
-
 #else
-
   void
   __throw_container_error(void)
   { std::abort(); }
@@ -105,7 +102,6 @@ namespace pb_ds
   void
   __throw_resize_error(void)
   { std::abort(); }
-
 #endif
 } // namespace pb_ds
 
diff --git a/libstdc++-v3/testsuite/abi/cxx_runtime_only_linkage.cc b/libstdc++-v3/testsuite/abi/cxx_runtime_only_linkage.cc
new file mode 100644 (file)
index 0000000..7e6409b
--- /dev/null
@@ -0,0 +1,26 @@
+// { dg-do link }
+// { dg-options "-x c -L../libsupc++/.libs -lsupc++" }
+// Copyright (C) 2006 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 2, 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.
+
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING.  If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+// Must be able to link C++ apps compiled with gcc and libsupc++.
+
+int main()
+{
+  return 0;
+}