Index: include/pstl/internal/glue_numeric_defs.h =================================================================== --- include/pstl/internal/glue_numeric_defs.h +++ include/pstl/internal/glue_numeric_defs.h @@ -57,7 +57,7 @@ _ForwardIterator2 __result, _Tp __init); template -_ForwardIterator2 +__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2> exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op); Index: include/pstl/internal/glue_numeric_impl.h =================================================================== --- include/pstl/internal/glue_numeric_impl.h +++ include/pstl/internal/glue_numeric_impl.h @@ -96,17 +96,25 @@ exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result, _Tp __init) { - return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init, - std::plus<_Tp>(), __pstl::__internal::__no_op()); + using namespace __pstl; + return __internal::__pattern_transform_scan( + std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __pstl::__internal::__no_op(), __init, + std::plus<_Tp>(), /*inclusive=*/std::false_type(), + __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec), + __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec)); } template -_ForwardIterator2 +__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2> exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op) { - return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init, - __binary_op, __pstl::__internal::__no_op()); + using namespace __pstl; + return __internal::__pattern_transform_scan( + std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __pstl::__internal::__no_op(), __init, + __binary_op, /*inclusive=*/std::false_type(), + __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec), + __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec)); } // [inclusive.scan] Index: test/CMakeLists.txt =================================================================== --- test/CMakeLists.txt +++ test/CMakeLists.txt @@ -23,7 +23,7 @@ target_link_libraries(test_stdlib INTERFACE pstl::ParallelSTL) target_compile_options(test_stdlib INTERFACE -Wno-gnu-include-next) -file(GLOB_RECURSE UNIT_TESTS "*.pass.cpp") +file(GLOB_RECURSE UNIT_TESTS "*.pass.cpp" "*.fail.cpp") foreach(_file IN LISTS UNIT_TESTS) file(RELATIVE_PATH _target "${CMAKE_CURRENT_SOURCE_DIR}" "${_file}") string(REPLACE ".cpp" "" _target "${_target}") Index: test/std/numerics/numeric.ops/scan.fail.cpp =================================================================== --- /dev/null +++ test/std/numerics/numeric.ops/scan.fail.cpp @@ -0,0 +1,29 @@ +// -*- C++ -*- +//===-- scan.pass.cpp -----------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include +#include + +struct CustomPolicy { + +constexpr std::false_type __allow_vector() { return std::false_type{}; } +constexpr std::false_type __allow_parallel() { return std::false_type{}; } + +} policy; + +int32_t +main() +{ + int *first = nullptr, *last=nullptr, *result = nullptr; + + std::exclusive_scan(policy, first, last, result, 0); + std::exclusive_scan(policy, first, last, result, 0, std::plus()); + + return 0; +}