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.
#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
/**
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
{