diff mbox series

Fix inline versioned namespace bootstrap

Message ID a162465e-8f5e-497b-932d-ee9cac2375b4@gmail.com
State New
Headers show
Series Fix inline versioned namespace bootstrap | expand

Commit Message

François Dumont Aug. 27, 2021, 8:57 p.m. UTC
Since std::allocator<void> is not specialized anymore in 
_GLIBCXX_INLINE_VERSION mode _ExtPtr_allocator<void> specialization do 
not compile

because std::allocator<void> is incomplete.

So I think primary _ExtPtr_allocator template should also be prefered in 
_GLIBCXX_INLINE_VERSION mode.

Ok to commit ?

François

Comments

Jonathan Wakely Aug. 27, 2021, 9:17 p.m. UTC | #1
On Fri, 27 Aug 2021 at 21:58, François Dumont via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> Since std::allocator<void> is not specialized anymore in
> _GLIBCXX_INLINE_VERSION mode _ExtPtr_allocator<void> specialization do
> not compile
>
> because std::allocator<void> is incomplete.

That doesn't look right ... it should be complete. This suggests there
is a deeper problem, which I'll look into.



>
> So I think primary _ExtPtr_allocator template should also be prefered in
> _GLIBCXX_INLINE_VERSION mode.

I think it should always be preferred. The _ExtPtr_allocator<void>
specialization is useless, it is missing the converting constructor
that would be needed to convert to/from that type to any other
_ExtPtr_allocator<T> specialization.
Jonathan Wakely Aug. 28, 2021, 9:26 a.m. UTC | #2
On Fri, 27 Aug 2021 at 22:17, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> On Fri, 27 Aug 2021 at 21:58, François Dumont via Libstdc++
> <libstdc++@gcc.gnu.org> wrote:
> >
> > Since std::allocator<void> is not specialized anymore in
> > _GLIBCXX_INLINE_VERSION mode _ExtPtr_allocator<void> specialization do
> > not compile
> >
> > because std::allocator<void> is incomplete.
>
> That doesn't look right ... it should be complete. This suggests there
> is a deeper problem, which I'll look into.

This is the correct fix:

--- a/libstdc++-v3/include/bits/memoryfwd.h
+++ b/libstdc++-v3/include/bits/memoryfwd.h
@@ -63,8 +63,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
  template<typename>
    class allocator;

+#if ! _GLIBCXX_INLINE_VERSION
  template<>
    class allocator<void>;
+#endif

#if __cplusplus >= 201103L
  /// Declare uses_allocator so it can be specialized in `<queue>` etc.




>
>
> >
> > So I think primary _ExtPtr_allocator template should also be prefered in
> > _GLIBCXX_INLINE_VERSION mode.
>
> I think it should always be preferred. The _ExtPtr_allocator<void>
> specialization is useless, it is missing the converting constructor
> that would be needed to convert to/from that type to any other
> _ExtPtr_allocator<T> specialization.
Jonathan Wakely Aug. 28, 2021, 10:49 a.m. UTC | #3
On Sat, 28 Aug 2021 at 10:26, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> On Fri, 27 Aug 2021 at 22:17, Jonathan Wakely <jwakely@redhat.com> wrote:
> >
> > On Fri, 27 Aug 2021 at 21:58, François Dumont via Libstdc++
> > <libstdc++@gcc.gnu.org> wrote:
> > >
> > > Since std::allocator<void> is not specialized anymore in
> > > _GLIBCXX_INLINE_VERSION mode _ExtPtr_allocator<void> specialization do
> > > not compile
> > >
> > > because std::allocator<void> is incomplete.
> >
> > That doesn't look right ... it should be complete. This suggests there
> > is a deeper problem, which I'll look into.
>
> This is the correct fix:
>
> --- a/libstdc++-v3/include/bits/memoryfwd.h
> +++ b/libstdc++-v3/include/bits/memoryfwd.h
> @@ -63,8 +63,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>   template<typename>
>     class allocator;
>
> +#if ! _GLIBCXX_INLINE_VERSION
>   template<>
>     class allocator<void>;
> +#endif
>
> #if __cplusplus >= 201103L
>   /// Declare uses_allocator so it can be specialized in `<queue>` etc.


Actually, the allocator<void> specialization is still needed for
pre-C++20 with the versioned namespace, and that means there's the
same trivial default ctor ABI concern for the versioned namespace. I'm
testing a fix now, but it might not be committed until I'm back at
work on Tuesday.
diff mbox series

Patch

diff --git a/libstdc++-v3/include/ext/extptr_allocator.h b/libstdc++-v3/include/ext/extptr_allocator.h
index 7d8aaac7cee..78ee1fa039f 100644
--- a/libstdc++-v3/include/ext/extptr_allocator.h
+++ b/libstdc++-v3/include/ext/extptr_allocator.h
@@ -162,6 +162,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       std::allocator<_Tp>  _M_real_alloc;
     };
 
+#if ! _GLIBCXX_INLINE_VERSION
   // _ExtPtr_allocator<void> specialization.
   template<>
     class _ExtPtr_allocator<void>
@@ -183,6 +184,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     private:
       std::allocator<void>  _M_real_alloc;
     };
+#endif
 
   template<typename _Tp>
     inline void