Skip to content

specification of as-sndr2(Sig) in [exec.let] is incomplete #318

Open
@ericniebler

Description

@ericniebler

[exec.let]/p9 reads:

Given a type Tag and a pack Args, let as-sndr2 be an alias template such that as-sndr2<Tag(Args...)> denotes the type call-result-t<Fn, decay_t<Args>&...>. Then ops2_variant_t denotes the type

variant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, Env>>...>

except with duplicate types removed.

The type Env is not specified. It should be env_t from paragraph 7.

Paragraphs 8, 9, and 10 only make sense in relation to the lambda in paragraph 7, but that is not at all clear from the current wording. I suggest making paragraphs 8, 9, and 10 sub-bullets of paragraph 7.

Proposed Resolution

Change [exec.let] para 7-10 as follows (includes the proposed fix for #316):

 7. impls-for<decayed-typeof<let-cpo>>::get-state is initialized with a
    callable object equivalent to the following:
 
    []<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) requires see below {
      auto& [_, fn, child] = sndr;
      using fn_t = decay_t<decltype(fn)>;
      using env_t = decltype(let-env(child));
      using args_variant_t = see below;
      using ops2_variant_t = see below;
    
      struct state-type {
        fn_t fn;                    // exposition only
        env_t env;                  // exposition only
        args_variant_t args;        // exposition only
        ops2_variant_t ops2;        // exposition only
      };
      return state-type{std::forward_like<Sndr>(fn), let-env(child), {}, {}};
    }
 
    - (7.1) Let Sigs be a pack of the arguments to the completion_signatures
            specialization named by
-           completion_signatures_of_t<child-type<Sndr>, env_of_t<Rcvr>>. Let
+           completion_signatures_of_t<child-type<Sndr>, FWD-ENV-T(env_of_t<Rcvr>)>. Let
            LetSigs be a pack of those types in Sigs with a return type of
            decayed-typeof<set-cpo>. Let as-tuple be an alias template such
            that as-tuple<Tag(Args...)> denotes the type
            decayed-tuple<Args...>. Then args_variant_t denotes the type
            variant<monostate, as-tuple<LetSigs>...> except with duplicate
            types removed.
    
    - (7.2) Given a type Tag and a pack Args, let as-sndr2 be an alias template
            such that as-sndr2<Tag(Args...)> denotes the type call-result-t<Fn,
            decay_t<Args>&...>. Then ops2_variant_t denotes the type
    
-           variant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, Env>>...>
+           variant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, env_t>>...>
    
            except with duplicate types removed.
    
    - (7.3) The requires-clause constraining the above lambda is satisfied if
            and only if the types args_variant_t and ops2_variant_t are
            well-formed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1bugSomething isn't workingpending-wg21A paper or an LWG issue exits

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions