Remove _Safe_container _IsCxx11AllocatorAware template parameter

François Dumont frs.dumont@gmail.com
Fri May 12 21:20:00 GMT 2017


On 12/05/2017 12:38, Jonathan Wakely wrote:
> 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.
>
>
Ok, I reverted it.

François




More information about the Libstdc++ mailing list