Remove _Safe_container _IsCxx11AllocatorAware template parameter

Jonathan Wakely jwakely@redhat.com
Fri May 12 10:40:00 GMT 2017


On 11/05/17 22:03 +0200, François Dumont wrote:
>Hi
>
>    _Safe_container _IsCxx11AllocatorAware template allocator is only 
>used if C++11 Abi is not used so I simplified it.
>
>    * include/debug/safe_container.h [_GLIBCXX_USE_CXX11_ABI]
>    (_Safe_container<>): Remove _IsCxx11AllocatorAware template parameter.
>    * include/debug/string: Adapt.
>
>    Tested under Linux x86_64 with debug mode and active C++11 Abi.

Wait, doesn't this mean that debug containers have a different base
class depending on which ABI is active in the translation unit? That
is a One-Definition Rule violation when you link together objects
compiled with different values of _GLIBCXX_USE_CXX11_ABI, which is
supposed to work. I went to enormous effort to ensure it works.


>François
>

>diff --git a/libstdc++-v3/include/debug/safe_container.h b/libstdc++-v3/include/debug/safe_container.h
>index 3d44c15..e985c2a 100644
>--- a/libstdc++-v3/include/debug/safe_container.h
>+++ b/libstdc++-v3/include/debug/safe_container.h
>@@ -36,8 +36,12 @@ namespace __gnu_debug
>   /// Safe class dealing with some allocator dependent operations.
>   template<typename _SafeContainer,
> 	   typename _Alloc,
>-	   template<typename> class _SafeBase,
>-	   bool _IsCxx11AllocatorAware = true>
>+	   template<typename> class _SafeBase
>+#if _GLIBCXX_USE_CXX11_ABI
>+	   >
>+#else
>+	   , bool _IsCxx11AllocatorAware = true>
>+#endif
>     class _Safe_container

In any case, I don't think this is simpler, there are more lines of
code, and the preprocessor condition makes it harder to read and
harder to reason about.

>     : public _SafeBase<_SafeContainer>
>     {
>@@ -82,8 +86,10 @@ namespace __gnu_debug
>       {
> 	__glibcxx_check_self_move_assign(__x);
> 
>+#  if !_GLIBCXX_USE_CXX11_ABI
> 	if (_IsCxx11AllocatorAware)
> 	  {
>+#  endif

This is fairly pointless. Again it makes the code a bit harder to
read, and since it's a compile-time constant the condition will be
optimised away completely.



More information about the Gcc-patches mailing list