diff --git a/libcxx/include/__config b/libcxx/include/__config index 91bc6fc21df8ec..108f700823cbfb 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -162,16 +162,6 @@ _LIBCPP_HARDENING_MODE_DEBUG # define _LIBCPP_CXX03_LANG # endif -// TODO: Remove once we switch to GCC 14 -# ifndef __has_extension -# define __has_extension(__x) 0 -# endif - -// TODO: Remove once we switch to GCC 14 -# ifndef __has_feature -# define __has_feature(__x) 0 -# endif - # ifndef __has_constexpr_builtin # define __has_constexpr_builtin(x) 0 # endif @@ -348,44 +338,30 @@ typedef __char32_t char32_t; # define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp) -# if defined(_LIBCPP_COMPILER_CLANG_BASED) - // Objective-C++ features (opt-in) -# if __has_feature(objc_arc) -# define _LIBCPP_HAS_OBJC_ARC -# endif - -# if __has_feature(objc_arc_weak) -# define _LIBCPP_HAS_OBJC_ARC_WEAK -# endif - -# if __has_extension(blocks) -# define _LIBCPP_HAS_EXTENSION_BLOCKS -# endif - -# if defined(_LIBCPP_HAS_EXTENSION_BLOCKS) && defined(__APPLE__) -# define _LIBCPP_HAS_BLOCKS_RUNTIME -# endif - -# if !__has_feature(address_sanitizer) -# define _LIBCPP_HAS_NO_ASAN -# endif - -# define _LIBCPP_ALWAYS_INLINE __attribute__((__always_inline__)) +# if __has_feature(objc_arc) +# define _LIBCPP_HAS_OBJC_ARC +# endif -# define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ +# if __has_feature(objc_arc_weak) +# define _LIBCPP_HAS_OBJC_ARC_WEAK +# endif -# elif defined(_LIBCPP_COMPILER_GCC) +# if __has_extension(blocks) +# define _LIBCPP_HAS_EXTENSION_BLOCKS +# endif -# if !defined(__SANITIZE_ADDRESS__) -# define _LIBCPP_HAS_NO_ASAN -# endif +# if defined(_LIBCPP_HAS_EXTENSION_BLOCKS) && defined(__APPLE__) +# define _LIBCPP_HAS_BLOCKS_RUNTIME +# endif -# define _LIBCPP_ALWAYS_INLINE __attribute__((__always_inline__)) +# if !__has_feature(address_sanitizer) +# define _LIBCPP_HAS_NO_ASAN +# endif -# define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ +# define _LIBCPP_ALWAYS_INLINE __attribute__((__always_inline__)) -# endif // _LIBCPP_COMPILER_[CLANG|GCC] +# define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ # if defined(_LIBCPP_OBJECT_FORMAT_COFF) diff --git a/libcxx/include/__tuple/tuple_element.h b/libcxx/include/__tuple/tuple_element.h index 55b3b47619f648..9127c47dc8f1a5 100644 --- a/libcxx/include/__tuple/tuple_element.h +++ b/libcxx/include/__tuple/tuple_element.h @@ -40,32 +40,6 @@ struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const volatile _Tp> { #ifndef _LIBCPP_CXX03_LANG -# if !__has_builtin(__type_pack_element) - -namespace __indexer_detail { - -template -struct __indexed { - using type _LIBCPP_NODEBUG = _Tp; -}; - -template -struct __indexer; - -template -struct __indexer<__tuple_types<_Types...>, __tuple_indices<_Idx...>> : __indexed<_Idx, _Types>... {}; - -template -__indexed<_Idx, _Tp> __at_index(__indexed<_Idx, _Tp> const&); - -} // namespace __indexer_detail - -template -using __type_pack_element _LIBCPP_NODEBUG = typename decltype(__indexer_detail::__at_index<_Idx>( - __indexer_detail::__indexer< __tuple_types<_Types...>, - typename __make_tuple_indices::type >{}))::type; -# endif - template struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, __tuple_types<_Types...> > { static_assert(_Ip < sizeof...(_Types), "tuple_element index out of range"); diff --git a/libcxx/include/__type_traits/is_function.h b/libcxx/include/__type_traits/is_function.h index f09f19adf4aab4..98fedd0ad96d9b 100644 --- a/libcxx/include/__type_traits/is_function.h +++ b/libcxx/include/__type_traits/is_function.h @@ -11,8 +11,6 @@ #include <__config> #include <__type_traits/integral_constant.h> -#include <__type_traits/is_const.h> -#include <__type_traits/is_reference.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -20,22 +18,12 @@ _LIBCPP_BEGIN_NAMESPACE_STD -#if __has_builtin(__is_function) - template struct _LIBCPP_TEMPLATE_VIS is_function : integral_constant {}; -#else - -template -struct _LIBCPP_TEMPLATE_VIS is_function - : public integral_constant::value || is_const::value)> {}; - -#endif // __has_builtin(__is_function) - #if _LIBCPP_STD_VER >= 17 template -inline constexpr bool is_function_v = is_function<_Tp>::value; +inline constexpr bool is_function_v = __is_function(_Tp); #endif _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__type_traits/is_member_function_pointer.h b/libcxx/include/__type_traits/is_member_function_pointer.h index 11c8a00c997567..037d5ca04ab0b2 100644 --- a/libcxx/include/__type_traits/is_member_function_pointer.h +++ b/libcxx/include/__type_traits/is_member_function_pointer.h @@ -11,9 +11,6 @@ #include <__config> #include <__type_traits/integral_constant.h> -#include <__type_traits/is_function.h> -#include <__type_traits/remove_cv.h> -#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -21,21 +18,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD -template -struct __libcpp_is_member_pointer { - enum { __is_member = false, __is_func = false, __is_obj = false }; -}; -template -struct __libcpp_is_member_pointer<_Tp _Up::*> { - enum { - __is_member = true, - __is_func = is_function<_Tp>::value, - __is_obj = !__is_func, - }; -}; - -#if __has_builtin(__is_member_function_pointer) - template struct _LIBCPP_TEMPLATE_VIS is_member_function_pointer : _BoolConstant<__is_member_function_pointer(_Tp)> {}; @@ -44,19 +26,6 @@ template inline constexpr bool is_member_function_pointer_v = __is_member_function_pointer(_Tp); # endif -#else // __has_builtin(__is_member_function_pointer) - -template -struct _LIBCPP_TEMPLATE_VIS is_member_function_pointer - : public _BoolConstant<__libcpp_is_member_pointer<__remove_cv_t<_Tp> >::__is_func> {}; - -# if _LIBCPP_STD_VER >= 17 -template -inline constexpr bool is_member_function_pointer_v = is_member_function_pointer<_Tp>::value; -# endif - -#endif // __has_builtin(__is_member_function_pointer) - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___TYPE_TRAITS_IS_MEMBER_FUNCTION_POINTER_H diff --git a/libcxx/include/__type_traits/is_member_object_pointer.h b/libcxx/include/__type_traits/is_member_object_pointer.h index 9141f9da530f25..555794bfe03876 100644 --- a/libcxx/include/__type_traits/is_member_object_pointer.h +++ b/libcxx/include/__type_traits/is_member_object_pointer.h @@ -18,8 +18,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD -#if __has_builtin(__is_member_object_pointer) - template struct _LIBCPP_TEMPLATE_VIS is_member_object_pointer : _BoolConstant<__is_member_object_pointer(_Tp)> {}; @@ -28,19 +26,6 @@ template inline constexpr bool is_member_object_pointer_v = __is_member_object_pointer(_Tp); # endif -#else // __has_builtin(__is_member_object_pointer) - -template -struct _LIBCPP_TEMPLATE_VIS is_member_object_pointer - : public _BoolConstant<__libcpp_is_member_pointer<__remove_cv_t<_Tp> >::__is_obj> {}; - -# if _LIBCPP_STD_VER >= 17 -template -inline constexpr bool is_member_object_pointer_v = is_member_object_pointer<_Tp>::value; -# endif - -#endif // __has_builtin(__is_member_object_pointer) - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___TYPE_TRAITS_IS_MEMBER_FUNCTION_POINTER_H diff --git a/libcxx/include/__type_traits/is_member_pointer.h b/libcxx/include/__type_traits/is_member_pointer.h index 4ca01d1c2fc89d..149634fde75846 100644 --- a/libcxx/include/__type_traits/is_member_pointer.h +++ b/libcxx/include/__type_traits/is_member_pointer.h @@ -11,7 +11,6 @@ #include <__config> #include <__type_traits/integral_constant.h> -#include <__type_traits/is_member_function_pointer.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -19,8 +18,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD -#if __has_builtin(__is_member_pointer) - template struct _LIBCPP_TEMPLATE_VIS is_member_pointer : _BoolConstant<__is_member_pointer(_Tp)> {}; @@ -29,19 +26,6 @@ template inline constexpr bool is_member_pointer_v = __is_member_pointer(_Tp); # endif -#else // __has_builtin(__is_member_pointer) - -template -struct _LIBCPP_TEMPLATE_VIS is_member_pointer - : public _BoolConstant<__libcpp_is_member_pointer<__remove_cv_t<_Tp> >::__is_member> {}; - -# if _LIBCPP_STD_VER >= 17 -template -inline constexpr bool is_member_pointer_v = is_member_pointer<_Tp>::value; -# endif - -#endif // __has_builtin(__is_member_pointer) - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___TYPE_TRAITS_IS_MEMBER_POINTER_H diff --git a/libcxx/include/__type_traits/is_nothrow_constructible.h b/libcxx/include/__type_traits/is_nothrow_constructible.h index 2f7ed8487e76bb..58d2b2475140b6 100644 --- a/libcxx/include/__type_traits/is_nothrow_constructible.h +++ b/libcxx/include/__type_traits/is_nothrow_constructible.h @@ -13,10 +13,6 @@ #include <__type_traits/add_lvalue_reference.h> #include <__type_traits/add_rvalue_reference.h> #include <__type_traits/integral_constant.h> -#include <__type_traits/is_constructible.h> -#include <__type_traits/is_reference.h> -#include <__utility/declval.h> -#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -24,85 +20,28 @@ _LIBCPP_BEGIN_NAMESPACE_STD -// GCC is disabled due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106611 -#if __has_builtin(__is_nothrow_constructible) && !defined(_LIBCPP_COMPILER_GCC) - template < class _Tp, class... _Args> struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible : public integral_constant {}; -#else - -template -struct __libcpp_is_nothrow_constructible; - -template -struct __libcpp_is_nothrow_constructible - : public integral_constant()...))> {}; - -template -void __implicit_conversion_to(_Tp) noexcept {} - -template -struct __libcpp_is_nothrow_constructible - : public integral_constant(std::declval<_Arg>()))> {}; - -template -struct __libcpp_is_nothrow_constructible : public false_type { -}; - -template -struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible - : __libcpp_is_nothrow_constructible::value, - is_reference<_Tp>::value, - _Tp, - _Args...> {}; - -template -struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp[_Ns]> - : __libcpp_is_nothrow_constructible::value, is_reference<_Tp>::value, _Tp> {}; - -#endif // __has_builtin(__is_nothrow_constructible) #if _LIBCPP_STD_VER >= 17 template inline constexpr bool is_nothrow_constructible_v = is_nothrow_constructible<_Tp, _Args...>::value; #endif -// TODO: remove this implementation once https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106611 is fixed -#ifdef _LIBCPP_COMPILER_GCC - -template -struct _LIBCPP_TEMPLATE_VIS is_nothrow_copy_constructible - : public is_nothrow_constructible<_Tp, __add_lvalue_reference_t > {}; - -#else // _LIBCPP_COMPILER_GCC - template struct _LIBCPP_TEMPLATE_VIS is_nothrow_copy_constructible : public integral_constant< bool, __is_nothrow_constructible(_Tp, __add_lvalue_reference_t)> {}; -#endif // _LIBCPP_COMPILER_GCC - #if _LIBCPP_STD_VER >= 17 template inline constexpr bool is_nothrow_copy_constructible_v = is_nothrow_copy_constructible<_Tp>::value; #endif -// TODO: remove this implementation once https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106611 is fixed -#ifndef _LIBCPP_COMPILER_GCC - template struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_constructible : public integral_constant)> {}; -#else // _LIBCPP_COMPILER_GCC - -template -struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_constructible - : public is_nothrow_constructible<_Tp, __add_rvalue_reference_t<_Tp> > {}; - -#endif // _LIBCPP_COMPILER_GCC - #if _LIBCPP_STD_VER >= 17 template inline constexpr bool is_nothrow_move_constructible_v = is_nothrow_move_constructible<_Tp>::value; diff --git a/libcxx/include/__type_traits/is_object.h b/libcxx/include/__type_traits/is_object.h index 5ac1d854a69587..ec04508402ce51 100644 --- a/libcxx/include/__type_traits/is_object.h +++ b/libcxx/include/__type_traits/is_object.h @@ -11,10 +11,6 @@ #include <__config> #include <__type_traits/integral_constant.h> -#include <__type_traits/is_array.h> -#include <__type_traits/is_class.h> -#include <__type_traits/is_scalar.h> -#include <__type_traits/is_union.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -22,30 +18,13 @@ _LIBCPP_BEGIN_NAMESPACE_STD -#if __has_builtin(__is_object) - template struct _LIBCPP_TEMPLATE_VIS is_object : _BoolConstant<__is_object(_Tp)> {}; -# if _LIBCPP_STD_VER >= 17 +#if _LIBCPP_STD_VER >= 17 template inline constexpr bool is_object_v = __is_object(_Tp); -# endif - -#else // __has_builtin(__is_object) - -template -struct _LIBCPP_TEMPLATE_VIS is_object - : public integral_constant::value || is_array<_Tp>::value || is_union<_Tp>::value || - is_class<_Tp>::value > {}; - -# if _LIBCPP_STD_VER >= 17 -template -inline constexpr bool is_object_v = is_object<_Tp>::value; -# endif - -#endif // __has_builtin(__is_object) +#endif _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__type_traits/is_reference.h b/libcxx/include/__type_traits/is_reference.h index 42853d47903958..cc157a438e4913 100644 --- a/libcxx/include/__type_traits/is_reference.h +++ b/libcxx/include/__type_traits/is_reference.h @@ -18,27 +18,30 @@ _LIBCPP_BEGIN_NAMESPACE_STD -#if __has_builtin(__is_lvalue_reference) && __has_builtin(__is_rvalue_reference) && __has_builtin(__is_reference) +template +struct _LIBCPP_TEMPLATE_VIS is_reference : _BoolConstant<__is_reference(_Tp)> {}; +#if _LIBCPP_STD_VER >= 17 template -struct _LIBCPP_TEMPLATE_VIS is_lvalue_reference : _BoolConstant<__is_lvalue_reference(_Tp)> {}; +inline constexpr bool is_reference_v = __is_reference(_Tp); +#endif + +#if __has_builtin(__is_lvalue_reference) && __has_builtin(__is_rvalue_reference) template -struct _LIBCPP_TEMPLATE_VIS is_rvalue_reference : _BoolConstant<__is_rvalue_reference(_Tp)> {}; +struct _LIBCPP_TEMPLATE_VIS is_lvalue_reference : _BoolConstant<__is_lvalue_reference(_Tp)> {}; template -struct _LIBCPP_TEMPLATE_VIS is_reference : _BoolConstant<__is_reference(_Tp)> {}; +struct _LIBCPP_TEMPLATE_VIS is_rvalue_reference : _BoolConstant<__is_rvalue_reference(_Tp)> {}; # if _LIBCPP_STD_VER >= 17 template -inline constexpr bool is_reference_v = __is_reference(_Tp); -template inline constexpr bool is_lvalue_reference_v = __is_lvalue_reference(_Tp); template inline constexpr bool is_rvalue_reference_v = __is_rvalue_reference(_Tp); # endif -#else // __has_builtin(__is_lvalue_reference) && etc... +#else // __has_builtin(__is_lvalue_reference) template struct _LIBCPP_TEMPLATE_VIS is_lvalue_reference : public false_type {}; @@ -50,17 +53,7 @@ struct _LIBCPP_TEMPLATE_VIS is_rvalue_reference : public false_type {}; template struct _LIBCPP_TEMPLATE_VIS is_rvalue_reference<_Tp&&> : public true_type {}; -template -struct _LIBCPP_TEMPLATE_VIS is_reference : public false_type {}; -template -struct _LIBCPP_TEMPLATE_VIS is_reference<_Tp&> : public true_type {}; -template -struct _LIBCPP_TEMPLATE_VIS is_reference<_Tp&&> : public true_type {}; - # if _LIBCPP_STD_VER >= 17 -template -inline constexpr bool is_reference_v = is_reference<_Tp>::value; - template inline constexpr bool is_lvalue_reference_v = is_lvalue_reference<_Tp>::value; @@ -68,7 +61,7 @@ template inline constexpr bool is_rvalue_reference_v = is_rvalue_reference<_Tp>::value; # endif -#endif // __has_builtin(__is_lvalue_reference) && etc... +#endif // __has_builtin(__is_lvalue_reference) _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__type_traits/is_scoped_enum.h b/libcxx/include/__type_traits/is_scoped_enum.h index 1db88e13356e83..cb3e25cf573317 100644 --- a/libcxx/include/__type_traits/is_scoped_enum.h +++ b/libcxx/include/__type_traits/is_scoped_enum.h @@ -11,9 +11,6 @@ #include <__config> #include <__type_traits/integral_constant.h> -#include <__type_traits/is_convertible.h> -#include <__type_traits/is_enum.h> -#include <__type_traits/underlying_type.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -23,31 +20,12 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 23 -// TODO: GCC and Clang both have this builtin. Remove the false case once we've updated to GCC 14. -# if __has_builtin(__is_scoped_enum) - template struct _LIBCPP_TEMPLATE_VIS is_scoped_enum : bool_constant<__is_scoped_enum(_Tp)> {}; template inline constexpr bool is_scoped_enum_v = __is_scoped_enum(_Tp); -# else - -template > -struct __is_scoped_enum_helper : false_type {}; - -template -struct __is_scoped_enum_helper<_Tp, true> : public bool_constant > > {}; - -template -struct _LIBCPP_TEMPLATE_VIS is_scoped_enum : public __is_scoped_enum_helper<_Tp> {}; - -template -inline constexpr bool is_scoped_enum_v = is_scoped_enum<_Tp>::value; - -# endif // __has_builtin(__is_scoped_enum) - #endif // _LIBCPP_STD_VER >= 23 _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/test/libcxx/transitive_includes/cxx03.csv b/libcxx/test/libcxx/transitive_includes/cxx03.csv index c720a0c9a05ec7..65c805cd86b76d 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx03.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx03.csv @@ -855,7 +855,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map diff --git a/libcxx/test/libcxx/transitive_includes/cxx11.csv b/libcxx/test/libcxx/transitive_includes/cxx11.csv index b00436a1be7f7c..bf353b2dd4ce47 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx11.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx11.csv @@ -862,7 +862,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map diff --git a/libcxx/test/libcxx/transitive_includes/cxx14.csv b/libcxx/test/libcxx/transitive_includes/cxx14.csv index 4b8c12929de0d6..fa6e44873fc126 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx14.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx14.csv @@ -865,7 +865,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map diff --git a/libcxx/test/libcxx/transitive_includes/cxx17.csv b/libcxx/test/libcxx/transitive_includes/cxx17.csv index a51a7e2de1d380..e03f74f50b9144 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx17.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx17.csv @@ -866,7 +866,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map diff --git a/libcxx/test/libcxx/transitive_includes/cxx20.csv b/libcxx/test/libcxx/transitive_includes/cxx20.csv index 5280d75cbf2e1f..37cd4e58e7fcad 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx20.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx20.csv @@ -873,7 +873,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map diff --git a/libcxx/test/libcxx/transitive_includes/cxx23.csv b/libcxx/test/libcxx/transitive_includes/cxx23.csv index 4cad0fdf31bded..098752e8699f79 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx23.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx23.csv @@ -599,7 +599,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map diff --git a/libcxx/test/libcxx/transitive_includes/cxx26.csv b/libcxx/test/libcxx/transitive_includes/cxx26.csv index 4cad0fdf31bded..098752e8699f79 100644 --- a/libcxx/test/libcxx/transitive_includes/cxx26.csv +++ b/libcxx/test/libcxx/transitive_includes/cxx26.csv @@ -599,7 +599,6 @@ string_view version strstream istream strstream ostream strstream version -syncstream cstddef syncstream ios syncstream iosfwd syncstream map