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.
get_env noexcept-ness from inline_schedulerSection: 33.13.4 [exec.inline.scheduler] Status: New Submitter: Eric Niebler Opened: 2025-11-05 Last modified: 2026-01-16
Priority: 4
View all issues with New status.
Discussion:
33.13.4 [exec.inline.scheduler] bullet (3.2) reads:
- (3.2) — the expression
get_completion_scheduler<set_value_t>(get_env(sndr))has typeinline_schedulerand is potentially-throwing if and only ifget_env(sndr)is potentially-throwing.
get_env(sndr) is never potentially-throwing because it mandates that sndr.get_env() cannot throw,
see 33.5.4 [exec.get.env].
get_completion_scheduler<set_*_t>(attrs) mandates that
attrs.query(get_completion_scheduler<set_*_t>) cannot throw.
[2026-01-16; Reflector poll.]
Set priority to 4 after reflector poll.
"33.12.1.2 [exec.run.loop.types] (7.2) has the same redundancy."
Previous resolution [SUPERSEDED]:
This wording is relative to N5014.
Modify 33.13.4 [exec.inline.scheduler] as indicated:
-3- Let
sndrbe an expression of typeinline-sender, letrcvrbe an expression such thatreceiver_of<decltype((rcvr)), CS>istruewhereCSiscompletion_signatures<set_value_t()>, then:
- (3.1) — the expression
connect(sndr, rcvr)has typeinline-state<remove_cvref_t<decltype((rcvr))>>and is potentially-throwing if and only if((void)sndr, auto(rcvr))is potentially-throwing, and- (3.2) — the expression
get_completion_scheduler<set_value_t>(get_env(sndr))has typeinline_schedulerand is potentially-throwing if and only if.get_env(sndr)is potentially-throwing
[2026-01-16; Jonathan provides updated wording]
LWG believes the original issue discussion is wrong to say that
get_env(sndr) can never throw, because the expression sndr itself
could throw.
However, we already state that get_env and get_completion_scheduler
do not throw, so it's redundant to say that
get_completion_scheduler(get_env(sndr)) only throws if sndr throws.
If nothing except sndr in that expression is allowed to throw,
then it's just stating the obvious.
Proposed resolution:
This wording is relative to N5032.
Modify 33.13.4 [exec.inline.scheduler] as indicated:
-3- Let
sndrbe an expression of typeinline-sender, letrcvrbe an expression such thatreceiver_of<decltype((rcvr)), CS>istruewhereCSiscompletion_signatures<set_value_t()>, then:
- (3.1) — the expression
connect(sndr, rcvr)has typeinline-state<remove_cvref_t<decltype((rcvr))>>and is potentially-throwing if and only if((void)sndr, auto(rcvr))is potentially-throwing, and- (3.2) — the expression
get_completion_scheduler<set_value_t>(get_env(sndr))has typeinline_schedulerand is potentially-throwing if and only if.get_env(sndr)is potentially-throwing
Modify 33.12.1.2 [exec.run.loop.types] as indicated:
-7- Let
sndrbe an expression of typerun-loop-sender, letrcvrbe an expression such thatreceiver_of<decltype((rcvr)), CS>istruewhereCSis thecompletion_signaturesspecialization above. LetCbe eitherset_value_torset_stopped_t. Then:
- (7.1) — The expression
connect(sndr, rcvr)has typerun-loop-opstate<decay_t<decltype((rcvr))>>and is potentially-throwing if and only if(void(sndr), auto(rcvr))is potentially-throwing.- (7.2) — The expression
get_completion_scheduler<C>(get_env(sndr))is potentially-throwing if and only ifhas typesndris potentially-throwing,run-loop-scheduler,and compares equal to therun-loop-schedulerinstance from whichsndrwas obtained.