libstdc++/71856 Define _GLIBCXX_PARALLEL_ASSERTIONS
authorJonathan Wakely <jwakely@redhat.com>
Wed, 13 Jul 2016 17:22:57 +0000 (18:22 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 13 Jul 2016 17:22:57 +0000 (18:22 +0100)
PR libstdc++/71856
* include/bits/c++config (_GLIBCXX_ASSERTIONS): Define to 1 not empty.
* include/parallel/compiletime_settings.h (_GLIBCXX_ASSERTIONS):
Rename to _GLIBCXX_PARALLEL_ASSERTIONS and make default value depend
on _GLIBCXX_ASSERTIONS.
* include/parallel/balanced_quicksort.h: Rename _GLIBCXX_ASSERTIONS.
Include <unistd.h> for sleep.
* include/parallel/losertree.h: Rename _GLIBCXX_ASSERTIONS.
* include/parallel/merge.h: Likewise.
* include/parallel/multiway_merge.h: Likewise.
* include/parallel/partition.h: Likewise.
* include/parallel/queue.h: Likewise.
* include/parallel/sort.h: Likewise.
* testsuite/25_algorithms/headers/algorithm/
parallel_algorithm_assert.cc: New.

From-SVN: r238307

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/c++config
libstdc++-v3/include/parallel/balanced_quicksort.h
libstdc++-v3/include/parallel/compiletime_settings.h
libstdc++-v3/include/parallel/losertree.h
libstdc++-v3/include/parallel/merge.h
libstdc++-v3/include/parallel/multiway_merge.h
libstdc++-v3/include/parallel/partition.h
libstdc++-v3/include/parallel/queue.h
libstdc++-v3/include/parallel/sort.h
libstdc++-v3/testsuite/25_algorithms/headers/algorithm/parallel_algorithm_assert.cc [new file with mode: 0644]

index a9e5b22bfdab78f1461b7fe0149e6f37c9fbc6b9..264f7935e94a11f97d30b1fb018fae286c28ecba 100644 (file)
@@ -1,5 +1,21 @@
 2016-07-13  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/71856
+       * include/bits/c++config (_GLIBCXX_ASSERTIONS): Define to 1 not empty.
+       * include/parallel/compiletime_settings.h (_GLIBCXX_ASSERTIONS):
+       Rename to _GLIBCXX_PARALLEL_ASSERTIONS and make default value depend
+       on _GLIBCXX_ASSERTIONS.
+       * include/parallel/balanced_quicksort.h: Rename _GLIBCXX_ASSERTIONS.
+       Include <unistd.h> for sleep.
+       * include/parallel/losertree.h: Rename _GLIBCXX_ASSERTIONS.
+       * include/parallel/merge.h: Likewise.
+       * include/parallel/multiway_merge.h: Likewise.
+       * include/parallel/partition.h: Likewise.
+       * include/parallel/queue.h: Likewise.
+       * include/parallel/sort.h: Likewise.
+       * testsuite/25_algorithms/headers/algorithm/
+       parallel_algorithm_assert.cc: New.
+
        * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
        (replace(__const_iterator, __const_iterator, initializer_list<C>)):
        Forward to different overload.
index 57024e40ec0de20263e3d23170a03a9706df650d..462560742517b3600c744da82a1fca17c9dc4886 100644 (file)
@@ -414,7 +414,7 @@ namespace std
 
 // Debug Mode implies checking assertions.
 #ifdef _GLIBCXX_DEBUG
-# define _GLIBCXX_ASSERTIONS
+# define _GLIBCXX_ASSERTIONS 1
 #endif
 
 // Disable std::string explicit instantiation declarations in order to assert.
index 65dec3073e7209ca9ee89d6275e2aaece8622a9a..9d09ed2ceba7c61120197f5c0d7775fc9d3de73a 100644 (file)
 #include <parallel/random_number.h>
 #include <parallel/queue.h>
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
 #include <parallel/checkers.h>
+#ifdef _GLIBCXX_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #endif
 
 namespace __gnu_parallel
@@ -110,7 +113,7 @@ namespace __gnu_parallel
        __median_of_three_iterators(__begin, __begin + (__end - __begin) / 2,
                                    __end  - 1, __comp);
 
-#if defined(_GLIBCXX_ASSERTIONS)
+#if defined(_GLIBCXX_PARALLEL_ASSERTIONS)
       // Must be in between somewhere.
       _DifferenceType __n = __end - __begin;
 
@@ -147,7 +150,7 @@ namespace __gnu_parallel
       std::iter_swap(__begin + __split_pos, __pivot_pos);
       __pivot_pos = __begin + __split_pos;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _RAIter __r;
       for (__r = __begin; __r != __pivot_pos; ++__r)
        _GLIBCXX_PARALLEL_ASSERT(__comp(*__r, *__pivot_pos));
@@ -194,7 +197,7 @@ namespace __gnu_parallel
       _DifferenceType __split_pos =
        __qsb_divide(__begin, __end, __comp, __num_threads);
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _GLIBCXX_PARALLEL_ASSERT(0 <= __split_pos &&
                                __split_pos < (__end - __begin));
 #endif
@@ -267,7 +270,7 @@ namespace __gnu_parallel
       _Piece __current = __tl._M_initial;
 
       _DifferenceType __elements_done = 0;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _DifferenceType __total_elements_done = 0;
 #endif
 
@@ -297,7 +300,7 @@ namespace __gnu_parallel
                                                         __pred);
 
               // Left side: < __pivot_pos; __right side: >= __pivot_pos.
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
               _GLIBCXX_PARALLEL_ASSERT(__begin <= __split_pos1
                                        && __split_pos1 < __end);
 #endif
@@ -328,7 +331,7 @@ namespace __gnu_parallel
 
               // Elements equal to pivot are done.
               __elements_done += (__split_pos2 - __split_pos1);
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
               __total_elements_done += (__split_pos2 - __split_pos1);
 #endif
               // Always push larger part onto stack.
@@ -359,7 +362,7 @@ namespace __gnu_parallel
             {
               __gnu_sequential::sort(__begin, __end, __comp);
               __elements_done += __n;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
               __total_elements_done += __n;
 #endif
 
@@ -372,7 +375,7 @@ namespace __gnu_parallel
 
               __elements_done = 0;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
               double __search_start = omp_get_wtime();
 #endif
 
@@ -380,7 +383,7 @@ namespace __gnu_parallel
               bool __successfully_stolen = false;
               while (__wait && *__tl._M_elements_leftover > 0
                      && !__successfully_stolen
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
                       // Possible dead-lock.
                      && (omp_get_wtime() < (__search_start + 1.0))
 #endif
@@ -399,7 +402,7 @@ namespace __gnu_parallel
 #endif
                }
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
               if (omp_get_wtime() >= (__search_start + 1.0))
                {
                   sleep(1);
@@ -409,7 +412,7 @@ namespace __gnu_parallel
 #endif
               if (!__successfully_stolen)
                {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
                   _GLIBCXX_PARALLEL_ASSERT(*__tl._M_elements_leftover == 0);
 #endif
                   return;
@@ -475,7 +478,7 @@ namespace __gnu_parallel
       __qsb_conquer(__tls, __begin, __begin + __n, __comp, 0,
                    __num_threads, true);
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       // All stack must be empty.
       _Piece __dummy;
       for (_ThreadIndex __i = 1; __i < __num_threads; ++__i)
index f4fb404914ee396363a3520fec2046088fa41cba..47f0a59f8e494b9d0404a9c11c9de247fb595bc0 100644 (file)
 #define _GLIBCXX_SCALE_DOWN_FPU 0
 #endif
 
-#ifndef _GLIBCXX_ASSERTIONS
+#ifndef _GLIBCXX_PARALLEL_ASSERTIONS
 /** @brief Switch on many _GLIBCXX_PARALLEL_ASSERTions in parallel code.
  *  Should be switched on only locally. */
-#define _GLIBCXX_ASSERTIONS 0
+#define _GLIBCXX_PARALLEL_ASSERTIONS (_GLIBCXX_ASSERTIONS+0)
 #endif
 
 #ifndef _GLIBCXX_RANDOM_SHUFFLE_CONSIDER_L1
index 7b4bb4453834bb1d1f01e3f55e493b64e710f72e..f1ee128773247ea23ec13276b52563b0f397e68d 100644 (file)
@@ -222,7 +222,7 @@ namespace __gnu_parallel
       __delete_min_insert(_Tp __key, bool __sup)
       {
         using std::swap;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -324,7 +324,7 @@ namespace __gnu_parallel
       __delete_min_insert(_Tp __key, bool __sup)
       {
         using std::swap;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -451,7 +451,7 @@ namespace __gnu_parallel
 
       void __delete_min_insert(const _Tp& __key, bool __sup)
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -533,7 +533,7 @@ namespace __gnu_parallel
 
       void __delete_min_insert(const _Tp& __key, bool __sup)
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -620,7 +620,7 @@ namespace __gnu_parallel
       int
       __get_min_source()
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -687,7 +687,7 @@ namespace __gnu_parallel
       {
        _M_losers[0] = _M_losers[__init_winner(1)];
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top at the beginning
        // (0 sequences!)
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -700,7 +700,7 @@ namespace __gnu_parallel
       __delete_min_insert(_Tp __key, bool)
       {
         using std::swap;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -755,7 +755,7 @@ namespace __gnu_parallel
            unsigned int __left = __init_winner(2 * __root);
            unsigned int __right = __init_winner(2 * __root + 1);
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
            // If __left one is sentinel then __right one must be, too.
            if (_M_losers[__left]._M_source == -1)
              _GLIBCXX_PARALLEL_ASSERT(_M_losers[__right]._M_source == -1);
@@ -782,7 +782,7 @@ namespace __gnu_parallel
       {
        _M_losers[0] = _M_losers[__init_winner(1)];
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top at the beginning
        // (0 sequences!)
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -795,7 +795,7 @@ namespace __gnu_parallel
       __delete_min_insert(_Tp __key, bool)
       {
         using std::swap;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -865,7 +865,7 @@ namespace __gnu_parallel
       int
       __get_min_source()
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -932,7 +932,7 @@ namespace __gnu_parallel
       {
        _M_losers[0] = _M_losers[__init_winner(1)];
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top at the beginning
        // (0 sequences!)
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -942,7 +942,7 @@ namespace __gnu_parallel
       void
       __delete_min_insert(const _Tp& __key, bool __sup)
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
@@ -998,7 +998,7 @@ namespace __gnu_parallel
            unsigned int __left = __init_winner(2 * __root);
            unsigned int __right = __init_winner(2 * __root + 1);
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
            // If __left one is sentinel then __right one must be, too.
            if (_M_losers[__left]._M_source == -1)
              _GLIBCXX_PARALLEL_ASSERT(_M_losers[__right]._M_source == -1);
@@ -1025,7 +1025,7 @@ namespace __gnu_parallel
       {
        _M_losers[0] = _M_losers[__init_winner(1)];
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top at the beginning
        // (0 sequences!)
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
@@ -1035,7 +1035,7 @@ namespace __gnu_parallel
       void
       __delete_min_insert(const _Tp& __key, bool __sup)
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        // no dummy sequence can ever be at the top!
        _GLIBCXX_PARALLEL_ASSERT(_M_losers[0]._M_source != -1);
 #endif
index c240a52b3ccca3a2a0e11c87a0927fbb017dd4e8..717054ff90d8c217c13c24d2be07dc7955e7e901 100644 (file)
@@ -113,7 +113,7 @@ namespace __gnu_parallel
       typedef typename std::iterator_traits<_RAIter2>::value_type
         _ValueType2;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _GLIBCXX_PARALLEL_ASSERT(__max_length >= 0);
 #endif
 
index bb7b218d61005f5e1cf2711c75b646975b00676f..9e9fdf8a5dd5531472d277e7a6d02ef16aa7af41 100644 (file)
@@ -46,7 +46,7 @@
 #include <parallel/parallel.h>
 #include <parallel/losertree.h>
 #include <parallel/multiseq_selection.h>
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
 #include <parallel/checkers.h>
 #endif
 
@@ -256,7 +256,7 @@ namespace __gnu_parallel
       if (__length == 0)
        return __target;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _DifferenceTp __orig_length = __length;
 #endif
 
@@ -310,7 +310,7 @@ namespace __gnu_parallel
     __finish:
       ;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
     _GLIBCXX_PARALLEL_ASSERT(
        ((_RAIter1)__seq0 - __seqs_begin[0].first) +
        ((_RAIter1)__seq1 - __seqs_begin[1].first) +
@@ -597,7 +597,7 @@ namespace __gnu_parallel
 
       for (_SeqNumber __t = 0; __t < __k; ++__t)
        {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
           _GLIBCXX_PARALLEL_ASSERT(__seqs_begin[__t].first
                                    != __seqs_begin[__t].second);
 #endif
@@ -608,7 +608,7 @@ namespace __gnu_parallel
 
       _SeqNumber __source;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _DifferenceType __i = 0;
 #endif
 
@@ -618,7 +618,7 @@ namespace __gnu_parallel
           // Take out.
           __source = __lt.__get_min_source();
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
           _GLIBCXX_PARALLEL_ASSERT(0 <= __source && __source < __k);
           _GLIBCXX_PARALLEL_ASSERT(__i == 0
               || !__comp(*(__seqs_begin[__source].first), *(__target - 1)));
@@ -627,7 +627,7 @@ namespace __gnu_parallel
           // Feed.
           *(__target++) = *(__seqs_begin[__source].first++);
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
           ++__i;
 #endif
           // Replace from same __source.
@@ -690,7 +690,7 @@ namespace __gnu_parallel
       __target_end = multiway_merge_loser_tree_unguarded<UnguardedLoserTree>
        (__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _GLIBCXX_PARALLEL_ASSERT(__target_end == __target + __length);
       _GLIBCXX_PARALLEL_ASSERT(__is_sorted(__target, __target_end, __comp));
 #endif
@@ -936,7 +936,7 @@ namespace __gnu_parallel
       typedef typename std::iterator_traits<_RAIter1>::value_type
        _ValueType;
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       for (_RAIterIterator __s = __seqs_begin; __s != __seqs_end; ++__s)
        {
           _GLIBCXX_PARALLEL_ASSERT(__is_sorted((*__s).first,
@@ -990,7 +990,7 @@ namespace __gnu_parallel
            (__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
          break;
        }
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
       _GLIBCXX_PARALLEL_ASSERT(
        __is_sorted(__target, __target + __length, __comp));
 #endif
@@ -1230,7 +1230,7 @@ namespace __gnu_parallel
                             _Compare __comp,
                             _ThreadIndex __num_threads)
       {
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        _GLIBCXX_PARALLEL_ASSERT(__seqs_end - __seqs_begin > 1);
 #endif
 
@@ -1318,7 +1318,7 @@ namespace __gnu_parallel
          delete[] __chunks;
        } // parallel
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
        _GLIBCXX_PARALLEL_ASSERT(
           __is_sorted(__target, __target + __length, __comp));
 #endif
index d3ca65b27bdf1bf958c81e6fe9acafe76628f181..16dadf52884113defad7fc62fade5e953fe5f309 100644 (file)
@@ -234,7 +234,7 @@ namespace __gnu_parallel
                         break;
                       }
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
                  _GLIBCXX_PARALLEL_ASSERT(__swapstart != -1);
 #endif
 
@@ -257,7 +257,7 @@ namespace __gnu_parallel
                         break;
                       }
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
                  _GLIBCXX_PARALLEL_ASSERT(__swapstart != -1);
 #endif
 
@@ -265,7 +265,7 @@ namespace __gnu_parallel
                                   __begin + __thread_right_border
                                   + __chunk_size, __begin + __swapstart);
              }
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
 #             pragma omp barrier
 
 #             pragma omp single
index 46fd4bfb200b96ab2a31f16869f7ec4c33dfed6f..cb525c2bf501bace130a7d135e293a9bc82701bb 100644 (file)
@@ -86,7 +86,7 @@ namespace __gnu_parallel
         int __former_front, __former_back;
         __decode2(__former_borders, __former_front, __former_back);
         *(_M_base + __former_front % _M_max_size) = __t;
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
         // Otherwise: front - back > _M_max_size eventually.
         _GLIBCXX_PARALLEL_ASSERT(((__former_front + 1) - __former_back)
                                  <= _M_max_size);
index 16a7925bc35198dc731d77a7ece171279c9661c9..12cef0def329dd1a01d769d6e440ed9ec9c36bc5 100644 (file)
@@ -36,7 +36,7 @@
 #include <parallel/features.h>
 #include <parallel/parallel.h>
 
-#if _GLIBCXX_ASSERTIONS
+#if _GLIBCXX_PARALLEL_ASSERTIONS
 #include <parallel/checkers.h>
 #endif
 
diff --git a/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/parallel_algorithm_assert.cc b/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/parallel_algorithm_assert.cc
new file mode 100644 (file)
index 0000000..b9a6016
--- /dev/null
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// { dg-require-parallel-mode "" }
+// { dg-options "-fopenmp" { target *-*-* } }
+
+// Copyright (C) 2016 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 of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef _GLIBCXX_ASSERTIONS
+# define _GLIBCXX_ASSERTIONS 1
+#endif
+#include <parallel/algorithm>
+#ifndef _GLIBCXX_PARALLEL_ASSERTIONS
+# error "_GLIBCXX_ASSERTIONS does not enable _GLIBCXX_PARALLEL_ASSERTIONS"
+#endif