diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index e2198c3f4..08533ee95 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -34,12 +34,18 @@ jobs: - name: Install dependencies run: | - sudo apt-get install -y doxygen python3-sphinx python3-sphinx-rtd-theme graphviz + sudo apt-get install -y doxygen python3-sphinx python3-sphinx-rtd-theme graphviz \ + libtbb-dev libtaskflow-cpp-dev pip3 install breathe sphinxcontrib-bibtex sphinx_copybutton IPython myst_parser \ nbsphinx - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DSTDEXEC_BUILD_DOCS:BOOL=ON + run: cmake -B ${{github.workspace}}/build \ + -DSTDEXEC_BUILD_DOCS:BOOL=ON \ + -DSTDEXEC_ENABLE_ASIO:BOOL=ON \ + -DSTDEXEC_ASIO_IMPLEMENTATION:STRING=standalone \ + -DSTDEXEC_ENABLE_TASKFLOW:BOOL=ON \ + -DSTDEXEC_ENABLE_TBB:BOOL=ON - name: Build run: cmake --build ${{github.workspace}}/build --target docs diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index b58405019..bccb3f8eb 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -17,19 +17,26 @@ find_package(Doxygen REQUIRED) find_package(Sphinx REQUIRED) -include(../cmake/Modules/ConfigureASIO.cmake) - # Find all the public headers set(STDEXEC_PUBLIC_HEADER_DIR ${CMAKE_SOURCE_DIR}/include) file(GLOB_RECURSE STDEXEC_PUBLIC_HEADERS ${STDEXEC_PUBLIC_HEADER_DIR}/*.hpp) -set(DOXYGEN_INPUT_DIR ${PROJECT_SOURCE_DIR}/include) +# Doxygen's INPUT tag accepts whitespace-separated, individually-quoted +# paths. CMake serializes lists with ';', which Doxygen would treat as +# part of a single path, so we explicitly quote each entry and join +# with a space here. (The corresponding line in Doxyfile.in must NOT +# wrap @DOXYGEN_INPUT_DIR@ in another layer of quotes.) +string(JOIN " " DOXYGEN_INPUT_DIR + "\"${PROJECT_SOURCE_DIR}/include\"" + "\"${CMAKE_CURRENT_BINARY_DIR}\"") +string(JOIN " " DOXYGEN_EXCLUDE_DIR + "\"${PROJECT_SOURCE_DIR}/include/execpools\"" + "\"${PROJECT_SOURCE_DIR}/include/tbbexec\"" + "\"${PROJECT_SOURCE_DIR}/include/asioexec\"") set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/doxygen) -set(DOXYGEN_EXCLUDE_DIR ${PROJECT_SOURCE_DIR}/include/execpools) set(DOXYGEN_INDEX_FILE ${DOXYGEN_OUTPUT_DIR}/xml/index.xml) set(DOXYFILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in) set(DOXYFILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) -set(COMPILATION_DB_PATH ${PROJECT_SOURCE_DIR}) # Find the location of stddef.h execute_process(COMMAND echo "#include " diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index 0eff39f36..b3453c8e8 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -184,7 +184,7 @@ FULL_PATH_NAMES = YES # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which @@ -943,7 +943,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = "@DOXYGEN_INPUT_DIR@" +INPUT = @DOXYGEN_INPUT_DIR@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -1020,7 +1020,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = "@DOXYGEN_EXCLUDE_DIR@" +EXCLUDE = @DOXYGEN_EXCLUDE_DIR@ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -2366,18 +2366,23 @@ INCLUDE_FILE_PATTERNS = # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = "__cplusplus=202302L" \ + "__cpp_explicit_this_parameter=202110L" \ "STDEXEC_DOXYGEN_INVOKED=1" \ "STDEXEC=stdexec" \ "STDEXEC_PARALLEL_SCHEDULER_HEADER_ONLY=1" \ "STDEXEC_PARALLEL_SCHEDULER_INLINE=inline" \ "STDEXEC_ATTRIBUTE(...)= " \ + "STDEXEC_IMMOVABLE(X)=X(X&&) = delete" \ "STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS= " \ "STDEXEC_AUTO_RETURN(...)=->decltype(auto){ return __VA_ARGS__; }" \ "STDEXEC_EXPLICIT_THIS_BEGIN(...)=__VA_ARGS__" \ "STDEXEC_EXPLICIT_THIS_END(...)= " \ "STDEXEC_CLANG()=1" \ + "STDEXEC_CLANG_CL()=0" \ + "STDEXEC_APPLE_CLANG()=0" \ "STDEXEC_MSVC()=0" \ "STDEXEC_GCC()=0" \ + "STDEXEC_NVCC()=0" \ "STDEXEC_NVHPC()=0" \ "STDEXEC_EDG()=0" \ "STDEXEC_PRAGMA_PUSH()= " \ @@ -2815,10 +2820,4 @@ MSCGEN_TOOL = MSCFILE_DIRS = -# Use clang to parse the source code. -CLANG_ASSISTED_PARSING = YES -CLANG_DATABASE_PATH = "@COMPILATION_DB_PATH@" -CLANG_OPTIONS = -isystem "@STDDEF_INCLUDE_PATH@" \ - -std=c++23 \ - -DSTDEXEC_DOXYGEN_INVOKED=1 \ - -DSTDEXEC_PARALLEL_SCHEDULER_HEADER_ONLY=1 +CLANG_ASSISTED_PARSING = NO diff --git a/docs/source/index.rst b/docs/source/index.rst index 772f223e6..2167e19b5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -68,10 +68,10 @@ separates concerns cleanly, enabling: - Full support for customization: Plug in your own schedulers, senders, adaptors, allocators, stop tokens, etc. -Senders end `Callback Hell `_. +Senders end `Callback Hell `_. -🚦 Standardization Status (as of 2025) +🚦 Standardization Status (as of 2026) -------------------------------------- - The core Sender model has been accepted into the C++ standard for C++26. diff --git a/docs/source/reference/index.rst b/docs/source/reference/index.rst index 50d1a9660..903e475f5 100644 --- a/docs/source/reference/index.rst +++ b/docs/source/reference/index.rst @@ -43,12 +43,12 @@ The concepts fall into three layers: its lifetime is tracked. Sender concepts -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ .. _ref-concept-sender: ``sender`` -^^^^^^^^^^ +~~~~~~~~~~ .. doxygenconcept:: stdexec::sender @@ -59,24 +59,24 @@ Sender concepts .. _ref-concept-sender_in: ``sender_in`` -^^^^^^^^^^^^^ +~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::sender_in .. _ref-concept-sender_to: ``sender_to`` -^^^^^^^^^^^^^ +~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::sender_to Receiver and operation-state concepts -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _ref-concept-receiver: ``receiver`` -^^^^^^^^^^^^ +~~~~~~~~~~~~ .. doxygenconcept:: stdexec::receiver @@ -85,40 +85,40 @@ Receiver and operation-state concepts .. _ref-concept-receiver_of: ``receiver_of`` -^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::receiver_of .. _ref-concept-operation_state: ``operation_state`` -^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::operation_state .. doxygenstruct:: stdexec::operation_state_tag Context concepts -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ .. _ref-concept-scheduler: ``scheduler`` -^^^^^^^^^^^^^ +~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::scheduler .. _ref-concept-scope_token: ``scope_token`` -^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::scope_token .. _ref-concept-scope_association: ``scope_association`` -^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~ .. doxygenconcept:: stdexec::scope_association @@ -154,12 +154,12 @@ narrative walkthrough of how these fit together when writing a new sender adaptor. Sender-side -~~~~~~~~~~~ +^^^^^^^^^^^ .. _ref-cpo-connect: ``connect`` -^^^^^^^^^^^ +~~~~~~~~~~~ .. doxygenstruct:: stdexec::connect_t :members: @@ -169,7 +169,7 @@ Sender-side .. _ref-cpo-get_completion_signatures: ``get_completion_signatures`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Unlike the other entries in this section, ``get_completion_signatures`` is a *function template* (not a CPO instance), so it has no underlying @@ -180,12 +180,12 @@ share documentation: :sections: briefdescription detaileddescription Operation-state-side -~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^ .. _ref-cpo-start: ``start`` -^^^^^^^^^ +~~~~~~~~~ .. doxygenstruct:: stdexec::start_t :members: @@ -193,12 +193,12 @@ Operation-state-side .. doxygenvariable:: stdexec::start Receiver-side -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ .. _ref-cpo-set_value: ``set_value`` -^^^^^^^^^^^^^ +~~~~~~~~~~~~~ .. doxygenstruct:: stdexec::set_value_t :members: @@ -208,7 +208,7 @@ Receiver-side .. _ref-cpo-set_error: ``set_error`` -^^^^^^^^^^^^^ +~~~~~~~~~~~~~ .. doxygenstruct:: stdexec::set_error_t :members: @@ -218,7 +218,7 @@ Receiver-side .. _ref-cpo-set_stopped: ``set_stopped`` -^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~ .. doxygenstruct:: stdexec::set_stopped_t :members: @@ -228,7 +228,7 @@ Receiver-side .. _ref-cpo-get_env: ``get_env`` -^^^^^^^^^^^ +~~~~~~~~~~~ .. doxygenstruct:: stdexec::get_env_t :members: @@ -315,7 +315,7 @@ for an approachable introduction. .. _ref-just_from: ``just_from`` (experimental) — like ``just`` but value-producing via a function -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. doxygenvariable:: experimental::execution::just_from diff --git a/docs/source/user/index.rst b/docs/source/user/index.rst index ae8778470..1ef68663e 100644 --- a/docs/source/user/index.rst +++ b/docs/source/user/index.rst @@ -31,7 +31,7 @@ From the perspective of the user, the core concepts of the Sender model are the **sender** abstraction, the **scheduler** abstraction, and **sender algorithms**. 1. Scheduler -^^^^^^^^^^^^ +~~~~~~~~~~~~ A **scheduler** is an object that provides a way to schedule work. They are lightweight handles to what is often a heavy-weight and immovable **execution context**. Execution @@ -56,16 +56,13 @@ is executed on a context by chaining continuations to one of these senders, and it to one of the algorithms that starts work, like ``stdexec::sync_wait``. 2. Sender -^^^^^^^^^ +~~~~~~~~~ A **sender** is an object that describes an asynchronous computation that may happen later. It can do nothing on its own, but when connected to a receiver, it returns an **operation state** that can start the work described by the sender. -``stdexec`` provides a set of generic **sender algorithms** that can be used to chain -operations together. There are also algorithms, like ``stdexec::sync_wait``, that can -be used to launch the sender. The sender algorithms take care of connecting the sender -to a receiver and managing the lifetime the operation state. +A sender: - Produces values (or errors) asynchronously. @@ -75,6 +72,14 @@ to a receiver and managing the lifetime the operation state. - Is lazy (does nothing until connected and started). +3. Sender algorithms +~~~~~~~~~~~~~~~~~~~~ + +``stdexec`` provides a set of generic **sender algorithms** that can be used to chain +operations together. There are also algorithms, like ``stdexec::sync_wait``, that can +be used to launch the sender. The sender algorithms take care of connecting the sender +to a receiver and managing the lifetime the operation state. + .. code-block:: cpp auto sndr = stdexec::just(42); // Sender that yields 42 immediately diff --git a/include/exec/any_sender_of.hpp b/include/exec/any_sender_of.hpp index 3e811320a..47d6518b8 100644 --- a/include/exec/any_sender_of.hpp +++ b/include/exec/any_sender_of.hpp @@ -29,8 +29,10 @@ STDEXEC_PRAGMA_IGNORE_GNU("-Woverloaded-virtual") namespace experimental::execution { - namespace _qry_detail + namespace _query { + using namespace STDEXEC; + template struct _env_archetype; @@ -40,22 +42,22 @@ namespace experimental::execution Return query(Query, Args &&...) const noexcept(Nothrow); }; - using namespace STDEXEC; - template - inline constexpr bool is_query_function_v = false; + inline constexpr bool _is_query_signature_v = false; template - inline constexpr bool is_query_function_v = + inline constexpr bool _is_query_signature_v = __callable const &, Args...>; template - inline constexpr bool is_query_function_v = + inline constexpr bool _is_query_signature_v = __nothrow_callable const &, Args...>; - } // namespace _qry_detail - template - requires(_qry_detail::is_query_function_v && ...) + template + concept _query_signature = _is_query_signature_v; + } // namespace _query + + template <_query::_query_signature... Sigs> struct queries {}; @@ -142,7 +144,8 @@ namespace experimental::execution { using _has_query_memfn_t = void; using Base::Base; - auto query(__none_such) const noexcept -> __none_such = delete; + auto query(__none_such) const noexcept // NOLINT(modernize-use-nodiscard) + -> __none_such = delete; }; template @@ -433,7 +436,7 @@ namespace experimental::execution using operation_state_concept = STDEXEC::operation_state_tag; using _iopstate_base_t::_iopstate_base_t; - virtual constexpr void start() & noexcept + virtual constexpr void start() & noexcept // NOLINT(modernize-use-override) { STDEXEC::__any::__value(*this).start(); } @@ -725,6 +728,8 @@ namespace experimental::execution } }; +#if !STDEXEC_DOXYGEN_INVOKED + //////////////////////////////////////////////////////////////////////////////////////// // Legacy interfaces for type-erased senders and receivers. @@ -820,8 +825,10 @@ namespace experimental::execution }; }; }; -} // namespace experimental::execution -STDEXEC_PRAGMA_POP() +#endif // !STDEXEC_DOXYGEN_INVOKED +} // namespace experimental::execution namespace exec = experimental::execution; + +STDEXEC_PRAGMA_POP() diff --git a/include/exec/asio/asio_thread_pool.hpp b/include/exec/asio/asio_thread_pool.hpp index 895952f42..589c29d2a 100644 --- a/include/exec/asio/asio_thread_pool.hpp +++ b/include/exec/asio/asio_thread_pool.hpp @@ -52,7 +52,7 @@ namespace experimental::execution::asio } private: - friend exec::thread_pool_base; + friend struct ::exec::thread_pool_base; template friend struct exec::_pool_::opstate; diff --git a/include/exec/completion_signatures.hpp b/include/exec/completion_signatures.hpp index 7ab18ac4c..3c19e81d2 100644 --- a/include/exec/completion_signatures.hpp +++ b/include/exec/completion_signatures.hpp @@ -54,7 +54,7 @@ namespace experimental::execution //! \c set_value_t, \c set_error_t, or \c set_stopped_t. //! \tparam DeducedSigs Completion signature types to be deduced from the function //! arguments. - //! \param unnamed Pointer arguments (unused) for type deduction of + //! \param __sigs Pointer arguments (unused) for type deduction of //! \c DeducedSigs. Must be a pack of function pointer types, the //! returns types of which must be one of \c set_value_t, //! \c set_error_t, or \c set_stopped_t. @@ -70,7 +70,7 @@ namespace experimental::execution //! actual object instances. template [[nodiscard]] - consteval auto make_completion_signatures(DeducedSigs*...) noexcept + consteval auto make_completion_signatures([[maybe_unused]] DeducedSigs*... __sigs) noexcept -> detail::make_completion_signatures_t { return {}; @@ -185,7 +185,7 @@ namespace experimental::execution //! { //! return ex::completion_signatures(); //! } - //! else /* !is_void && !nothrow */ + //! else // !is_void && !nothrow //! { //! return ex::completion_signatures(); @@ -219,17 +219,17 @@ namespace experimental::execution class ErrorFn = keep_completion, class StoppedFn = keep_completion, class ExtraSigs = STDEXEC::completion_signatures<>> - consteval auto transform_completion_signatures(Completions, - ValueFn value_fn = {}, - ErrorFn error_fn = {}, - StoppedFn stopped_fn = {}, - ExtraSigs = {}) + consteval auto transform_completion_signatures([[maybe_unused]] Completions completions, + ValueFn value_fn = {}, + ErrorFn error_fn = {}, + StoppedFn stopped_fn = {}, + [[maybe_unused]] ExtraSigs extra_sigs = {}) { - return STDEXEC::__transform_completion_signatures(Completions{}, + return STDEXEC::__transform_completion_signatures(Completions(), value_fn, error_fn, stopped_fn, - ExtraSigs{}); + ExtraSigs()); } } // namespace experimental::execution diff --git a/include/exec/static_thread_pool.hpp b/include/exec/static_thread_pool.hpp index 1c2ec1b9c..b78e1bbf2 100644 --- a/include/exec/static_thread_pool.hpp +++ b/include/exec/static_thread_pool.hpp @@ -1196,7 +1196,7 @@ namespace experimental::execution struct _static_thread_pool::_opstate : task_base { private: - friend _static_thread_pool::scheduler::_sender; + friend struct ::exec::_pool_::_static_thread_pool::scheduler::_sender; explicit _opstate(_static_thread_pool& pool, remote_queue* queue, diff --git a/include/exec/taskflow/taskflow_thread_pool.hpp b/include/exec/taskflow/taskflow_thread_pool.hpp index 434aba3ef..3743acaf1 100644 --- a/include/exec/taskflow/taskflow_thread_pool.hpp +++ b/include/exec/taskflow/taskflow_thread_pool.hpp @@ -45,7 +45,7 @@ namespace experimental::execution::taskflow return STDEXEC::forward_progress_guarantee::parallel; } - friend exec::thread_pool_base; + friend struct ::exec::thread_pool_base; template friend struct exec::_pool_::opstate; diff --git a/include/exec/tbb/tbb_thread_pool.hpp b/include/exec/tbb/tbb_thread_pool.hpp index db59cff32..e020509b9 100644 --- a/include/exec/tbb/tbb_thread_pool.hpp +++ b/include/exec/tbb/tbb_thread_pool.hpp @@ -42,7 +42,7 @@ namespace experimental::execution::tbb } private: - friend exec::thread_pool_base; + friend struct ::exec::thread_pool_base; template friend struct exec::_pool_::opstate; diff --git a/include/exec/thread_pool_base.hpp b/include/exec/thread_pool_base.hpp index 9181f18c9..9cc3b1e44 100644 --- a/include/exec/thread_pool_base.hpp +++ b/include/exec/thread_pool_base.hpp @@ -158,7 +158,8 @@ namespace experimental::execution } private: - friend struct DerivedPoolType::scheduler; + using derived_pool_type = DerivedPoolType; + friend struct derived_pool_type::scheduler; explicit sender(DerivedPoolType& pool) noexcept : pool_(pool) diff --git a/include/stdexec/__detail/__bulk.hpp b/include/stdexec/__detail/__bulk.hpp index 6bc97f83c..22136f102 100644 --- a/include/stdexec/__detail/__bulk.hpp +++ b/include/stdexec/__detail/__bulk.hpp @@ -426,7 +426,7 @@ namespace STDEXEC //! //! **Execution policy.** //! - //! The policy argument follows the @c conventions: + //! The policy argument follows the `` conventions: //! @c stdexec::seq for sequenced execution, @c stdexec::par for //! permitted-parallel, @c stdexec::par_unseq for permitted parallel and //! vectorized. A custom scheduler's domain may interpret these diff --git a/include/stdexec/__detail/__meta.hpp b/include/stdexec/__detail/__meta.hpp index 94f2378e9..4f0267428 100644 --- a/include/stdexec/__detail/__meta.hpp +++ b/include/stdexec/__detail/__meta.hpp @@ -55,6 +55,9 @@ namespace STDEXEC template struct __mlist; + template + using __mlist_ptr = __mlist<_Ts...> *; + template using __midentity = _Tp; @@ -601,8 +604,23 @@ namespace STDEXEC template > using __mfill = __mfill_c<_Ny::value, _Ty, _Continuation>; - template - struct __mconcat_ + template + struct __mconcat_; + + template , class... _Tail> + using __mconcat_result_t = + decltype(__mconcat_<(sizeof...(_Tail) == 0)>::__f(static_cast<_List *>(nullptr), + static_cast<_Tail *>(nullptr)...)); + + template <> + struct __mconcat_ + { + template + static auto __f(__mlist_ptr<_As...>) -> __mlist<_As...>; + }; + + template <> + struct __mconcat_ { template class _Ap = __mlist, @@ -614,31 +632,20 @@ namespace STDEXEC template class _Dp = __mlist, class... _Ds, class... _Tail> - static auto __f(__mlist<_Ts...> *, + static auto __f(__mlist_ptr<_Ts...>, _Ap<_As...> *, _Bp<_Bs...> * = nullptr, _Cp<_Cs...> * = nullptr, _Dp<_Ds...> * = nullptr, _Tail *...__tail) - -> __midentity::__f( - static_cast<__mlist<_Ts..., _As..., _Bs..., _Cs..., _Ds...> *>(nullptr), - __tail...))>; - }; - - template <> - struct __mconcat_ - { - template - static auto __f(__mlist<_As...> *) -> __mlist<_As...>; + -> __mconcat_result_t<__mlist<_Ts..., _As..., _Bs..., _Cs..., _Ds...>, _Tail...>; }; template > struct __mconcat { template - using __f = __mapply< - _Continuation, - decltype(__mconcat_<(sizeof...(_Args) == 0)>::__f({}, static_cast<_Args *>(nullptr)...))>; + using __f = __mapply<_Continuation, __mconcat_result_t<__mlist<>, _Args...>>; }; struct __msize diff --git a/include/stdexec/__detail/__sync_wait.hpp b/include/stdexec/__detail/__sync_wait.hpp index bb28eab1b..063902d16 100644 --- a/include/stdexec/__detail/__sync_wait.hpp +++ b/include/stdexec/__detail/__sync_wait.hpp @@ -391,7 +391,7 @@ STDEXEC_P2300_NAMESPACE_BEGIN(this_thread) }; //////////////////////////////////////////////////////////////////////////// - // [execution.senders.consumers.sync_wait_with_variant] + // [exec.sync.wait.var] //! @brief A sender consumer that synchronously blocks the calling thread //! until a multi-value-completion sender completes, returning the @@ -428,7 +428,7 @@ STDEXEC_P2300_NAMESPACE_BEGIN(this_thread) //! @endcode //! //! The handling of @c set_error_t and @c set_stopped_t matches - //! @ref sync_wait_t: errors are thrown, @c set_stopped yields a disengaged + //! @ref sync_wait_t : errors are thrown, @c set_stopped yields a disengaged //! optional. //! //! **When to use** @c sync_wait_with_variant **vs.** @c sync_wait **:** diff --git a/include/stdexec/__detail/__transform_completion_signatures.hpp b/include/stdexec/__detail/__transform_completion_signatures.hpp index d36edd8df..3e78641d9 100644 --- a/include/stdexec/__detail/__transform_completion_signatures.hpp +++ b/include/stdexec/__detail/__transform_completion_signatures.hpp @@ -537,7 +537,7 @@ namespace STDEXEC //! { //! return ex::completion_signatures(); //! } - //! else /* !is_void && !nothrow */ + //! else // !is_void && !nothrow //! { //! return ex::completion_signatures(); diff --git a/include/stdexec/stop_token.hpp b/include/stdexec/stop_token.hpp index 50afb5efe..04d43acad 100644 --- a/include/stdexec/stop_token.hpp +++ b/include/stdexec/stop_token.hpp @@ -129,7 +129,7 @@ STDEXEC_P2300_NAMESPACE_BEGIN() private: friend inplace_stop_token; - friend STDEXEC::__stok::__inplace_stop_callback_base; + friend struct STDEXEC::__stok::__inplace_stop_callback_base; template friend class inplace_stop_callback;