diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 790d7611027..e99e0500360 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2008-01-07 Paolo Carlini + + 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. + 2008-01-06 Ted Phelps PR c++/34152 diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index 0264236a9a0..691694aad22 100644 --- a/libstdc++-v3/include/bits/locale_classes.h +++ b/libstdc++-v3/include/bits/locale_classes.h @@ -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 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @return true if locale contains a facet of type Facet, else false. */ template - 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(__facets[__i]) != NULL; - } + bool + has_facet(const locale& __loc) throw(); /** * @brief Return a facet. @@ -597,15 +591,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @throw std::bad_cast if locale doesn't contain a facet of type Facet. */ template - 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(*__facets[__i]); - } + const _Facet& + use_facet(const locale& __loc); /** diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc index c1e698983cd..551fc90d3b6 100644 --- a/libstdc++-v3/include/bits/locale_classes.tcc +++ b/libstdc++-v3/include/bits/locale_classes.tcc @@ -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 - 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 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template 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 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template 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 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } + template + 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(__facets[__i])); +#else + && static_cast(__facets[__i])); +#endif + } + + template + 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(*__facets[__i]); +#else + return static_cast(*__facets[__i]); +#endif + } + + // Generic version does nothing. template int