---
# System prepended metadata

title: WG-async triage meeting 2023-12-18
tags: [triage-meeting, minutes, WG-async]

---

---
title: WG-async triage meeting 2023-12-18
tags: ["WG-async", "triage-meeting", "minutes"]
date: 2023-12-18
discussion: https://rust-lang.zulipchat.com/#narrow/stream/187312-wg-async/topic/Triage.20meeting.202023-12-18
url: https://hackmd.io/NKJ03INgT_Ou-oryLTZnZw
---

# WG-async meeting agenda

- Meeting date: 2023-12-18

## Attendance

- People: TC, eholk, Vincenzo, CE, Yosh

## Meeting roles

- Minutes: TC

## Scheduled meetings

- 2023-12-21: WG-async holiday party

Update these [here](https://github.com/orgs/rust-lang/projects/40/views/1).

## Proposed meetings

None.

Update these [here](https://github.com/orgs/rust-lang/projects/40/views/1).

## Announcements or custom items

### Extending triage meeting to an hour

eholk: We had proposed to extend this to an hour; did we finish that discussion?

TC: We had not, thoughts?

CE: Async conversations proceed more slowly, so it might be easier.  I don't see a problem in extending it.

Vincenzo, eholk, TC: +1.

*Consensus*: Let's extend the meeting to an hour, starting today if required.

### Next triage meeting on the 8th

TC: Our next triage meeting would have been scheduled for the 1st.  Let's push it one week to the 8th.

all: +1.

*Consensus*: We'll next do triage on the 8th.

### Meeting on Thursday the 21st

TC: We had said we'd decide today whether to meet on Thursday.

eholk: Is there a way to do a WG-async holiday party?

TC: I second that.  Let's do a WG-async holiday party on Thursday for those interested.

*Consensus*: We'll meet on Thursday.

## Untriaged issues

### "type inference fails when using `async_fn_in_trait`" rust#108362

**Link:** https://github.com/rust-lang/rust/issues/108362

CE: This may not be possible to fix.

CE: I believe this is due to `.await` desugaring introducing too much indirection.

CE: This is not an `IntoFuture` problem.

CE: To investigate, someone should manually desugar `.await` to see where the ambiguity is originating.

*Consensus*: We'll leave a comment to that effect.

---

After the meeting, CE noticed a flaw in our analysis and posted on the issue.  He plans to investigate further.

### "Support async recursive calls (as long as they have indirection)" rust#117703

**Link:** https://github.com/rust-lang/rust/pull/117703

CE: Nothing to discuss here.

TC: Agreed this is in FCP.  We'll mark as triaged.

*Consensus*: We'll mark this as triaged.

## Nominated RFCs, PRs, and issues

### "Tracking Issue for `task::Waker::noop`" rust#98286

**Link:** https://github.com/rust-lang/rust/issues/98286

In the issue, during our meeting, Yosh proposed:

> Speaking just for myself here: to me this seems generally useful as a utility, somewhat akin to `future::pending` and `iter::empty`. But I wonder whether instead of exposing it as a method on `Waker`, it might make more sense to create a new free function for it? That would place it a bit off the hot path, and more in the utilities section.
>
> This would basically be a shorthand for creating a waker from `Arc` via the `Wake` trait, but minus a bit of overhead when cloning it.

TC: We discussed this on the last call.  eholk had some concerns about this.  It feels like eventually it would be good for WG-async to express a +1 or -1 here.

eholk:

My thinking was, it's currently hard to write a `Waker`. Sometimes I'm tempted to call `poll` on a future directly, but then I have to conjure up a `Waker`. On the other hand, if I'm writing `poll` in the right context (basically inside another `poll`), then I have a `Context` in scope and it's easy to create wakers there.

I guess the worst case is that people start writing inlined `block_on`s instead of using `.await`.

I guess it could also be misused in future combinators. Normally you want to do something with the waker provided to you, but having a `noop` waker could make it easier to just use a noop one, which could lead to not getting awoken because someone forgot to use the parent waker.

I definitely think it has uses!

For the use cases I'm aware of, I think it's not the end of the world to write your own no-op waker. It's easy enough to write yourself, and the extra 5 lines of code gives a chance to pause and think about whether your use is appropriate.

But I could be missing an entire class of use cases that would push me more towards not duplicating this code every time you want it.

The [future docs](https://doc.rust-lang.org/std/future/trait.Future.html) already say:

> When using a future, you generally won’t call poll directly, but instead .await the value.

I don't think "it's hard to use correctly" is a blocker. Rust has lots of hard things.

I think we don't necessarily need a wg-async decision at this point in time. It might be useful to have individual members express their opinions.

*Consensus*: We'll leave this nominated while the members think about this and perhaps discuss their own views in the ticket.

### "Tracking Issue for `Ready::into_inner()`" rust#101196

**Link:** https://github.com/rust-lang/rust/issues/101196

TC: In the last call, eholk, you dropped your concern about this poking through the abstraction.

eholk: @**Michael (compiler-errors) Goulet** persuaded me with the point that we are allowed to do more things when we know more about the underlying type (in this case the fact that we have a `Ready` and not an `impl Future`)

TC: And tmandry dropped his concern about this panicking.

TC: Still, my view is that T-libs-api should consider naming this `unwrap` due to the panicking behavior.  tmandry has expressed he is OK with that name also.  The original author of the PR has also expressed a preference for `unwrap`.

TC: It seems our policy is to do a *de novo* review when adding things from the `futures` crate rather than giving preference to the choices that crate made.

eholk: Calling `unwrap` in code still *feels* sloppy to me, though this feeling is probably outdated by 7 years.

TC: Interesting.  That would actually argue for also having `expect` here.

eholk: The presence of `#[track_caller]` makes `expect` less necessary.  That's why my feeling is probably outdated.

yosh: By comparison:

https://doc.rust-lang.org/std/result/enum.Result.html#method.into_ok

...uses `!` (never) as the `Err` path and never panics.

The method on `Ready` should be called `unwrap`.

I largely consider `Ready` to work as a special-cases alias/variant of `Option`

In `Option` terms the functionality we’re describing really is like `unwrap`

TC: So Yosh agrees with calling this `unwrap`.  Anyone else agree with this as the position of WG-async?

eholk: It sounds like the high order bit of the preference is that we follow existing conventions, and we're arguing based on existing conventions we should call it `unwrap`?

Yosh/TC: Agreed, and that's a good framing.

eholk: +1 on this being the WG-async consensus.

*Consensus*: WG-async would prefer that this be called `Ready::unwrap`.

### "Add support for `for await` loops" rust#118847

**Link:** https://github.com/rust-lang/rust/pull/118847

eholk: I nominated this to make us all aware of the work.

all: Very exciting.

### "Add LocalWaker support" libs-team#191

**Link:** https://github.com/rust-lang/libs-team/issues/191

TC: We expresesd an opinion in favor of allowing experimentation.

TC: If this did proceed to stabilization, would we have any concerns?

Yosh: I'm on board with experimentation, but we should chart out limits.

Yosh: NRC noted that seeing this through may require `LocalFuture`.  Since this PR doesn't do that, it probably has limitations.

eholk: I would expect something like `LocalWaker` to be viral.

Yosh: The motivation mentions a thread-local executor.  That's also an unexplored area.

Yosh: I'd like to see how this interacts with `FuturesUnordered` and `FuturesGroup` (from `futures-concurrency`).

TC: Is the concern the limitations or that it might lead to more `LocalX` types?  And if it did lead to that, would we consider that bad or necessary to address the use cases?

Yosh: That's the important question.

Yosh: This API makes the assumption that `Arc` is always needed.  By not being viral enough, it might keep too much overhead.  At work, we have ulta-high performance networking applications that can't use futures because of the overhead of creating an `Arc` for every future.

Yosh: My view is that we removed the `Send` bound from `Context` not to lock in a decision, but to enable exploration and to leave doors open.

*Consensus*: Let's leave a comment to prompt more discussion of these issues.

(The meeting ended here.)

## WG RFCs, PRs, and issues nominated for T-lang/T-types

### "`.await` does not perform autoref or autoderef" rust#111546

**Link:** https://github.com/rust-lang/rust/issues/111546

## Pending PRs on the WG-async repo

None.

## `S-waiting-on-team`

None.

## Proposed FCPs

**Check your boxes!**

### "Tracking Issue for `Ready::into_inner()`" rust#101196

**Link:** https://github.com/rust-lang/rust/issues/101196

## Active FCPs

### "Support async recursive calls (as long as they have indirection)" rust#117703

**Link:** https://github.com/rust-lang/rust/pull/117703

## P-critical issues

None.

## WG-async work project board

https://github.com/orgs/rust-lang/projects/29/views1/d
