This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [Patch] Fix libstdc++/34680 in mainline
- From: Paolo Carlini <pcarlini at suse dot de>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Mon, 07 Jan 2008 12:12:14 +0100
- Subject: Re: [Patch] Fix libstdc++/34680 in mainline
- References: <47817B13.9080100@suse.de>
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);
/**