# improve async function semantics · gitcafe/zig

[View on GitCafe](https://git.cafe/gitcafe/zig/commit/400500a3afafca8178f13a7e4e1cd0ae7808aff2)

Repository: [gitcafe/zig](https://git.cafe/gitcafe/zig)

Visibility: public

Requested revision: 400500a3afafca8178f13a7e4e1cd0ae7808aff2

Requested commit: 400500a3afafca8178f13a7e4e1cd0ae7808aff2

Commit: 400500a3afafca8178f13a7e4e1cd0ae7808aff2

Tree: f6ee011721206db3cda4952dd2eccaeb71c7e632

Author: Andrew Kelley

Committer: Andrew Kelley

## Message

```
improve async function semantics

 * add safety panic for resuming a function which is returning, pending
   an await
 * remove IrInstructionResultPtr
 * add IrInstructionReturnBegin. This does the early return in async
   functions; does nothing in normal functions.
 * `await` gets a result location
 * `analyze_fn_async` will call `analyze_fn_body` if necessary.
 * async function frames have a result pointer field for themselves
   to access and one for the awaiter to supply before the atomic rmw.
   when returning, async functions copy the result to the awaiter result
   pointer, if it is non-null.
 * async function frames have a stack trace pointer which is supplied by
   the awaiter before the atomicrmw. Later in the frame is a stack trace
   struct and addresses, which is used for its own calls and awaits.
 * when awaiting an async function, if an early return occurred, the
   awaiter tail resumes the frame.
 * when an async function returns, early return does a suspend
   (in IrInstructionReturnBegin) before copying
   the error return trace data, result, and running the defers.
   After the last defer runs, the frame will no longer be accessed.
 * proper acquire/release atomic ordering attributes in async functions.

```

## Parents

- [20f63e588e62c4a7250bc96c9e5b54c8106ad1af](https://git.cafe/gitcafe/zig/commit/20f63e588e62c4a7250bc96c9e5b54c8106ad1af?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zig/tree/400500a3afafca8178f13a7e4e1cd0ae7808aff2?format=markdown)
