Tested x86_64-linux, committed to trunk.
Thomas Rodgers writes: > * include/bits/c++config: Adjust TBB detection logic to select serial > PSTL backend if no TBB present. > * testsuite/utils/pstl/test_utils.h: Remove check for > __PSTL_USE_PAR_POLICIES > --- > libstdc++-v3/include/bits/c++config | 8 ++-- > libstdc++-v3/testsuite/util/pstl/test_utils.h | 40 +++++++------------ > 2 files changed, 19 insertions(+), 29 deletions(-) > > diff --git a/libstdc++-v3/include/bits/c++config > b/libstdc++-v3/include/bits/c++config > index 4b8574bf433..746e35efbfc 100644 > --- a/libstdc++-v3/include/bits/c++config > +++ b/libstdc++-v3/include/bits/c++config > @@ -656,9 +656,7 @@ namespace std > > #if __cplusplus >= 201703L > // Preserved here so we have some idea which version of upstream we've > pulled in > -// #define PSTL_VERSION 104 > -// #define PSTL_VERSION_MAJOR (PSTL_VERSION/100) > -// #define PSTL_VERSION_MINOR (PSTL_VERSION - PSTL_VERSION_MAJOR * 100) > +// #define PSTL_VERSION 9000 > > // For now this defaults to being based on the presence of Thread Building > Blocks > # ifndef _GLIBCXX_USE_TBB_PAR_BACKEND > @@ -666,7 +664,9 @@ namespace std > # endif > // This section will need some rework when a new (default) backend type is > added > # if _GLIBCXX_USE_TBB_PAR_BACKEND > -# define _PSTL_USE_PAR_POLICIES 1 > +# define _PSTL_PAR_BACKEND_TBB > +# else > +# define _PSTL_PAR_BACKEND_SERIAL > # endif > > # define _PSTL_ASSERT(_Condition) __glibcxx_assert(_Condition) > diff --git a/libstdc++-v3/testsuite/util/pstl/test_utils.h > b/libstdc++-v3/testsuite/util/pstl/test_utils.h > index 9d16fa566e2..6547d931c29 100644 > --- a/libstdc++-v3/testsuite/util/pstl/test_utils.h > +++ b/libstdc++-v3/testsuite/util/pstl/test_utils.h > @@ -10,14 +10,15 @@ > // File contains common utilities that tests rely on > > // Do not #include <algorithm>, because if we do we will not detect > accidental dependencies. > -#include <sstream> > -#include <iostream> > +#include <atomic> > +#include <cstdint> > +#include <cstdlib> > #include <cstring> > +#include <iostream> > #include <iterator> > -#include <vector> > -#include <atomic> > #include <memory> > -#include <cstdint> > +#include <sstream> > +#include <vector> > > #include "pstl_test_config.h" > > @@ -38,32 +39,30 @@ template <typename T> > class Sequence; > > // Handy macros for error reporting > -#define EXPECT_TRUE(condition, message) TestUtils::expect<true>(condition, > __FILE__, __LINE__, message) > -#define EXPECT_FALSE(condition, message) TestUtils::expect<false>(condition, > __FILE__, __LINE__, message) > +#define EXPECT_TRUE(condition, message) ::TestUtils::expect(true, condition, > __FILE__, __LINE__, message) > +#define EXPECT_FALSE(condition, message) ::TestUtils::expect(false, > condition, __FILE__, __LINE__, message) > > // Check that expected and actual are equal and have the same type. > -#define EXPECT_EQ(expected, actual, message) > TestUtils::expect_equal(expected, actual, __FILE__, __LINE__, message) > +#define EXPECT_EQ(expected, actual, message) > ::TestUtils::expect_equal(expected, actual, __FILE__, __LINE__, message) > > // Check that sequences started with expected and actual and have had size n > are equal and have the same type. > #define EXPECT_EQ_N(expected, actual, n, message) > \ > - TestUtils::expect_equal(expected, actual, n, __FILE__, __LINE__, message) > + ::TestUtils::expect_equal(expected, actual, n, __FILE__, __LINE__, > message) > > // Issue error message from outstr, adding a newline. > // Real purpose of this routine is to have a place to hang a breakpoint. > -static void > +inline void > issue_error_message(std::stringstream& outstr) > { > outstr << std::endl; > std::cerr << outstr.str(); > + std::exit(EXIT_FAILURE); > } > > -template <bool B> > -void > -expect(bool condition, const char* file, int32_t line, const char* message) > +inline void > +expect(bool expected, bool condition, const char* file, int32_t line, const > char* message) > { > - // Templating this function is somewhat silly, but avoids the need to > declare it static > - // or have a separate translation unit. > - if (condition != B) > + if (condition != expected) > { > std::stringstream outstr; > outstr << "error at " << file << ":" << line << " - " << message; > @@ -607,13 +606,6 @@ multiply_matrix(const Matrix2x2<T>& left, const > Matrix2x2<T>& right) > return result; > } > > -// Check that Intel(R) Threading Building Blocks header files are not used > when parallel policies are off > -#if !_PSTL_USE_PAR_POLICIES > -#if defined(TBB_INTERFACE_VERSION) > -#error The parallel backend is used while it should not > (_PSTL_USE_PAR_POLICIES==0) > -#endif > -#endif > - > > //============================================================================ > // Adapters for creating different types of iterators. > // > @@ -1052,10 +1044,8 @@ invoke_on_all_policies(Op op, T&&... rest) > // Try static execution policies > invoke_on_all_iterator_types()(seq, op, std::forward<T>(rest)...); > invoke_on_all_iterator_types()(unseq, op, std::forward<T>(rest)...); > -#if _PSTL_USE_PAR_POLICIES > invoke_on_all_iterator_types()(par, op, std::forward<T>(rest)...); > invoke_on_all_iterator_types()(par_unseq, op, std::forward<T>(rest)...); > -#endif > } > > template <typename F>