This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch] Fix libstdc++/34680 in mainline


Hi again,

as committed, tested x86_64-linux.

Paolo.

//////////////////
2008-01-07  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/34680
	* include/bits/locale_classes.h (has_facet<>, use_facet<>): Do not
	use dynamic_cast when run-time type identification is disabled; do
	not mark inline; only declare, define...
	* include/bits/locale_classes.tcc: ... here.
Index: include/bits/locale_classes.tcc
===================================================================
--- include/bits/locale_classes.tcc	(revision 131370)
+++ include/bits/locale_classes.tcc	(working copy)
@@ -1,6 +1,6 @@
 // Locale support -*- C++ -*-
 
-// Copyright (C) 2007 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008 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
@@ -44,7 +44,8 @@
 _GLIBCXX_BEGIN_NAMESPACE(std)
 
   template<typename _Facet>
-    locale::locale(const locale& __other, _Facet* __f)
+    locale::
+    locale(const locale& __other, _Facet* __f)
     {
       _M_impl = new _Impl(*__other._M_impl, 1);
 
@@ -61,7 +62,8 @@
 
   template<typename _Facet>
     locale
-    locale::combine(const locale& __other) const
+    locale::
+    combine(const locale& __other) const
     {
       _Impl* __tmp = new _Impl(*_M_impl, 1);
       try
@@ -78,8 +80,9 @@
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     bool
-    locale::operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1,
-                       const basic_string<_CharT, _Traits, _Alloc>& __s2) const
+    locale::
+    operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1,
+	       const basic_string<_CharT, _Traits, _Alloc>& __s2) const
     {
       typedef std::collate<_CharT> __collate_type;
       const __collate_type& __collate = use_facet<__collate_type>(*this);
@@ -88,6 +91,36 @@
     }
 
 
+  template<typename _Facet>
+    bool
+    has_facet(const locale& __loc) throw()
+    {
+      const size_t __i = _Facet::id._M_id();
+      const locale::facet** __facets = __loc._M_impl->_M_facets;
+      return (__i < __loc._M_impl->_M_facets_size
+#ifdef __GXX_RTTI
+	      && dynamic_cast<const _Facet*>(__facets[__i]));
+#else
+              && static_cast<const _Facet*>(__facets[__i]));
+#endif
+    }
+
+  template<typename _Facet>
+    const _Facet&
+    use_facet(const locale& __loc)
+    {
+      const size_t __i = _Facet::id._M_id();
+      const locale::facet** __facets = __loc._M_impl->_M_facets;
+      if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i])
+        __throw_bad_cast();
+#ifdef __GXX_RTTI
+      return dynamic_cast<const _Facet&>(*__facets[__i]);
+#else
+      return static_cast<const _Facet&>(*__facets[__i]);
+#endif
+    }
+
+
   // Generic version does nothing.
   template<typename _CharT>
     int
Index: include/bits/locale_classes.h
===================================================================
--- include/bits/locale_classes.h	(revision 131370)
+++ include/bits/locale_classes.h	(working copy)
@@ -1,7 +1,7 @@
 // Locale support -*- C++ -*-
 
 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-// 2006, 2007
+// 2006, 2007, 2008
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -574,14 +574,8 @@
    *  @return  true if locale contains a facet of type Facet, else false.
   */
   template<typename _Facet>
-    inline bool
-    has_facet(const locale& __loc) throw()
-    {
-      const size_t __i = _Facet::id._M_id();
-      const locale::facet** __facets = __loc._M_impl->_M_facets;
-      return __i < __loc._M_impl->_M_facets_size
-	      && dynamic_cast<const _Facet*>(__facets[__i]) != NULL;
-    }
+    bool
+    has_facet(const locale& __loc) throw();
 
   /**
    *  @brief  Return a facet.
@@ -597,15 +591,8 @@
    *  @throw  std::bad_cast if locale doesn't contain a facet of type Facet.
   */
   template<typename _Facet>
-    inline const _Facet&
-    use_facet(const locale& __loc)
-    {
-      const size_t __i = _Facet::id._M_id();
-      const locale::facet** __facets = __loc._M_impl->_M_facets;
-      if (__i >= __loc._M_impl->_M_facets_size || __facets[__i] == NULL)
-        __throw_bad_cast();
-      return dynamic_cast<const _Facet&>(*__facets[__i]);
-    }
+    const _Facet&
+    use_facet(const locale& __loc);
 
 
   /**

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]