On Wed, 25 Sept 2024 at 01:50, Nathaniel Shead
<nathanielosh...@gmail.com> wrote:
>
> I found that my previous minimal change to libstdc++ was only sufficient
> to pass regtest on x86_64-pc-linux-gnu; Linaro complained about ARM and
> aarch64.  This patch removes the rest of the internal-linkage entities I
> could find exposed via libstdc++.
>
> The libgcc changes include some blocks specific to FreeBSD, Solaris <10,
> and HP-UX; I haven't been able to test these changes at this time.
> Happy to adjust or remove those hunks as needed.  Apologies if I haven't
> CC'd in the correct people.
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu and
> aarch64-unknown-linux-gnu, OK for trunk?
>
> -- >8 --
>
> In C++20, modules streaming check for exposures of TU-local entities.
> In general exposing internal linkage functions in a header is liable to
> cause ODR violations in C++, and this is now detected in a module
> context.
>
> This patch goes through and removes 'static' from many functions exposed
> through libstdc++ to prevent code like the following from failing:
>
>   export module M;
>   extern "C++" {
>     #include <bits/stdc++.h>
>   }
>
> Since gthreads is used from C as well, we need to choose whether to use
> 'inline' or 'static inline' depending on whether we're compiling for C
> or C++ (since the semantics of 'inline' are different between the
> languages).  Additionally we need to remove static global variables, so
> we migrate these to function-local statics to avoid the ODR issues.
>
> There doesn't seem to be a good workaround for weakrefs, so I've left
> them as-is and will work around it in the modules streaming code to
> consider them as not TU-local.
>
> The same issue occurs in the objective-C specific parts of gthreads, but
> I'm not familiar with the surrounding context and we don't currently
> test modules with Objective C++ anyway so I've left it as-is.
>
>         PR libstdc++/115126
>
> libgcc/ChangeLog:
>
>         * gthr-posix.h (__GTHREAD_INLINE): New macro.
>         (__gthread_active): Convert from variable to function.
>         (__gthread_trigger): Mark as __GTHREAD_INLINE instead of static.
>         (__gthread_active_p): Likewise.
>         (__gthread_create): Likewise.
>         (__gthread_join): Likewise.
>         (__gthread_detach): Likewise.
>         (__gthread_equal): Likewise.
>         (__gthread_self): Likewise.
>         (__gthread_yield): Likewise.
>         (__gthread_once): Likewise.
>         (__gthread_key_create): Likewise.
>         (__gthread_key_delete): Likewise.
>         (__gthread_getspecific): Likewise.
>         (__gthread_setspecific): Likewise.
>         (__gthread_mutex_init_function): Likewise.
>         (__gthread_mutex_destroy): Likewise.
>         (__gthread_mutex_lock): Likewise.
>         (__gthread_mutex_trylock): Likewise.
>         (__gthread_mutex_timedlock): Likewise.
>         (__gthread_mutex_unlock): Likewise.
>         (__gthread_recursive_mutex_init_function): Likewise.
>         (__gthread_recursive_mutex_lock): Likewise.
>         (__gthread_recursive_mutex_trylock): Likewise.
>         (__gthread_recursive_mutex_timedlock): Likewise.
>         (__gthread_recursive_mutex_unlock): Likewise.
>         (__gthread_recursive_mutex_destroy): Likewise.
>         (__gthread_cond_init_function): Likewise.
>         (__gthread_cond_broadcast): Likewise.
>         (__gthread_cond_signal): Likewise.
>         (__gthread_cond_wait): Likewise.
>         (__gthread_cond_timedwait): Likewise.
>         (__gthread_cond_wait_recursive): Likewise.
>         (__gthread_cond_destroy): Likewise.
>         (__gthread_rwlock_rdlock): Likewise.
>         (__gthread_rwlock_tryrdlock): Likewise.
>         (__gthread_rwlock_wrlock): Likewise.
>         (__gthread_rwlock_trywrlock): Likewise.
>         (__gthread_rwlock_unlock): Likewise.
>         * gthr-single.h (__GTHREAD_INLINE): New macro.
>         (__gthread_active_p): Mark as __GTHREAD_INLINE instead of static.
>         (__gthread_once): Likewise.
>         (__gthread_key_create): Likewise.
>         (__gthread_key_delete): Likewise.
>         (__gthread_getspecific): Likewise.
>         (__gthread_setspecific): Likewise.
>         (__gthread_mutex_destroy): Likewise.
>         (__gthread_mutex_lock): Likewise.
>         (__gthread_mutex_trylock): Likewise.
>         (__gthread_mutex_unlock): Likewise.
>         (__gthread_recursive_mutex_lock): Likewise.
>         (__gthread_recursive_mutex_trylock): Likewise.
>         (__gthread_recursive_mutex_unlock): Likewise.
>         (__gthread_recursive_mutex_destroy): Likewise.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/shared_ptr.h (std::__is_shared_ptr): Remove
>         unnecessary 'static'.
>         * include/bits/unique_ptr.h (std::__is_unique_ptr): Likewise.
>         * include/std/future (std::__craete_task_state): Likewise.

Typo in the function name here.

The libstdc++ parts are OK for trunk (and gcc-14 if that makes sense
too, maybe for Clang?). If the libgcc parts take longer to get
approved, please feel free to split the patch and push the libstdc++
parts separately.

I can't approve the libgcc parts myself, but they look OK to me. I
have one comment about them below.

>         * include/std/shared_mutex (_GLIBCXX_GTRHW): Likewise.
>         (__glibcxx_rwlock_init): Likewise.
>         (__glibcxx_rwlock_timedrdlock): Likewise.
>         (__glibcxx_rwlock_timedwrlock): Likewise.
>         (__glibcxx_rwlock_rdlock): Likewise.
>         (__glibcxx_rwlock_tryrdlock): Likewise.
>         (__glibcxx_rwlock_wrlock): Likewise.
>         (__glibcxx_rwlock_trywrlock): Likewise.
>         (__glibcxx_rwlock_unlock): Likewise.
>         (__glibcxx_rwlock_destroy): Likewise.
>         (__glibcxx_rwlock_init): Likewise.
>
> Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
> ---
>  libgcc/gthr-posix.h                    | 116 ++++++++++++++-----------
>  libgcc/gthr-single.h                   |  34 +++++---
>  libstdc++-v3/include/bits/shared_ptr.h |   4 +-
>  libstdc++-v3/include/bits/unique_ptr.h |   4 +-
>  libstdc++-v3/include/std/future        |   2 +-
>  libstdc++-v3/include/std/shared_mutex  |  26 +++---
>  6 files changed, 104 insertions(+), 82 deletions(-)
>
> diff --git a/libgcc/gthr-posix.h b/libgcc/gthr-posix.h
> index 82e8f9ffcf6..557bae7aaaa 100644
> --- a/libgcc/gthr-posix.h
> +++ b/libgcc/gthr-posix.h
> @@ -44,6 +44,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
> If not, see
>  # endif
>  #endif
>
> +#ifdef __cplusplus
> +# define __GTHREAD_INLINE inline
> +#else
> +# define __GTHREAD_INLINE static inline
> +#endif
> +
>  typedef pthread_t __gthread_t;
>  typedef pthread_key_t __gthread_key_t;
>  typedef pthread_once_t __gthread_once_t;
> @@ -182,22 +188,27 @@ __gthrw(pthread_setschedparam)
>
>  #if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__))
>
> -static volatile int __gthread_active = -1;
> +__GTHREAD_INLINE volatile int *
> +__gthread_active (void)
> +{
> +  static volatile int __gthread_active_var = -1;
> +  return &__gthread_active_var;
> +}
>
> -static void
> +__GTHREAD_INLINE void
>  __gthread_trigger (void)
>  {
> -  __gthread_active = 1;
> +  *__gthread_active () = 1;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_active_p (void)
>  {
>    static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER;
>    static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT;
>
>    /* Avoid reading __gthread_active twice on the main code path.  */
> -  int __gthread_active_latest_value = __gthread_active;
> +  int __gthread_active_latest_value = *__gthread_active ();
>
>    /* This test is not protected to avoid taking a lock on the main code
>       path so every update of __gthread_active in a threaded program must
> @@ -214,10 +225,10 @@ __gthread_active_p (void)
>         }
>
>        /* Make sure we'll never enter this block again.  */
> -      if (__gthread_active < 0)
> -       __gthread_active = 0;
> +      if (*__gthread_active () < 0)
> +       *__gthread_active () = 0;
>
> -      __gthread_active_latest_value = __gthread_active;
> +      __gthread_active_latest_value = *__gthread_active ();
>      }
>
>    return __gthread_active_latest_value != 0;
> @@ -257,7 +268,7 @@ __gthrw2(__gthrw_(__pthread_key_create),
>  # define GTHR_ACTIVE_PROXY     __gthrw_(pthread_cancel)
>  #endif
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_active_p (void)
>  {
>    static void *const __gthread_active_ptr
> @@ -288,20 +299,25 @@ __gthread_active_p (void)
>
>  #if defined(__hppa__) && defined(__hpux__)
>
> -static volatile int __gthread_active = -1;
> +__GTHREAD_INLINE volatile int *
> +__gthread_active (void)
> +{
> +  static volatile int __gthread_active_var = -1;
> +  return &__gthread_active_var;
> +}
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_active_p (void)
>  {
>    /* Avoid reading __gthread_active twice on the main code path.  */
> -  int __gthread_active_latest_value = __gthread_active;
> +  int __gthread_active_latest_value = *__gthread_active ();
>    size_t __s;
>
>    if (__builtin_expect (__gthread_active_latest_value < 0, 0))
>      {
>        pthread_default_stacksize_np (0, &__s);
> -      __gthread_active = __s ? 1 : 0;
> -      __gthread_active_latest_value = __gthread_active;
> +      *__gthread_active () = __s ? 1 : 0;
> +      __gthread_active_latest_value = *__gthread_active ();
>      }
>
>    return __gthread_active_latest_value != 0;
> @@ -309,7 +325,7 @@ __gthread_active_p (void)
>
>  #else /* not hppa-hpux */
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_active_p (void)
>  {
>    return 1;
> @@ -669,44 +685,44 @@ __gthread_objc_condition_signal (objc_condition_t 
> condition)
>
>  #else /* _LIBOBJC */
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_create (__gthread_t *__threadid, void *(*__func) (void*),
>                   void *__args)
>  {
>    return __gthrw_(pthread_create) (__threadid, NULL, __func, __args);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_join (__gthread_t __threadid, void **__value_ptr)
>  {
>    return __gthrw_(pthread_join) (__threadid, __value_ptr);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_detach (__gthread_t __threadid)
>  {
>    return __gthrw_(pthread_detach) (__threadid);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_equal (__gthread_t __t1, __gthread_t __t2)
>  {
>    return __gthrw_(pthread_equal) (__t1, __t2);
>  }
>
> -static inline __gthread_t
> +__GTHREAD_INLINE __gthread_t
>  __gthread_self (void)
>  {
>    return __gthrw_(pthread_self) ();
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_yield (void)
>  {
>    return __gthrw_(sched_yield) ();
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_once (__gthread_once_t *__once, void (*__func) (void))
>  {
>    if (__gthread_active_p ())
> @@ -715,38 +731,38 @@ __gthread_once (__gthread_once_t *__once, void 
> (*__func) (void))
>      return -1;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
>  {
>    return __gthrw_(pthread_key_create) (__key, __dtor);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_key_delete (__gthread_key_t __key)
>  {
>    return __gthrw_(pthread_key_delete) (__key);
>  }
>
> -static inline void *
> +__GTHREAD_INLINE void *
>  __gthread_getspecific (__gthread_key_t __key)
>  {
>    return __gthrw_(pthread_getspecific) (__key);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_setspecific (__gthread_key_t __key, const void *__ptr)
>  {
>    return __gthrw_(pthread_setspecific) (__key, __ptr);
>  }
>
> -static inline void
> +__GTHREAD_INLINE void
>  __gthread_mutex_init_function (__gthread_mutex_t *__mutex)
>  {
>    if (__gthread_active_p ())
>      __gthrw_(pthread_mutex_init) (__mutex, NULL);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_destroy (__gthread_mutex_t *__mutex)
>  {
>    if (__gthread_active_p ())
> @@ -755,7 +771,7 @@ __gthread_mutex_destroy (__gthread_mutex_t *__mutex)
>      return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_lock (__gthread_mutex_t *__mutex)
>  {
>    if (__gthread_active_p ())
> @@ -764,7 +780,7 @@ __gthread_mutex_lock (__gthread_mutex_t *__mutex)
>      return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_trylock (__gthread_mutex_t *__mutex)
>  {
>    if (__gthread_active_p ())
> @@ -774,7 +790,7 @@ __gthread_mutex_trylock (__gthread_mutex_t *__mutex)
>  }
>
>  #if _GTHREAD_USE_MUTEX_TIMEDLOCK
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_timedlock (__gthread_mutex_t *__mutex,
>                            const __gthread_time_t *__abs_timeout)
>  {
> @@ -785,7 +801,7 @@ __gthread_mutex_timedlock (__gthread_mutex_t *__mutex,
>  }
>  #endif
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_unlock (__gthread_mutex_t *__mutex)
>  {
>    if (__gthread_active_p ())
> @@ -796,7 +812,7 @@ __gthread_mutex_unlock (__gthread_mutex_t *__mutex)
>
>  #if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \
>    || defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC)
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t 
> *__mutex)
>  {
>    if (__gthread_active_p ())
> @@ -818,20 +834,20 @@ __gthread_recursive_mutex_init_function 
> (__gthread_recursive_mutex_t *__mutex)
>  }
>  #endif
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_lock (__mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_trylock (__mutex);
>  }
>
>  #if _GTHREAD_USE_MUTEX_TIMEDLOCK
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex,
>                                      const __gthread_time_t *__abs_timeout)
>  {
> @@ -839,20 +855,20 @@ __gthread_recursive_mutex_timedlock 
> (__gthread_recursive_mutex_t *__mutex,
>  }
>  #endif
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_unlock (__mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_destroy (__mutex);
>  }
>
>  #ifdef _GTHREAD_USE_COND_INIT_FUNC
> -static inline void
> +__GTHREAD_INLINE void
>  __gthread_cond_init_function (__gthread_cond_t *__cond)
>  {
>    if (__gthread_active_p ())
> @@ -860,46 +876,46 @@ __gthread_cond_init_function (__gthread_cond_t *__cond)
>  }
>  #endif
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_cond_broadcast (__gthread_cond_t *__cond)
>  {
>    return __gthrw_(pthread_cond_broadcast) (__cond);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_cond_signal (__gthread_cond_t *__cond)
>  {
>    return __gthrw_(pthread_cond_signal) (__cond);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
>  {
>    return __gthrw_(pthread_cond_wait) (__cond, __mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t 
> *__mutex,
>                           const __gthread_time_t *__abs_timeout)
>  {
>    return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_cond_wait_recursive (__gthread_cond_t *__cond,
>                                __gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_cond_wait (__cond, __mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_cond_destroy (__gthread_cond_t* __cond)
>  {
>    return __gthrw_(pthread_cond_destroy) (__cond);
>  }
>
>  #ifndef __cplusplus
> -static inline int
> +__GTHREAD_INLINE int

This is a ! __cplusplus group, so these could stay as static inline.

However, I don't understand why r14-6425-gb806c88fab3f9c added those
for !__cplusplus instead of just adding them unconditionally and
removing the equivalent code in <shared_mutex>. We should fix that,
and then I suppose the functions in gthr-posix.h would want to use
__GTHREAD_INLINE here. So for consistency and futureproofing, I think
it makes sense to change them here.

>  __gthread_rwlock_rdlock (__gthread_rwlock_t *__rwlock)
>  {
>    if (__gthread_active_p ())
> @@ -908,7 +924,7 @@ __gthread_rwlock_rdlock (__gthread_rwlock_t *__rwlock)
>      return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_rwlock_tryrdlock (__gthread_rwlock_t *__rwlock)
>  {
>    if (__gthread_active_p ())
> @@ -917,7 +933,7 @@ __gthread_rwlock_tryrdlock (__gthread_rwlock_t *__rwlock)
>      return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_rwlock_wrlock (__gthread_rwlock_t *__rwlock)
>  {
>    if (__gthread_active_p ())
> @@ -926,7 +942,7 @@ __gthread_rwlock_wrlock (__gthread_rwlock_t *__rwlock)
>      return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_rwlock_trywrlock (__gthread_rwlock_t *__rwlock)
>  {
>    if (__gthread_active_p ())
> @@ -935,7 +951,7 @@ __gthread_rwlock_trywrlock (__gthread_rwlock_t *__rwlock)
>      return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_rwlock_unlock (__gthread_rwlock_t *__rwlock)
>  {
>    if (__gthread_active_p ())
> diff --git a/libgcc/gthr-single.h b/libgcc/gthr-single.h
> index 8ee6b170840..0473daaf89d 100644
> --- a/libgcc/gthr-single.h
> +++ b/libgcc/gthr-single.h
> @@ -38,6 +38,12 @@ typedef int __gthread_recursive_mutex_t;
>  #define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0)
>  #define __GTHREAD_RECURSIVE_MUTEX_INIT 0
>
> +#ifdef __cplusplus
> +# define __GTHREAD_INLINE inline
> +#else
> +# define __GTHREAD_INLINE static inline
> +#endif
> +
>  #define UNUSED __attribute__((__unused__))
>
>  #ifdef _LIBOBJC
> @@ -207,85 +213,85 @@ __gthread_objc_condition_signal (objc_condition_t 
> condition UNUSED)
>
>  #else /* _LIBOBJC */
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_active_p (void)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_once (__gthread_once_t *__once UNUSED, void (*__func) (void) 
> UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int UNUSED
> +__GTHREAD_INLINE int UNUSED
>  __gthread_key_create (__gthread_key_t *__key UNUSED, void (*__func) (void *) 
> UNUSED)
>  {
>    return 0;
>  }
>
> -static int UNUSED
> +__GTHREAD_INLINE int UNUSED
>  __gthread_key_delete (__gthread_key_t __key UNUSED)
>  {
>    return 0;
>  }
>
> -static inline void *
> +__GTHREAD_INLINE void *
>  __gthread_getspecific (__gthread_key_t __key UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_setspecific (__gthread_key_t __key UNUSED, const void *__v UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_destroy (__gthread_mutex_t *__mutex UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_lock (__gthread_mutex_t *__mutex UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_trylock (__gthread_mutex_t *__mutex UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_mutex_unlock (__gthread_mutex_t *__mutex UNUSED)
>  {
>    return 0;
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_lock (__mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_trylock (__mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_unlock (__mutex);
>  }
>
> -static inline int
> +__GTHREAD_INLINE int
>  __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex)
>  {
>    return __gthread_mutex_destroy (__mutex);
> diff --git a/libstdc++-v3/include/bits/shared_ptr.h 
> b/libstdc++-v3/include/bits/shared_ptr.h
> index 13273afa9d2..9b1c2b4eb3d 100644
> --- a/libstdc++-v3/include/bits/shared_ptr.h
> +++ b/libstdc++-v3/include/bits/shared_ptr.h
> @@ -1160,9 +1160,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
>  #if __cpp_variable_templates
>    template<typename _Tp>
> -    static constexpr bool __is_shared_ptr = false;
> +    constexpr bool __is_shared_ptr = false;
>    template<typename _Tp>
> -    static constexpr bool __is_shared_ptr<shared_ptr<_Tp>> = true;
> +    constexpr bool __is_shared_ptr<shared_ptr<_Tp>> = true;
>  #endif
>
>    /// @} relates shared_ptr
> diff --git a/libstdc++-v3/include/bits/unique_ptr.h 
> b/libstdc++-v3/include/bits/unique_ptr.h
> index edcff78bff9..182173aa857 100644
> --- a/libstdc++-v3/include/bits/unique_ptr.h
> +++ b/libstdc++-v3/include/bits/unique_ptr.h
> @@ -1157,9 +1157,9 @@ namespace __detail
>
>  #if __cpp_variable_templates
>    template<typename _Tp>
> -    static constexpr bool __is_unique_ptr = false;
> +    constexpr bool __is_unique_ptr = false;
>    template<typename _Tp, typename _Del>
> -    static constexpr bool __is_unique_ptr<unique_ptr<_Tp, _Del>> = true;
> +    constexpr bool __is_unique_ptr<unique_ptr<_Tp, _Del>> = true;
>  #endif
>
>    /// @} group pointer_abstractions
> diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
> index 6ce7d89ca3f..437453eaa44 100644
> --- a/libstdc++-v3/include/std/future
> +++ b/libstdc++-v3/include/std/future
> @@ -1526,7 +1526,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
>    template<typename _Signature, typename _Fn,
>            typename _Alloc = std::allocator<int>>
> -    static shared_ptr<__future_base::_Task_state_base<_Signature>>
> +    shared_ptr<__future_base::_Task_state_base<_Signature>>
>      __create_task_state(_Fn&& __fn, const _Alloc& __a = _Alloc())
>      {
>        typedef typename decay<_Fn>::type _Fn2;
> diff --git a/libstdc++-v3/include/std/shared_mutex 
> b/libstdc++-v3/include/std/shared_mutex
> index 1b6478f30c3..7e7941dd7a1 100644
> --- a/libstdc++-v3/include/std/shared_mutex
> +++ b/libstdc++-v3/include/std/shared_mutex
> @@ -72,7 +72,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>  #ifdef __gthrw
>  #define _GLIBCXX_GTHRW(name) \
>    __gthrw(pthread_ ## name); \
> -  static inline int \
> +  inline int \
>    __glibcxx_ ## name (pthread_rwlock_t *__rwlock) \
>    { \
>      if (__gthread_active_p ()) \
> @@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>  # ifndef PTHREAD_RWLOCK_INITIALIZER
>    _GLIBCXX_GTHRW(rwlock_destroy)
>    __gthrw(pthread_rwlock_init);
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_init (pthread_rwlock_t *__rwlock)
>    {
>      if (__gthread_active_p ())
> @@ -99,7 +99,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>  # endif
>  # if _GTHREAD_USE_MUTEX_TIMEDLOCK
>     __gthrw(pthread_rwlock_timedrdlock);
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_timedrdlock (pthread_rwlock_t *__rwlock,
>                                 const timespec *__ts)
>    {
> @@ -109,7 +109,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        return 0;
>    }
>     __gthrw(pthread_rwlock_timedwrlock);
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_timedwrlock (pthread_rwlock_t *__rwlock,
>                                 const timespec *__ts)
>    {
> @@ -120,33 +120,33 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>    }
>  # endif
>  #else
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_rdlock (pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_rdlock (__rwlock); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_tryrdlock (pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_tryrdlock (__rwlock); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_wrlock (pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_wrlock (__rwlock); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_trywrlock (pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_trywrlock (__rwlock); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_unlock (pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_unlock (__rwlock); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_destroy(pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_destroy (__rwlock); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_init(pthread_rwlock_t *__rwlock)
>    { return pthread_rwlock_init (__rwlock, NULL); }
>  # if _GTHREAD_USE_MUTEX_TIMEDLOCK
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_timedrdlock (pthread_rwlock_t *__rwlock,
>                                 const timespec *__ts)
>    { return pthread_rwlock_timedrdlock (__rwlock, __ts); }
> -  static inline int
> +  inline int
>    __glibcxx_rwlock_timedwrlock (pthread_rwlock_t *__rwlock,
>                                 const timespec *__ts)
>    { return pthread_rwlock_timedwrlock (__rwlock, __ts); }
> --
> 2.46.0
>

Reply via email to