re PR libstdc++/48760 (std::complex constructor buggy in the face of NaN's)
[gcc.git] / libstdc++-v3 / include / parallel / multiway_mergesort.h
index c0dab63f1401c0075af2d7ddf6148566d54fa664..80267f923b5554a4f54fae70c8fdd42a4f2060af 100644 (file)
@@ -1,6 +1,6 @@
 // -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009, 2010 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
@@ -105,8 +105,8 @@ namespace __gnu_parallel
 
       _DifferenceType* __es = new _DifferenceType[__num_samples + 2];
 
-      equally_split(__sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam], 
-                   __num_samples + 1, __es);
+      __equally_split(__sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam], 
+                     __num_samples + 1, __es);
 
       for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
        ::new(&(__sd->_M_samples[__iam * __num_samples + __i]))
@@ -378,6 +378,8 @@ namespace __gnu_parallel
 
 #     pragma omp barrier
 
+      for (_DifferenceType __i = 0; __i < __length_local; ++__i)
+       __sd->_M_temporary[__iam][__i].~_ValueType();
       ::operator delete(__sd->_M_temporary[__iam]);
     }
 
@@ -413,6 +415,7 @@ namespace __gnu_parallel
       // shared variables
       _PMWMSSortingData<_RAIter> __sd;
       _DifferenceType* __starts;
+      _DifferenceType __size;
 
 #     pragma omp parallel num_threads(__num_threads)
       {
@@ -427,7 +430,7 @@ namespace __gnu_parallel
 
          if (!__exact)
            {
-             _DifferenceType __size =
+             __size =
                (_Settings::get().sort_mwms_oversampling * __num_threads - 1)
                * __num_threads;
              __sd._M_samples = static_cast<_ValueType*>
@@ -463,7 +466,11 @@ namespace __gnu_parallel
       delete[] __sd._M_temporary;
 
       if (!__exact)
-       ::operator delete(__sd._M_samples);
+       {
+         for (_DifferenceType __i = 0; __i < __size; ++__i)
+           __sd._M_samples[__i].~_ValueType();
+         ::operator delete(__sd._M_samples);
+       }
 
       delete[] __sd._M_offsets;
       delete[] __sd._M_pieces;