Skip to content

[libc++] Allow the use of extensions in the implementation #79532

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 41 additions & 20 deletions libcxx/include/__config
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,10 @@ _LIBCPP_HARDENING_MODE_DEBUG
# define __has_include(...) 0
# endif

# ifndef __has_warning
# define __has_warning(...) 0
# endif

# if !defined(_LIBCPP_COMPILER_CLANG_BASED) && __cplusplus < 201103L
# error "libc++ only supports C++03 with Clang-based compilers. Please enable C++11"
# endif
Expand Down Expand Up @@ -723,6 +727,23 @@ typedef __char32_t char32_t;
# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE
# endif

# ifdef _LIBCPP_COMPILER_CLANG_BASED
# define _LIBCPP_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
# define _LIBCPP_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str) _Pragma(_LIBCPP_TOSTRING(clang diagnostic ignored str))
# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str)
# elif defined(_LIBCPP_COMPILER_GCC)
# define _LIBCPP_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
# define _LIBCPP_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str)
# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str) _Pragma(_LIBCPP_TOSTRING(GCC diagnostic ignored str))
# else
# define _LIBCPP_DIAGNOSTIC_PUSH
# define _LIBCPP_DIAGNOSTIC_POP
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str)
# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str)
# endif

# if _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST
# define _LIBCPP_HARDENING_SIG f
# elif _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_EXTENSIVE
Expand Down Expand Up @@ -810,16 +831,33 @@ typedef __char32_t char32_t;
# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
# endif

// TODO: Remove this workaround once we drop support for Clang 16
#if __has_warning("-Wc++23-extensions")
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED_CXX23_EXTENSION _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++23-extensions")
#else
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED_CXX23_EXTENSION _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++2b-extensions")
#endif

// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect.
// clang-format off
# define _LIBCPP_BEGIN_NAMESPACE_STD namespace _LIBCPP_TYPE_VISIBILITY_DEFAULT std { \
# define _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_DIAGNOSTIC_PUSH \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++11-extensions") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++14-extensions") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++17-extensions") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++20-extensions") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED_CXX23_EXTENSION \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++14-extensions") \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++17-extensions") \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++20-extensions") \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++23-extensions") \
namespace _LIBCPP_TYPE_VISIBILITY_DEFAULT std { \
inline namespace _LIBCPP_ABI_NAMESPACE {
# define _LIBCPP_END_NAMESPACE_STD }}
# define _LIBCPP_END_NAMESPACE_STD }} _LIBCPP_DIAGNOSTIC_POP

# define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM _LIBCPP_BEGIN_NAMESPACE_STD \
inline namespace __fs { namespace filesystem {

# define _LIBCPP_END_NAMESPACE_FILESYSTEM _LIBCPP_END_NAMESPACE_STD }}
# define _LIBCPP_END_NAMESPACE_FILESYSTEM }} _LIBCPP_END_NAMESPACE_STD
// clang-format on

# if __has_attribute(__enable_if__)
Expand Down Expand Up @@ -1256,23 +1294,6 @@ __sanitizer_verify_double_ended_contiguous_container(const void*, const void*, c
// the ABI inconsistent.
# endif

# ifdef _LIBCPP_COMPILER_CLANG_BASED
# define _LIBCPP_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
# define _LIBCPP_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str) _Pragma(_LIBCPP_TOSTRING(clang diagnostic ignored str))
# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str)
# elif defined(_LIBCPP_COMPILER_GCC)
# define _LIBCPP_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
# define _LIBCPP_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str)
# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str) _Pragma(_LIBCPP_TOSTRING(GCC diagnostic ignored str))
# else
# define _LIBCPP_DIAGNOSTIC_PUSH
# define _LIBCPP_DIAGNOSTIC_POP
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str)
# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str)
# endif

// c8rtomb() and mbrtoc8() were added in C++20 and C23. Support for these
// functions is gradually being added to existing C libraries. The conditions
// below check for known C library versions and conditions under which these
Expand Down
6 changes: 0 additions & 6 deletions libcxx/include/tuple
Original file line number Diff line number Diff line change
Expand Up @@ -548,10 +548,6 @@ class _LIBCPP_TEMPLATE_VIS tuple {
public:
// [tuple.cnstr]

_LIBCPP_DIAGNOSTIC_PUSH
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++20-extensions")
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++20-extensions")

// tuple() constructors (including allocator_arg_t variants)
template <template <class...> class _IsImpDefault = __is_implicitly_default_constructible,
template <class...> class _IsDefault = is_default_constructible,
Expand Down Expand Up @@ -833,8 +829,6 @@ public:
: __base_(allocator_arg_t(), __alloc, std::move(__p)) {}
# endif // _LIBCPP_STD_VER >= 23

_LIBCPP_DIAGNOSTIC_POP

// [tuple.assign]
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 tuple&
operator=(_If<_And<is_copy_assignable<_Tp>...>::value, tuple, __nat> const& __tuple)
Expand Down