diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2007-12-14 19:32:03 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2007-12-14 19:32:03 +0000 |
commit | c5f416abf70d3fd56439f3544cdbb96ed1e011fe (patch) | |
tree | 6faef89b5c2099ffc5e6cedaf675a1482dbca59c /libstdc++-v3/include | |
parent | 18117c0574ff93712f6b1710c5bdd70b68695637 (diff) | |
download | gcc-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.h | 17 |
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]); } |