Skip to content

[Docs] Clarify partial_apply's ownership of @inout_aliasable arguments. #26523

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions docs/SIL.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3484,13 +3484,14 @@ has an escaping function type (not ``[on_stack]``) the closure context will be
allocated with retain count 1 and initialized to contain the values ``%1``,
``%2``, etc. The closed-over values will not be retained; that must be done
separately before the ``partial_apply``. The closure does however take ownership
of the partially applied arguments; when the closure reference count reaches
zero, the contained values will be destroyed. If the ``partial_apply`` has a
``@noescape`` function type (``partial_apply [on_stack]``) the closure context
is allocated on the stack and initialized to contain the closed-over values. The
closed-over values are not retained, lifetime of the closed-over values must be
managed separately. The lifetime of the stack context of a ``partial_apply
[on_stack]`` must be terminated with a ``dealloc_stack``.
of the partially applied arguments (except for ``@inout_aliasable`` parameters);
when the closure reference count reaches zero, the contained values will be
destroyed. If the ``partial_apply`` has a ``@noescape`` function type
(``partial_apply [on_stack]``) the closure context is allocated on the stack and
initialized to contain the closed-over values. The closed-over values are not
retained, lifetime of the closed-over values must be managed separately. The
lifetime of the stack context of a ``partial_apply [on_stack]`` must be
terminated with a ``dealloc_stack``.

If the callee is generic, all of its generic parameters must be bound by the
given substitution list. The arguments are given with these generic
Expand All @@ -3499,6 +3500,11 @@ type with the given substitutions applied. The generic parameters themselves
cannot be partially applied; all of them must be bound. The result is always
a concrete function.

If an address argument has ``@inout_aliasable`` convention, the closure
obtained from ``partial_apply`` will not own its underlying value.
The ``@inout_aliasable`` parameter convention is used when a ``@noescape``
closure captures an ``inout`` argument.

TODO: The instruction, when applied to a generic function,
currently implicitly performs abstraction difference transformations enabled
by the given substitutions, such as promoting address-only arguments and returns
Expand Down