This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/71856] [6/7 Regression] _GLIBCXX_DEBUG-mode breaks GNU parallel extension
- From: "redi at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 05 Oct 2016 16:13:24 +0000
- Subject: [Bug libstdc++/71856] [6/7 Regression] _GLIBCXX_DEBUG-mode breaks GNU parallel extension
- Auto-submitted: auto-generated
- References: <bug-71856-4@http.gcc.gnu.org/bugzilla/>
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