aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2008-01-07 11:11:02 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2008-01-07 11:11:02 +0000
commit32f1271c4ff1694371eb7ec587326265326f2063 (patch)
treed51d5b5b9ac9dc0f8256620be54ecd2a3bc7e695
parentbd5db9de0dac29118308421acb4f1db79bea6609 (diff)
downloadgcc-32f1271c4ff1694371eb7ec587326265326f2063.zip
gcc-32f1271c4ff1694371eb7ec587326265326f2063.tar.gz
gcc-32f1271c4ff1694371eb7ec587326265326f2063.tar.bz2
re PR libstdc++/34680 (Unconditional use of dynamic_cast in locale_facets.tcc breaks compilation with -fno-rtti)
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. From-SVN: r131372
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/bits/locale_classes.h23
-rw-r--r--libstdc++-v3/include/bits/locale_classes.tcc43
3 files changed, 51 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 790d761..e99e050 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+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.
+
2008-01-06 Ted Phelps <phelps@gnusto.com>
PR c++/34152
diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h
index 0264236..691694a 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<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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @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);
/**
diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc
index c1e6989..551fc90 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<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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
+ 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