---
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