Skip to content

Commit f508bb4

Browse files
trio.sleep_forever should be NoReturn (#3096)
* NoReturn * rst * fix "implicit return" * TeamSpen210 rc * Add a test for the error --------- Co-authored-by: Spencer Brown <[email protected]>
1 parent 4e979bf commit f508bb4

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

newsfragments/3095.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Update :func:`trio.sleep_forever` to be `NoReturn`.

src/trio/_tests/test_timeouts.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ async def sleep_3() -> None:
8686
await check_takes_about(sleep_3, TARGET)
8787

8888

89+
async def test_cannot_wake_sleep_forever() -> None:
90+
# Test an error occurs if you manually wake sleep_forever().
91+
task = trio.lowlevel.current_task()
92+
93+
async def wake_task() -> None:
94+
await trio.lowlevel.checkpoint()
95+
trio.lowlevel.reschedule(task, outcome.Value(None))
96+
97+
async with trio.open_nursery() as nursery:
98+
nursery.start_soon(wake_task)
99+
with pytest.raises(RuntimeError):
100+
await trio.sleep_forever()
101+
102+
89103
class TimeoutScope(Protocol):
90104
def __call__(self, seconds: float, *, shield: bool) -> trio.CancelScope: ...
91105

src/trio/_timeouts.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import math
44
import sys
55
from contextlib import contextmanager
6-
from typing import TYPE_CHECKING
6+
from typing import TYPE_CHECKING, NoReturn
77

88
import trio
99

@@ -58,13 +58,14 @@ def move_on_after(
5858
)
5959

6060

61-
async def sleep_forever() -> None:
61+
async def sleep_forever() -> NoReturn:
6262
"""Pause execution of the current task forever (or until cancelled).
6363
6464
Equivalent to calling ``await sleep(math.inf)``.
6565
6666
"""
6767
await trio.lowlevel.wait_task_rescheduled(lambda _: trio.lowlevel.Abort.SUCCEEDED)
68+
raise RuntimeError("Should never have been rescheduled!")
6869

6970

7071
async def sleep_until(deadline: float) -> None:

0 commit comments

Comments
 (0)