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