Following confirmation of the fix by TC here is the patch where I'm simply adding a 'constexpr' on _M_next().

Please let me know this ChangeLog entry is correct. I would prefer this patch to be assigned to 'TC' with me as co-author but I don't know how to do such a thing. Unless I need to change my user git identity to do so ?

    libstdc++: Add constexpr qualification to _Hash_node::_M_next()

https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=1b6f0476837205932613ddb2b3429a55c26c409d
    changed _Hash_node_value_base to no longer derive from _Hash_node_base, which means     that its member functions expect _M_storage to be at a different offset. So explosions     result if an out-of-line definition is emitted for any of the member functions (say,     in a non-optimized build) and the resulting object file is then linked with code built
    using older version of GCC/libstdc++.

    libstdc++-v3/ChangeLog:

            * include/bits/hashtable_policy.h
            (_Hash_node_value_base<>::_M_valptr(), _Hash_node_value_base<>::_M_v())
            Add [[__gnu__::__always_inline__]].
            (_Hash_node<>::_M_next()): Add constexpr.

    Co-authored-by: TC <rs2...@gmail.com>

Ok to commit and backport to GCC 11, 12, 13 branches ?

François

diff --git a/libstdc++-v3/include/bits/hashtable_policy.h b/libstdc++-v3/include/bits/hashtable_policy.h
index 347d468ea86..101c5eb639c 100644
--- a/libstdc++-v3/include/bits/hashtable_policy.h
+++ b/libstdc++-v3/include/bits/hashtable_policy.h
@@ -327,18 +327,22 @@ namespace __detail
 
       __gnu_cxx::__aligned_buffer<_Value> _M_storage;
 
+      [[__gnu__::__always_inline__]]
       _Value*
       _M_valptr() noexcept
       { return _M_storage._M_ptr(); }
 
+      [[__gnu__::__always_inline__]]
       const _Value*
       _M_valptr() const noexcept
       { return _M_storage._M_ptr(); }
 
+      [[__gnu__::__always_inline__]]
       _Value&
       _M_v() noexcept
       { return *_M_valptr(); }
 
+      [[__gnu__::__always_inline__]]
       const _Value&
       _M_v() const noexcept
       { return *_M_valptr(); }
@@ -372,7 +376,7 @@ namespace __detail
     : _Hash_node_base
     , _Hash_node_value<_Value, _Cache_hash_code>
     {
-      _Hash_node*
+      constexpr _Hash_node*
       _M_next() const noexcept
       { return static_cast<_Hash_node*>(this->_M_nxt); }
     };

Reply via email to