This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Remove _Safe_container _IsCxx11AllocatorAware template parameter


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]