re PR libstdc++/48760 (std::complex constructor buggy in the face of NaN's)
[gcc.git] / libstdc++-v3 / include / parallel / losertree.h
index 8d7b137aaf56d22f411113650d3e94dd0d732820..306fcd8856fa941252c5f374598e2a79e6657bd9 100644 (file)
@@ -1,6 +1,6 @@
 // -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the terms
@@ -116,7 +116,11 @@ namespace __gnu_parallel
        * @brief The destructor.
        */
       ~_LoserTreeBase()
-      { ::operator delete(_M_losers); }
+      {
+       for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
+         _M_losers[__i].~_Loser();
+       ::operator delete(_M_losers);
+      }
 
       /**
        * @brief Initializes the sequence "_M_source" with the element "__key".
@@ -131,15 +135,15 @@ namespace __gnu_parallel
       {
        unsigned int __pos = _M_k + __source;
 
-       if(_M_first_insert)
+       if (_M_first_insert)
          {
-           // Construct all keys, so we can easily deconstruct them.
+           // Construct all keys, so we can easily destruct them.
            for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
              new(&(_M_losers[__i]._M_key)) _Tp(__key);
            _M_first_insert = false;
          }
        else
-         new(&(_M_losers[__pos]._M_key)) _Tp(__key);
+         _M_losers[__pos]._M_key = __key;
 
        _M_losers[__pos]._M_sup = __sup;
        _M_losers[__pos]._M_source = __source;
@@ -379,7 +383,7 @@ namespace __gnu_parallel
       }
 
       ~_LoserTreePointerBase()
-      { ::operator delete[](_M_losers); }
+      { delete[] _M_losers; }
 
       int __get_min_source()
       { return _M_losers[0]._M_source; }
@@ -592,13 +596,17 @@ namespace __gnu_parallel
 
        for (unsigned int __i = _M_k + _M_ik - 1; __i < (2 * _M_k); ++__i)
          {
-           _M_losers[__i]._M_key = __sentinel;
+           ::new(&(_M_losers[__i]._M_key)) _Tp(__sentinel);
            _M_losers[__i]._M_source = -1;
          }
       }
 
       ~_LoserTreeUnguardedBase()
-      { ::operator delete(_M_losers); }
+      {
+       for (unsigned int __i = 0; __i < (2 * _M_k); ++__i)
+         _M_losers[__i].~_Loser();
+       ::operator delete(_M_losers);
+      }
 
       int
       __get_min_source()
@@ -615,7 +623,7 @@ namespace __gnu_parallel
       {
        unsigned int __pos = _M_k + __source;
 
-       new(&(_M_losers[__pos]._M_key)) _Tp(__key);
+       ::new(&(_M_losers[__pos]._M_key)) _Tp(__key);
        _M_losers[__pos]._M_source = __source;
       }
     };