[libcxx-commits] [libcxx] [libc++] Add a few _LIBCPP_HIDE_FROM_ABI which have been accidentally removed in #201722 (PR #236733)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Thu Oct 29 04:28:25 PDT 2026


https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/236733

None

>From 084d67d8fa816ff14a9e730ec20fef0d03263f8c Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Thu, 29 Oct 2026 12:27:49 +0100
Subject: [PATCH] [libc++] Add a few _LIBCPP_HIDE_FROM_ABI which have been
 accidentally removed in #201722

---
 libcxx/include/__chrono/exception.h           | 20 ++++++-------
 .../__condition_variable/condition_variable.h | 28 +++++++++++--------
 2 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/libcxx/include/__chrono/exception.h b/libcxx/include/__chrono/exception.h
index 39347f9ebdec98..27fbfd6b57a2bb 100644
--- a/libcxx/include/__chrono/exception.h
+++ b/libcxx/include/__chrono/exception.h
@@ -40,7 +40,7 @@ namespace chrono {
 class nonexistent_local_time : public runtime_error {
 public:
   template <class _Duration>
-  nonexistent_local_time(const local_time<_Duration>& __time, const local_info& __info)
+  _LIBCPP_HIDE_FROM_ABI nonexistent_local_time(const local_time<_Duration>& __time, const local_info& __info)
       : runtime_error{__create_message(__time, __info)} {
     // [time.zone.exception.nonexist]/2
     //   Preconditions: i.result == local_info::nonexistent is true.
@@ -49,14 +49,14 @@ class nonexistent_local_time : public runtime_error {
                             "creating an nonexistent_local_time from a local_info that is not non-existent");
   }
 
-  nonexistent_local_time(const nonexistent_local_time&)            = default;
-  nonexistent_local_time& operator=(const nonexistent_local_time&) = default;
+  _LIBCPP_HIDE_FROM_ABI nonexistent_local_time(const nonexistent_local_time&)            = default;
+  _LIBCPP_HIDE_FROM_ABI nonexistent_local_time& operator=(const nonexistent_local_time&) = default;
 
   _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI ~nonexistent_local_time() override; // exported as key function
 
 private:
   template <class _Duration>
-  string __create_message(const local_time<_Duration>& __time, const local_info& __info) {
+  _LIBCPP_HIDE_FROM_ABI string __create_message(const local_time<_Duration>& __time, const local_info& __info) {
     return std::format(
         R"({} is in a gap between
 {} {} and
@@ -72,7 +72,7 @@ class nonexistent_local_time : public runtime_error {
 };
 
 template <class _Duration>
-[[noreturn]] _LIBCPP_AVAILABILITY_TZDB void __throw_nonexistent_local_time(
+[[noreturn]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI void __throw_nonexistent_local_time(
     [[maybe_unused]] const local_time<_Duration>& __time, [[maybe_unused]] const local_info& __info) {
 #    if _LIBCPP_HAS_EXCEPTIONS
   throw nonexistent_local_time(__time, __info);
@@ -84,7 +84,7 @@ template <class _Duration>
 class ambiguous_local_time : public runtime_error {
 public:
   template <class _Duration>
-  ambiguous_local_time(const local_time<_Duration>& __time, const local_info& __info)
+  _LIBCPP_HIDE_FROM_ABI ambiguous_local_time(const local_time<_Duration>& __time, const local_info& __info)
       : runtime_error{__create_message(__time, __info)} {
     // [time.zone.exception.ambig]/2
     //   Preconditions: i.result == local_info::ambiguous is true.
@@ -93,14 +93,14 @@ class ambiguous_local_time : public runtime_error {
                             "creating an ambiguous_local_time from a local_info that is not ambiguous");
   }
 
-  ambiguous_local_time(const ambiguous_local_time&)            = default;
-  ambiguous_local_time& operator=(const ambiguous_local_time&) = default;
+  _LIBCPP_HIDE_FROM_ABI ambiguous_local_time(const ambiguous_local_time&)            = default;
+  _LIBCPP_HIDE_FROM_ABI ambiguous_local_time& operator=(const ambiguous_local_time&) = default;
 
   _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI ~ambiguous_local_time() override; // exported as key function
 
 private:
   template <class _Duration>
-  string __create_message(const local_time<_Duration>& __time, const local_info& __info) {
+  _LIBCPP_HIDE_FROM_ABI string __create_message(const local_time<_Duration>& __time, const local_info& __info) {
     return std::format(
         // There are two spaces after the full-stop; this has been verified
         // in the sources of the Standard.
@@ -116,7 +116,7 @@ class ambiguous_local_time : public runtime_error {
 };
 
 template <class _Duration>
-[[noreturn]] _LIBCPP_AVAILABILITY_TZDB void __throw_ambiguous_local_time(
+[[noreturn]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI void __throw_ambiguous_local_time(
     [[maybe_unused]] const local_time<_Duration>& __time, [[maybe_unused]] const local_info& __info) {
 #    if _LIBCPP_HAS_EXCEPTIONS
   throw ambiguous_local_time(__time, __info);
diff --git a/libcxx/include/__condition_variable/condition_variable.h b/libcxx/include/__condition_variable/condition_variable.h
index 0e1e811d987679..2e1bb1cb8b6020 100644
--- a/libcxx/include/__condition_variable/condition_variable.h
+++ b/libcxx/include/__condition_variable/condition_variable.h
@@ -49,7 +49,7 @@ _LIBCPP_DECLARE_STRONG_ENUM(cv_status){no_timeout, timeout};
 _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(cv_status)
 
 template <class _Rep, class _Period, __enable_if_t<is_floating_point<_Rep>::value, int> = 0>
-inline chrono::nanoseconds __safe_nanosecond_cast(chrono::duration<_Rep, _Period> __d) {
+inline _LIBCPP_HIDE_FROM_ABI chrono::nanoseconds __safe_nanosecond_cast(chrono::duration<_Rep, _Period> __d) {
   using namespace chrono;
   using __ratio       = ratio_divide<_Period, nano>;
   using __ns_rep      = nanoseconds::rep;
@@ -69,7 +69,7 @@ inline chrono::nanoseconds __safe_nanosecond_cast(chrono::duration<_Rep, _Period
 }
 
 template <class _Rep, class _Period, __enable_if_t<!is_floating_point<_Rep>::value, int> = 0>
-inline chrono::nanoseconds __safe_nanosecond_cast(chrono::duration<_Rep, _Period> __d) {
+inline _LIBCPP_HIDE_FROM_ABI chrono::nanoseconds __safe_nanosecond_cast(chrono::duration<_Rep, _Period> __d) {
   using namespace chrono;
   if (__d.count() == 0) {
     return nanoseconds(0);
@@ -96,7 +96,7 @@ inline chrono::nanoseconds __safe_nanosecond_cast(chrono::duration<_Rep, _Period
 }
 
 template <class _Duration>
-chrono::steady_clock::time_point __rel_to_abs(const _Duration& __rel_time) {
+_LIBCPP_HIDE_FROM_ABI chrono::steady_clock::time_point __rel_to_abs(const _Duration& __rel_time) {
   return chrono::steady_clock::now() + chrono::__ceil<chrono::steady_clock::duration>(__rel_time);
 }
 
@@ -104,7 +104,7 @@ class _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_WARN_UNUSED condition_variable {
   __libcpp_condvar_t __cv_ = _LIBCPP_CONDVAR_INITIALIZER;
 
 public:
-  _LIBCPP_CONSTEXPR condition_variable() _NOEXCEPT = default;
+  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR condition_variable() _NOEXCEPT = default;
 
 #  if _LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION
   ~condition_variable() = default;
@@ -121,13 +121,14 @@ class _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_WARN_UNUSED condition_variable {
   void wait(unique_lock<mutex>& __lk) _NOEXCEPT;
 
   template <class _Predicate>
-  void wait(unique_lock<mutex>& __lk, _Predicate __pred) {
+  _LIBCPP_HIDE_FROM_ABI void wait(unique_lock<mutex>& __lk, _Predicate __pred) {
     while (!__pred())
       wait(__lk);
   }
 
   template <class _Clock, class _Duration>
-  cv_status wait_until(unique_lock<mutex>& __lk, const chrono::time_point<_Clock, _Duration>& __t) {
+  _LIBCPP_HIDE_FROM_ABI cv_status
+  wait_until(unique_lock<mutex>& __lk, const chrono::time_point<_Clock, _Duration>& __t) {
     using namespace chrono;
     using __clock_tp_ns = time_point<_Clock, nanoseconds>;
 
@@ -142,7 +143,8 @@ class _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_WARN_UNUSED condition_variable {
   }
 
   template <class _Clock, class _Duration, class _Predicate>
-  bool wait_until(unique_lock<mutex>& __lk, const chrono::time_point<_Clock, _Duration>& __t, _Predicate __pred) {
+  _LIBCPP_HIDE_FROM_ABI bool
+  wait_until(unique_lock<mutex>& __lk, const chrono::time_point<_Clock, _Duration>& __t, _Predicate __pred) {
     while (!__pred()) {
       if (wait_until(__lk, __t) == cv_status::timeout)
         return __pred();
@@ -151,25 +153,27 @@ class _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_WARN_UNUSED condition_variable {
   }
 
   template <class _Rep, class _Period>
-  cv_status wait_for(unique_lock<mutex>& __lk, const chrono::duration<_Rep, _Period>& __d) {
+  _LIBCPP_HIDE_FROM_ABI cv_status wait_for(unique_lock<mutex>& __lk, const chrono::duration<_Rep, _Period>& __d) {
     return wait_until(__lk, std::__rel_to_abs(__d));
   }
 
   template <class _Rep, class _Period, class _Predicate>
-  bool wait_for(unique_lock<mutex>& __lk, const chrono::duration<_Rep, _Period>& __d, _Predicate __pred);
+  _LIBCPP_HIDE_FROM_ABI bool
+  wait_for(unique_lock<mutex>& __lk, const chrono::duration<_Rep, _Period>& __d, _Predicate __pred);
 
   typedef __libcpp_condvar_t* native_handle_type;
-  [[__nodiscard__]] native_handle_type native_handle() { return &__cv_; }
+  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI native_handle_type native_handle() { return &__cv_; }
 
 private:
   void
   __do_timed_wait(unique_lock<mutex>& __lk, chrono::time_point<chrono::system_clock, chrono::nanoseconds>) _NOEXCEPT;
 #  if _LIBCPP_HAS_COND_CLOCKWAIT
-  void
+  _LIBCPP_HIDE_FROM_ABI void
   __do_timed_wait(unique_lock<mutex>& __lk, chrono::time_point<chrono::steady_clock, chrono::nanoseconds>) _NOEXCEPT;
 #  endif
   template <class _Clock>
-  void __do_timed_wait(unique_lock<mutex>& __lk, chrono::time_point<_Clock, chrono::nanoseconds>) _NOEXCEPT;
+  _LIBCPP_HIDE_FROM_ABI void
+  __do_timed_wait(unique_lock<mutex>& __lk, chrono::time_point<_Clock, chrono::nanoseconds>) _NOEXCEPT;
 };
 #endif // _LIBCPP_HAS_THREADS
 



More information about the libcxx-commits mailing list