]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Optimize __try_use_facet for const types
authorJonathan Wakely <jwakely@redhat.com>
Wed, 22 May 2024 15:49:31 +0000 (16:49 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 23 Aug 2024 12:39:36 +0000 (13:39 +0100)
LWG 436 confirmed that const-qualified types are valid arguments for
Facet template parameters (but volatile-qualified types are not). Use the
fast path in std::use_facet and std::has_facet for const T as well as T.

libstdc++-v3/ChangeLog:

* include/bits/locale_classes.tcc (__try_use_facet): Also avoid
dynamic_cast for const-qualified facet types.

libstdc++-v3/include/bits/locale_classes.tcc

index c79574e58de87fbf76f21624f711e75b0f4c2148..d5ef1911057b85be59c1fcc15a0fb3ba02480ae6 100644 (file)
@@ -110,7 +110,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // We know these standard facets are always installed in every locale
       // so dynamic_cast always succeeds, just use static_cast instead.
 #define _GLIBCXX_STD_FACET(...) \
-      if _GLIBCXX_CONSTEXPR (__is_same(_Facet, __VA_ARGS__)) \
+      if _GLIBCXX_CONSTEXPR (__is_same(const _Facet, const __VA_ARGS__)) \
        return static_cast<const _Facet*>(__facets[__i])
 
       _GLIBCXX_STD_FACET(ctype<char>);