+2016-12-08 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/71856
+ * doc/xml/manual/using.xml: Document macro.
+ * include/bits/c++config [_GLIBCXX_DEBUG || _GLIBCXX_PARALLEL]
+ (__glibcxx_assert): Rename to __glibcxx_assert_impl.
+ [_GLIBCXX_DEBUG] (__glibcxx_assert): Expand to __glibcxx_assert_impl.
+ * include/parallel/base.h [_GLIBCXX_PARALLEL_ASSERTIONS]
+ (_GLIBCXX_PARALLEL_ASSERT): Expand to __glibcxx_assert_impl.
+ [!_GLIBCXX_PARALLEL_ASSERTIONS] (_GLIBCXX_PARALLEL_ASSERT): Define as
+ empty.
+ * testsuite/25_algorithms/headers/algorithm/
+ parallel_algorithm_assert2.cc: New test.
+
2016-12-08 Jakub Jelinek <jakub@redhat.com>
* testsuite/util/testsuite_new_operators.h: Include testsuite_hooks.h.
mode</link>.
</para>
</listitem></varlistentry>
+ <varlistentry><term><code>_GLIBCXX_PARALLEL_ASSERTIONS</code></term>
+ <listitem>
+ <para>Undefined by default, but when any parallel mode header is included
+ this macro will be defined to a non-zero value if
+ <code>_GLIBCXX_ASSERTIONS</code> has a non-zero value, otherwise to zero.
+ When defined to a non-zero value, it enables extra error checking and
+ assertions in the parallel mode.
+ </para>
+ </listitem></varlistentry>
<varlistentry><term><code>_GLIBCXX_PROFILE</code></term>
<listitem>
#endif
// Assert.
-#if !defined(_GLIBCXX_ASSERTIONS) && !defined(_GLIBCXX_PARALLEL)
-# define __glibcxx_assert(_Condition)
-#else
+#if defined(_GLIBCXX_ASSERTIONS) \
+ || defined(_GLIBCXX_PARALLEL) || defined(_GLIBCXX_PARALLEL_ASSERTIONS)
namespace std
{
// Avoid the use of assert, because we're trying to keep the <cassert>
__builtin_abort();
}
}
-#define __glibcxx_assert(_Condition) \
+#define __glibcxx_assert_impl(_Condition) \
do \
{ \
if (! (_Condition)) \
} while (false)
#endif
+#if defined(_GLIBCXX_ASSERTIONS)
+# define __glibcxx_assert(_Condition) __glibcxx_assert_impl(_Condition)
+#else
+# define __glibcxx_assert(_Condition)
+#endif
+
// Macros for race detectors.
// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and
// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain
}
}
-#define _GLIBCXX_PARALLEL_ASSERT(_Condition) __glibcxx_assert(_Condition)
+#if _GLIBCXX_PARALLEL_ASSERTIONS && defined(__glibcxx_assert_impl)
+#define _GLIBCXX_PARALLEL_ASSERT(_Condition) __glibcxx_assert_impl(_Condition)
+#else
+#define _GLIBCXX_PARALLEL_ASSERT(_Condition)
+#endif
} //namespace __gnu_parallel
--- /dev/null
+// { dg-require-parallel-mode "" }
+// { dg-options "-fopenmp -D_GLIBCXX_PARALLEL" { target *-*-* } }
+// { dg-do run }
+
+// 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/>.
+
+#undef _GLIBCXX_DEBUG
+#undef _GLIBCXX_ASSERTIONS
+#undef _GLIBCXX_PARALLEL_ASSERTIONS
+#define _GLIBCXX_PARALLEL_ASSERTIONS 1
+#include <parallel/algorithm>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ // This should not be enabled without _GLIBCXX_ASSERTIONS:
+ __glibcxx_assert(false);
+}
+
+void
+test02()
+{
+ bool result = false;
+
+ // This should be enabled by _GLIBCXX_PARALLEL_ASSERTIONS:
+ _GLIBCXX_PARALLEL_ASSERT(result = true);
+ VERIFY(result);
+}
+
+int main()
+{
+ test01();
+ test02();
+}