aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-05-22 16:49:31 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2024-09-15 16:15:28 +0100
commitf91fe35aa14bf4d44f2c8394301858b42e12ee45 (patch)
tree661b90266f4dc3c1099bb73ae648ef4414fbd4b9
parentc5fd1a483858c0e85b40149aef88be00f94980a7 (diff)
downloadgcc-f91fe35aa14bf4d44f2c8394301858b42e12ee45.zip
gcc-f91fe35aa14bf4d44f2c8394301858b42e12ee45.tar.gz
gcc-f91fe35aa14bf4d44f2c8394301858b42e12ee45.tar.bz2
libstdc++: Add assertion for valid facet type arguments
LWG 436 confirmed that const-qualified types are valid arguments for Facet template parameters, but volatile-qualified types are not. Add an assertion to locale::combine to check for valid types. libstdc++-v3/ChangeLog: * include/bits/locale_classes.h (__is_facet): New helper. * include/bits/locale_classes.tcc (locale::combine): Check that _Facet type is valid.
-rw-r--r--libstdc++-v3/include/bits/locale_classes.h6
-rw-r--r--libstdc++-v3/include/bits/locale_classes.tcc4
2 files changed, 10 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h
index 50a7480..e168881 100644
--- a/libstdc++-v3/include/bits/locale_classes.h
+++ b/libstdc++-v3/include/bits/locale_classes.h
@@ -381,6 +381,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#endif
};
+#if __cpp_lib_type_trait_variable_templates // C++ >= 17
+ template<typename _Tp>
+ constexpr bool __is_facet = is_base_of_v<locale::facet, _Tp>;
+ template<typename _Tp>
+ constexpr bool __is_facet<volatile _Tp> = false;
+#endif
// 22.1.1.1.2 Class locale::facet
/**
diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc
index d5ef191..1b5f5f2 100644
--- a/libstdc++-v3/include/bits/locale_classes.tcc
+++ b/libstdc++-v3/include/bits/locale_classes.tcc
@@ -71,6 +71,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
locale::
combine(const locale& __other) const
{
+#if __cpp_lib_type_trait_variable_templates // C++ >= 17
+ static_assert(__is_facet<_Facet>, "Template argument must be a facet");
+#endif
+
_Impl* __tmp = new _Impl(*_M_impl, 1);
__try
{