This should fix this bug properly, by renaming __glibcxx_assert to __glibcxx_assert_impl, and then using it as __glibcxx_assert when _GLIBCXX_ASSERTIONS is defined, and/or using it as _GLIBCXX_PARALLEL_ASSERT when _GLIBCXX_PARALLEL_ASSERTIONS is defined.
This allows us to enable __glibcxx_assert and _GLIBCXX_PARALLEL_ASSERT independently, so that turning on Parallel Mode assertions doesn't turn on assertions in the rest of the library. 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. Tested powerpc64le-linux, committed to trunk.
commit 49fca73d71a0f3906347686b278ce0573b1ab8e2 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Oct 5 18:04:57 2016 +0100 PR71856 try to fix Parallel Mode assertions again 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. diff --git a/libstdc++-v3/doc/xml/manual/using.xml b/libstdc++-v3/doc/xml/manual/using.xml index ee76fef..c06ce16 100644 --- a/libstdc++-v3/doc/xml/manual/using.xml +++ b/libstdc++-v3/doc/xml/manual/using.xml @@ -948,6 +948,15 @@ g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe 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> diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 8a27d14..39e55f4 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -434,9 +434,8 @@ namespace std #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> @@ -450,7 +449,7 @@ namespace std __builtin_abort(); } } -#define __glibcxx_assert(_Condition) \ +#define __glibcxx_assert_impl(_Condition) \ do \ { \ if (! (_Condition)) \ @@ -459,6 +458,12 @@ namespace std } 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 diff --git a/libstdc++-v3/include/parallel/base.h b/libstdc++-v3/include/parallel/base.h index 7d4b69e..721c42d 100644 --- a/libstdc++-v3/include/parallel/base.h +++ b/libstdc++-v3/include/parallel/base.h @@ -419,7 +419,11 @@ namespace __gnu_parallel } } -#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 diff --git a/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/parallel_algorithm_assert2.cc b/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/parallel_algorithm_assert2.cc new file mode 100644 index 0000000..c40985e --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/headers/algorithm/parallel_algorithm_assert2.cc @@ -0,0 +1,50 @@ +// { 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(); +}