8
Statements
[stmt.stmt]
8.7
Jump statements
[stmt.jump]
8.7.5
The
co_return
statement
[stmt.return.coroutine]
coroutine-return-statement
:
co_return
expr-or-braced-init-list
o
p
t
;
1
#
A coroutine returns to its caller or resumer (
[dcl.
fct.
def.
coroutine]
) by the
co_return
statement or when suspended (
[expr.
await]
)
.
A coroutine shall not enclose a
return
statement (
[stmt.
return]
)
.
[
Note
1
:
For this determination, it is irrelevant whether the
return
statement is enclosed by a discarded statement (
[stmt.
if]
)
.
—
end note
]
2
#
The
expr-or-braced-init-list
of a
co_return
statement is called its operand
.
Let
p
be an lvalue naming the coroutine promise object (
[dcl.
fct.
def.
coroutine]
)
.
A
co_return
statement is equivalent to:
{
S
;
goto
final-suspend
;
}
where
final-suspend
is the exposition-only label defined in
[dcl.
fct.
def.
coroutine]
and
S
is defined as follows:
(2.1)
If the operand is a
braced-init-list
or an expression of non-
void
type,
S
is
p
.
return_value
(
expr-or-braced-init-list
)
.
The expression
S
shall be a prvalue of type
void
.
(2.2)
Otherwise,
S
is the
compound-statement
{
expression
o
p
t
;
p
.
return_void
(
)
;
}
.
The expression
p
.
return_void
(
)
shall be a prvalue of type
void
.
3
#
If
p
.
return_void
(
)
is a valid expression, flowing off the end of a coroutine is equivalent to a
co_return
with no operand; otherwise flowing off the end of a coroutine results in undefined behavior
.