---
date: 2025-05-06
url: https://hackmd.io/az893wfQSMGCrV6Pc4JmgA
---
# Libs-API Meeting 2025-05-06
###### tags: `Libs Meetings` `Minutes`
**Meeting Link**: https://meet.jit.si/rust-libs-meeting-crxoz2at8hiccp7b3ixf89qgxfymlbwr
**Attendees**: Amanieu, David, Josh Triplett, Mara, The 8472, TC, Sarah Quiñones, martinomburajr
## Agenda
- Triage
- Anything else?
## Triage
### FCPs
17 rust-lang/rust T-libs-api FCPs
- merge rust.tf/80437 *Tracking Issue for \`box\_into\_inner\`* - (1 checkboxes left)
- merge rust.tf/138498 *Implement Deref\<Target=ByteStr\> for CStr* - (3 checkboxes left)
- merge rust.tf/106418 *Implement \`PartialOrd\` and \`Ord\` for \`Discriminant\`* - (2 checkboxes left)
- merge rust.tf/130823 *Tracking Issue for \`non\_null\_from\_ref\`* - (3 checkboxes left)
- merge rust.tf/122661 *Change the desugaring of \`assert!\` for better error output* - (3 checkboxes left)
- merge rust.tf/137992 *Stabilise \`os\_string\_pathbuf\_leak\`* - (4 checkboxes left)
- merge rust.tf/115585 *Tracking issue for \`cfg\_match\`* - (2 checkboxes left)
- merge rust.tf/138016 *Added \`Clone\` implementation for \`ChunkBy\`* - (3 checkboxes left)
- merge rust.tf/111137 *Tracking Issue for AVX512 intrinsics* - (3 checkboxes left)
- merge rust.tf/139087 *Fallback \`{float}\` to \`f32\` when \`f32: From\<{float}\>\` and add \`impl From\<f16\> for f32\`* - (8 checkboxes left)
- merge rust.tf/129121 *Stabilize \`tcp\_quickack\`* - (3 checkboxes left)
- merge rust.tf/129333 *Tracking Issue for \`lazy\_get\`* - (3 checkboxes left)
- merge rust.tf/138023 *Add \`std::io::Seek\` instance for \`std::io::Take\`* - (3 checkboxes left)
- merge rust.tf/138879 *Ensure non\-empty buffers for large vectored I/O* - (5 checkboxes left)
- merge rust.tf/139916 *make std::intrinsics functions actually be intrinsics* - (3 checkboxes left)
- merge rust.tf/131719 *Tracking Issue for \`const\_eq\_ignore\_ascii\_case\`* - (4 checkboxes left)
- merge rust.tf/137268 *Allow comparisons between \`CStr\`, \`CString\`, and \`Cow\<CStr\>\`.* - (3 checkboxes left)
[compiler-errors (1)](https://rfcbot.rs/fcp/compiler-errors), [dtolnay (3)](https://rfcbot.rs/fcp/dtolnay), [spastorino (1)](https://rfcbot.rs/fcp/spastorino), [scottmcm (1)](https://rfcbot.rs/fcp/scottmcm), [joshtriplett (9)](https://rfcbot.rs/fcp/joshtriplett), [m-ou-se (11)](https://rfcbot.rs/fcp/m-ou-se), [BurntSushi (15)](https://rfcbot.rs/fcp/BurntSushi), [jackh726 (1)](https://rfcbot.rs/fcp/jackh726), [nikomatsakis (2)](https://rfcbot.rs/fcp/nikomatsakis), [the8472 (1)](https://rfcbot.rs/fcp/the8472), [Amanieu (10)](https://rfcbot.rs/fcp/Amanieu), [thomcc (1)](https://rfcbot.rs/fcp/thomcc)
### (nominated) rust.tf/libs383 *Add \`FRAC\_1\_SQRT\_2PI\` constant*
C and C++ don't have this, but this is a useful constant.
Mara: I'm a big tau fan, but `2pi` makes more sense as this is how most people will know this constant.
ACP accepted for the `2pi` name.
### (nominated) rust.tf/115585 *Tracking issue for \`cfg\_match\`*
JoshT: Open question is if this should be 'exhaustive'.
JoshT: We can't really compute that, but we can require a `_ => {}` case.
TC: Happy with the `cfg_match` name (instead of `cfg_if`), but then we should give it a 'match' flavor.
Amanieu: How can we force exhaustiveness?
TC: Just throw compiler error when it falls through.
JoshT: Proposal was not to require `_ => {}`, but to be noisy when it falls through.
Amanieu: An implicit `_ => compiler_error!()`
JoshT: I'd advocate for 'compiler_warning' instead.
Amanieu: prefer error
The 8472: if some impl is missing, it'd result in an error anyway.
TC: prefer error
Mara: prefer error
JoshT: mildly prefer warning, would not object to error.
Amanieu: another concern was: maybe this should be a language feature?
JoshT: we shouldn't delay this further
Amanieu: how does this interact with the cfg(true)/cfg(false) rfc?
JoshT: we should support that here too. should support the exact same as cfg()
Mara: You'd have `true =>` and `false =>` which is.. eh. we should maybe lint about that.
JoshT: `&&` and `||` seem fine too.
Amanieu: Don't really mind, but it's looking less and less like `match`..
Amanieu: Bevy is using `switch` as the name..
The 8472: `cases`?
Straw poll:
- `cfg_case!`
- Josh: +0.5
- TC: +0.75
- Amanieu: -0.5 (this is exactly like cfg_switch, but with the other C keyword)
- The 8472: +0
- Mara: -0.5
- `cfg_cases!`
- The 8472: +0.75
- Amanieu: -0.5
- Mara: -0.5
- `cfg_cond!`
- TC +1.
- Amanieu: +0.75
- Josh: +0.5
- The 8472: -0
- Mara: -0.5
- `cfg_many!`
- Josh: -0.5 (agree with Mara's objection)
- TC: +0
- Mara: -1 (it picks exactly one, that's the opposite of 'many')
- Amanieu: -0.5
- `cfg_match!`
- Josh: +1
- David: +1
- TC: +0
- The 8472: -0.5
- Amanieu: -0.5
- Mara: +0.5
- `cfg_select!`
- Amanieu: +1
- Josh: +1 (but mild preference for "just ship the `cfg_match!` we have already")
- TC: +0.5
- The 8472: -0.5
- `cfg_cascade!`
- Josh: +0.1
- David: +1
- TC: +0
- The 8472: -0.5
- Amanieu: -0.5
- `cfg_one!`
- Amanieu: -1
- `cfg_first!` (picks the first matching one)
- Amanieu: -1
- The 8472: -1
- `cfg!` (add to existing macro)
- Josh: -0 (would not object)
- Amanieu: -1
- David: +0.5
- Mara: +0.5
- `cfg_if!` (old syntax??)
- Amanieu: +0
- Josh: -1, new syntax is an ergonomic win
- TC: -1
- `cfg_if!` (new syntax)
- Amanieu: +0.5
- TC: -0
- Mara: -0.5, gonna be messy with existing cfg_if in ecosystem
- Josh: -0, annoying for people porting
- `cfgs!`
- Josh: -0.5
Sarah: don't like that cfg_match!() doesn't look like a match: arms are boolean conditions. cfg_if!() looks more like regular rust code.
Amanieu: issue is that `match` is for pattern matching. This has nothing to do with pattern matching.
Mara: I might be more in favor if we wrote `#[cfg(..)] =>` rather than `.. =>`. Clearer that it's the same cfg() syntax.
Sarah: what if we had a `if cfg` block. e.g. `if cfg { any(unix, windows) } { ... } else if cfg { macos } { ... } else { ... }`.
Amanieu: very close to `if cfg!(..)` which is similar but very different.
Sarah: Usually if people write `if cfg!()` they don't want the code to be checked on non-matching platforms.
Sarah: maybe something like `#[cfg_match] if cfg { ... }`
Mara: Attributes on stmts are not yet stable.
Sarah: Close to stabilization, i think
Amanieu: I think it'd be weird for an attribute to change how the language is parsed like that.
JoshT: I think we should be finding a name, not finding a new syntax.
Amanieu: In the future we can easily deprecate the libs feature if there's a language feature to replace it. Like `try!()` and `?`
TC: Back to the syntax bikeshed..
Amanieu: I like `cfg_select` because we are selecting one. `cfg_cond` also fine. Everything else feels random.
TC: I could get behind `cfg_select`. I didn't like this initially for the reasons other people brought up, but I've warmed to it.
JoshT: `match` is a lang feature, but `select` is not. no one will confuse it with the ecosystem `select`s. The 8472: do you object to `select`?
The 8472: Already what tokio uses for futures, for extracting one value. Not a blocking objection though.
TC: Looking at the list above, it seems to come down to `cond` and `select`. Either seems OK. `select` carries some baggage but it is more familiar. `cond` would be new jargon (to Rust) but carries no baggage.
Mara: between those two, `select` is miles better for me: "cond" could mean anything, but "select" is clearer about selecting exactly one case.
Martin: For cond, we have the CondVar type in `std::sync`.
JoshT: Select is a verb. cond, case, etc. are not.
Amanieu: So... consensus on `cfg_select`?
Amanieu: Cancel fcp and restart on new name
TC: Let's include the 'error on no match' in the FCP.
TC: It's pretty bad in expression position. We shouldn't stabilize the `{{}}` syntax; that's weird.
Mara, Josh: Agree on double braces.
JoshT: Happy to stabilize the version for item position first, add expression version later.
JoshT: We should probably apologize as part of the re-FCP. We went from select to match to select.
Mara: Part of the re-fcp was new information: the cfg() syntax RFCs.
TC: For later future work, Sarah raised an interesting point. cfg!() works in static initializer, so is const evaluated. we can pull this into some kind of 'const if' feature.
Sarah: Fine in expression position, but not sure otherwise.
TC: Consensus (proposed) here is that we restart FCP with `cfg_select!` and specifying that:
- If it hits an uncovered case, we trigger a compiler error.
- Removing the double brace expression syntax (we'd prefer it eventually work without that).
We explain to people our updated reasoning, we refile the existing concern about `let`.
TC: Right now it always returns a block. Probably we don't want that. Would we consider it a breaking change to no longer return a block? People could of course tell that in stable code.
Mara: Also because of Rust 2024, a block has different temporary behavior.
Amanieu: I'd be happy to block this until it's turned into a built-in macro.
Josh: Do people have a blocking objection to shipping one that only supports item position?
Mara: That's fine. especially since `{cfg_select!(..)}` just works as expression.
Amanieu: Are we happy requiring the braces on each arm?
Mara: For items, non-braces gets really weird: `_ => struct Item();,` with comma? without comma?
Amanieu: We could have separate macros for items and exprs.
Josh: `cfg_expr!`?
Mara: Let's just ship this aimed at items. We can add more functionality or another macro later.
TC: I'll leave a comment with the outcome here.
### (nominated) rust.tf/129121 *Stabilize \`tcp\_quickack\`*
FCP started.
### (nominated) rust.tf/130703 *Tracking Issue for secure random data generation in \`std\`*
We'll plan to do some design work on this at the all hands.
### (nominated) rust.tf/130994 *Tracking Issue for File lock API*
https://github.com/rust-lang/rust/issues/130994#issuecomment-2849282463
Josh: The new API is not ergonomic.
```rust!
if file.try_lock()?.not_locked() {
println!("Waiting for the lock");
file.lock()?;
}
```
Amanieu: If you call `try_lock` and it fails to acquire the lock, it shouldn't be returning an `Ok(_)` variant. You could be calling `try_lock` because you want to try once and not block, and then bail on any failure.
TC: We could add a convenience method to `io::Result` that would pull out `WouldBlock`. This would be helpful in other cases (as would such a helper for `Interrupted`).
```rust!
if file.try_lock().would_block()? {
// ..
}
```
Amanieu: Maybe we could make a more general method on `Result`.
Amanieu: Or maybe we could have a method that does:
```rust
Result<T, E> -> Result<Result<T, E1>, E2>
```
```rust!
file.try_lock().map_or_else(true, |e| if e.kind() == WouldBlock {
Ok(false)
} else {
Err(e)
})
```
TC: In terms of a generic method on `Result`, I actually this is the one we'd want, if we wanted one:
```rust!
if file.try_lock().try_is_err_and(|e| e.kind() == WouldBlock)? {
// ..
}
```
Code pattern 1: `try_lock()` and bail on error *or* on lock acquisition failure
Code pattern 2: `try_lock()` and bail on errors *except* lock acquisition failure, handle the lock acquisition failure specifically
Amanieu: In conclusion, we'll return an `io::Result<()>`.
Josh: I'll write it up on the issue.
### (nominated) rust.tf/138879 *Ensure non\-empty buffers for large vectored I/O*
FCP started.
### (nominated) rust.tf/139916 *make std::intrinsics functions actually be intrinsics*
FCP started.
### (nominated) rust.tf/140005 *Set MSG\_NOSIGNAL for UnixStream*
We started the proposed FCP after discussion.
### (nominated) rust.tf/140151 *remove intrinsics::drop\_in\_place*
FCP started.
### (waiting on team) rust.tf/136687 *Improve the documentation of \`Display\` and \`FromStr\`, and their interactions*
To be discussed in all-hands.
### (waiting on team) rust.tf/138023 *Add \`std::io::Seek\` instance for \`std::io::Take\`*
FCP started.
### (new change proposal) rust.tf/libs583 *\`Vec::into\_chunks\` to reverse \`Vec::into\_flattened\`*
Just opened, defer to next week.
### (new change proposal) rust.tf/libs582 *std::fs::set\_symlink\_permissions*
### (new change proposal) rust.tf/libs581 *ACP: Positioned reads into uninitialized buffers (\`FileExt::read\_buf\_at\`, ...)*
### (new change proposal) rust.tf/libs580 *ACP: \`ManuallyDrop\<T\>::pinned\_\*\` methods*
This seems OK. ACP accepted.
### (new change proposal) rust.tf/libs579 *ACP: \`Vec::push\_mut\` and \`Vec::insert\_mut\`*
We already had accepted `Vec::push_mut`. We'll accept `Vec::insert_mut` and track them together.
### (new change proposal) rust.tf/libs578 *ACP: hash\_map! macro to create \`HashMap\`s such as \`vec!\`*
Deferred to next meeting
### (new change proposal) rust.tf/libs577 *Option::try\_get\_or\_insert\_with*
### (new change proposal) rust.tf/libs575 *ACP: \`Option::update\_or\_default\`*
### (new change proposal) rust.tf/libs574 *ACP: str::advance\_char*
### (new change proposal) rust.tf/libs573 *ACP: \[perf\] \`proc\-macro\` \`Ident\` should have method \`as\_str\`*
### (stalled change proposal) rust.tf/libs262 *Add infallible variant of RangeFrom::next()*
### (stalled change proposal) rust.tf/libs295 *Create iterator function in std libs: split\_item\_mut()*
### (stalled change proposal) rust.tf/libs449 *ACP: Chars::take\_str*
### (stalled change proposal) rust.tf/libs287 *ACP: Add \`FromByteStr\` trait with blanket impl \`FromStr\`*
### (stalled change proposal) rust.tf/libs296 *ACP: Designing an alternative \`FromStr\`*
### (stalled change proposal) rust.tf/libs455 *slice::Windows::as\_slice*
### (stalled change proposal) rust.tf/libs253 *Provide way to deconstruct std::iter::Rev*
### (stalled change proposal) rust.tf/libs348 *std::os::unix::env::{argc, argv}*
### (stalled change proposal) rust.tf/libs124 *Integrate \`Error\` trait with panic interfaces*
### (stalled change proposal) rust.tf/libs395 *\`impl core::str::Pattern for \[&str; N\]\`*
_Generated by [fully-automatic-rust-libs-team-triage-meeting-agenda-generator](https://github.com/rust-lang/libs-team/tree/main/tools/agenda-generator)_