https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71856
--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> --- This should ensure __glibcxx_assert() is empty unless _GLIBCXX_ASSERTIONS is defined, but _GLIBCXX_PARALLEL_ASSERT() still expands to an assertion. --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -442,9 +442,7 @@ namespace std #endif // Assert. -#if !defined(_GLIBCXX_ASSERTIONS) && !defined(_GLIBCXX_PARALLEL) -# define __glibcxx_assert(_Condition) -#else +#if defined(_GLIBCXX_ASSERTIONS) || defined(_GLIBCXX_PARALLEL) namespace std { // Avoid the use of assert, because we're trying to keep the <cassert> @@ -458,7 +456,7 @@ namespace std __builtin_abort(); } } -#define __glibcxx_assert(_Condition) \ +#define __glibcxx_assert_(_Condition) \ do \ { \ if (! (_Condition)) \ @@ -467,6 +465,12 @@ namespace std } while (false) #endif +#if defined(_GLIBCXX_ASSERTIONS) +# define __glibcxx_assert(_Condition) __glibcxx_assert_(_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 --- a/libstdc++-v3/include/parallel/base.h +++ b/libstdc++-v3/include/parallel/base.h @@ -419,7 +419,7 @@ namespace __gnu_parallel } } -#define _GLIBCXX_PARALLEL_ASSERT(_Condition) __glibcxx_assert(_Condition) +#define _GLIBCXX_PARALLEL_ASSERT(_Condition) __glibcxx_assert_(_Condition) } //namespace __gnu_parallel However this means that certain assertions in parallel mode are enabled unconditionally e.g. in <parallel/find.h> default: _GLIBCXX_PARALLEL_ASSERT(false); return std::make_pair(__begin1, __begin2); It looks like that's always been the case, but surely can't be what was intended. So maybe <parallel/base.h> should do: #if _GLIBCXX_PARALLEL_ASSERTIONS #define _GLIBCXX_PARALLEL_ASSERT(_Condition) __glibcxx_assert_(_Condition) #else #define _GLIBCXX_PARALLEL_ASSERT(_Condition) #endif