aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@redhat.com>2007-12-14 19:32:03 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2007-12-14 19:32:03 +0000
commitc5f416abf70d3fd56439f3544cdbb96ed1e011fe (patch)
tree6faef89b5c2099ffc5e6cedaf675a1482dbca59c /libstdc++-v3/include
parent18117c0574ff93712f6b1710c5bdd70b68695637 (diff)
downloadgcc-c5f416abf70d3fd56439f3544cdbb96ed1e011fe.zip
gcc-c5f416abf70d3fd56439f3544cdbb96ed1e011fe.tar.gz
gcc-c5f416abf70d3fd56439f3544cdbb96ed1e011fe.tar.bz2
re PR libstdc++/30127 (std::has_facet returns true for not installed derived facets)
2007-12-14 Benjamin Kosnik <bkoz@redhat.com> PR libstdc++/30127 PR libstdc++/34449 * include/bits/locale_classes.h (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. From-SVN: r130941
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r--libstdc++-v3/include/bits/locale_classes.h17
1 files changed, 14 insertions, 3 deletions
diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h
index 60de269..4eee862 100644
--- a/libstdc++-v3/include/bits/locale_classes.h
+++ b/libstdc++-v3/include/bits/locale_classes.h
@@ -579,7 +579,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{
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 && __facets[__i]);
+ bool __b(false);
+ try
+ {
+ if (__i < __loc._M_impl->_M_facets_size
+ && dynamic_cast<const _Facet*>(__facets[__i]) != NULL)
+ __b = true;
+
+ }
+ catch (...)
+ { }
+ return __b;
}
/**
@@ -601,9 +611,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{
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]))
+ if (__i >= __loc._M_impl->_M_facets_size
+ || dynamic_cast<const _Facet*>(__facets[__i]) == NULL)
__throw_bad_cast();
- return static_cast<const _Facet&>(*__facets[__i]);
+ return dynamic_cast<const _Facet&>(*__facets[__i]);
}