+2008-01-05 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/34680
+
+ Revert:
+ 2007-12-17 Jonathan Wakely <jwakely.gcc@gmail.com>
+ * include/bits/locale_facets.tcc (has_facet, use_facet): Simplify
+ RTTI checks.
+
+ 2007-12-14 Benjamin Kosnik <bkoz@redhat.com>
+
+ PR libstdc++/30127
+ PR libstdc++/34449
+ * include/bits/locale_facets.tcc (use_facet): Check facet hierarchy.
+ (has_facet): Same.
+ * testsuite/22_locale/global_templates/user_facet_hierarchies.cc: New.
+ * testsuite/22_locale/global_templates/
+ standard_facet_hierarchies.cc: New.
+
2007-12-17 Jonathan Wakely <jwakely.gcc@gmail.com>
* include/bits/locale_facets.tcc (has_facet, use_facet): Simplify
PR libstdc++/30127
PR libstdc++/34449
- * include/bits/locale_classes.h (use_facet): Check facet hierarchy.
+ * include/bits/locale_facets.tcc (use_facet): Check facet hierarchy.
(has_facet): Same.
* testsuite/22_locale/global_templates/user_facet_hierarchies.cc: New.
* testsuite/22_locale/global_templates/
// Locale support -*- C++ -*-
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+// 2006, 2007, 2008
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
{
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;
+ return (__i < __loc._M_impl->_M_facets_size && __facets[__i]);
}
/**
{
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)
+ if (!(__i < __loc._M_impl->_M_facets_size && __facets[__i]))
__throw_bad_cast();
- return dynamic_cast<const _Facet&>(*__facets[__i]);
+ return static_cast<const _Facet&>(*__facets[__i]);
}
+++ /dev/null
-// Copyright (C) 2007 Free Software Foundation
-//
-// 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.
-
-#include <string>
-#include <locale>
-#include <cassert>
-#include <testsuite_hooks.h>
-
-// Based on Langer Kreft "Standard C++ IOStreams and Locales" p 316-318
-// PR libstdc++/30127
-// PR libstdc++/34449
-int main()
-{
- bool test __attribute__((unused)) = true;
-
- using std::locale;
- using std::has_facet;
- using std::use_facet;
- typedef std::ctype<char> base_facet;
- typedef std::ctype_byname<char> derived_facet;
-
- locale loc_c = locale::classic();
- locale loc_base = loc_c;
- locale loc_derived(loc_c, new derived_facet("C"));
-
- bool b;
-
- // Standard base facet.
- VERIFY( has_facet<base_facet>(loc_c) );
- VERIFY( has_facet<base_facet>(loc_base) );
- VERIFY( has_facet<base_facet>(loc_derived) );
-
- // Standard derived facet.
- VERIFY( !has_facet<derived_facet>(loc_c) );
- VERIFY( !has_facet<derived_facet>(loc_base) );
- VERIFY( has_facet<derived_facet>(loc_derived) );
-
-
- // 1
- try
- {
- if (has_facet<derived_facet>(loc_base))
- {
- use_facet<derived_facet>(loc_base).widen('k');
- VERIFY( true );
- }
- }
- catch (...)
- {
- // Expect no exception.
- VERIFY( true );
- }
-
- // 2
- try
- {
- if (has_facet<base_facet>(loc_derived))
- use_facet<base_facet>(loc_derived).widen('k');
- else
- VERIFY( true );
- }
- catch (...)
- {
- // Expect no exception.
- VERIFY( true );
- }
-
- return 0;
-}
+++ /dev/null
-// Copyright (C) 2007 Free Software Foundation
-//
-// 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.
-
-#include <string>
-#include <locale>
-#include <cassert>
-#include <testsuite_hooks.h>
-
-// Based on Langer Kreft "Standard C++ IOStreams and Locales" p 316-318
-struct base_facet: public std::locale::facet
-{
- virtual std::string msg() const
- { return "base class"; }
-
- static std::locale::id id;
-};
-
-std::locale::id base_facet::id;
-
-
-struct derived_facet: public base_facet
-{
- virtual std::string msg() const
- { return "derived class"; }
-
- virtual std::string msg_repeater() const
- { return "derived class derived class"; }
-
-};
-
-// PR libstdc++/30127
-// PR libstdc++/34449
-int main()
-{
- bool test __attribute__((unused)) = true;
-
- using std::locale;
- using std::has_facet;
- using std::use_facet;
-
- locale loc_c = locale::classic();
- locale loc_base(loc_c, new base_facet);
- locale loc_derived(loc_c, new derived_facet);
-
- bool b;
-
- // Standard facets.
- VERIFY( has_facet<std::ctype<char> >(loc_c) );
- VERIFY( has_facet<std::ctype<char> >(loc_base) );
- VERIFY( has_facet<std::ctype<char> >(loc_derived) );
-
- // User defined base facet.
- VERIFY( !has_facet<base_facet>(loc_c) );
- VERIFY( has_facet<base_facet>(loc_base) );
- VERIFY( has_facet<base_facet>(loc_derived) );
-
- // User defined derived facet.
- VERIFY( !has_facet<derived_facet>(loc_c) );
- VERIFY( !has_facet<derived_facet>(loc_base) );
- VERIFY( has_facet<derived_facet>(loc_derived) );
-
-
- // 1
- try
- {
- if (has_facet<derived_facet>(loc_base))
- {
- use_facet<derived_facet>(loc_base).msg_repeater();
- VERIFY( false );
- }
- }
- catch (...)
- {
- // Expect no exception.
- VERIFY( true );
- }
-
- // 2
- try
- {
- if (has_facet<base_facet>(loc_derived))
- use_facet<base_facet>(loc_derived).msg();
- else
- VERIFY( true );
- }
- catch (...)
- {
- // Expect no exception.
- VERIFY( true );
- }
-
- return 0;
-}