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