https://gcc.gnu.org/g:f91fe35aa14bf4d44f2c8394301858b42e12ee45
commit r15-3651-gf91fe35aa14bf4d44f2c8394301858b42e12ee45 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed May 22 16:49:31 2024 +0100 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. Diff: --- libstdc++-v3/include/bits/locale_classes.h | 6 ++++++ libstdc++-v3/include/bits/locale_classes.tcc | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index 50a748066f19..e168881b5162 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 d5ef1911057b..1b5f5f2417c8 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 {