This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

4369. check-types function for upon_error and upon_stopped is wrong

Section: 33.9.12.9 [exec.then] Status: New Submitter: Eric Niebler Opened: 2025-08-31 Last modified: 2025-09-15

Priority: Not Prioritized

View all issues with New status.

Discussion:

The following has been reported by Trevor Gray:

In 33.9.12.9 [exec.then] p5, the impls-for<decayed-typeof<then-cpo>>::check-types unction is specified as follows:

template<class Sndr, class... Env>
  static consteval void check-types();

Effects: Equivalent to:

auto cs = get_completion_signatures<child-type<Sndr>, FWD-ENV-T(Env)...>();
auto fn = []<class... Ts>(set_value_t(*)(Ts...)) {
  if constexpr (!invocable<remove_cvref_t<data-type<Sndr>>, Ts...>)
    throw unspecified-exception();
};
cs.for-each(overload-set{fn, [](auto){}});

where unspecified-exception is a type derived from exception.

The line auto fn = []<class... Ts>(set_value_t(*)(Ts...)) { is correct when then-cpo is then but not when it is upon_error or upon_stopped.

For upon_error it should be:

auto fn = []<class... Ts>(set_error_t(*)(Ts...)) {

and for upon_stopped it should be:

auto fn = []<class... Ts>(set_stopped_t(*)(Ts...)) {

We can achieve that by replacing set_value_t in the problematic line with decayed-typeof<set-cpo>.

Proposed resolution:

This wording is relative to N5014.

  1. Modify 33.9.12.9 [exec.then] as indicated:

    template<class Sndr, class... Env>
      static consteval void check-types();
    

    -5- Effects: Equivalent to:

    auto cs = get_completion_signatures<child-type<Sndr>, FWD-ENV-T(Env)...>();
    auto fn = []<class... Ts>(set_value_tdecayed-typeof<set-cpo>(*)(Ts...)) {
      if constexpr (!invocable<remove_cvref_t<data-type<Sndr>>, Ts...>)
        throw unspecified-exception();
    };
    cs.for-each(overload-set{fn, [](auto){}});
    

    where unspecified-exception is a type derived from exception.