---
# System prepended metadata

title: Triage meeting 2021-06-22
tags: [triage-meeting]

---

---
title: Triage meeting 2021-06-22
tags: triage-meeting
---

# T-lang meeting agenda

* Meeting date: 2021-06-22

## Attendance

* Team members: nikomatsakis, Josh, Felix
* Others: simulacrum, Mara

## Meeting roles

* Action item scribe: simulacrum
* Note-taker: nikomatsakis

## Scheduled meetings

- [Lang team process proposal](https://github.com/rust-lang/lang-team/issues/99) -- June 30

## Action item review

* [Action items list](https://hackmd.io/gstfhtXYTHa3Jv-P_2RK7A)

## Pending lang team project proposals
### "MCP: Allowing the compiler to eagerly drop values" lang-team#86

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

* Still a pending action item

### "negative impls integrated into coherence" lang-team#96

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

### "Trait Upcasting" lang-team#98

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

* `trait Foo: Bar`, `&dyn Foo` -- can't get a `&dyn Bar` without gymnastics
* not subtyping, a coercion
    * adjust vtable from `Foo` to `Bar`
* in the future:
    * if we had `dyn Foo + Bar + Baz`:
        * upcasting to arbitrary subsets `dyn Foo + Baz` would either require a "really wide pointer" or have a lot of subsets
* however we do want to preserve that
    * `&dyn (Foo + Send)` should be upcast-able to
    * `&dyn (Bar + Send)`
* presentation note:
    * `Foo` and `Bar`  change roles in the proposal at some point
* things we are not committing to:
    * layout of vtables, just saying that the compiler is capable of converting in between them
* implementation concern:
    * if we are naive (which we probably will be), size of all vtables will increase (but it could be optimized)
* conclusion:
    * Josh seconded!

## PRs on the lang-team repo
### "Initial draft of copy ergonomics design note" lang-team#62

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

### "Autoref/autoderef for operators" lang-team#63

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

### "Auto trait design note" lang-team#69

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

### "Add design notes for function-type `Default` implementation discussion" lang-team#71

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

### "Add draft of variadic notes" lang-team#76

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


## Proposed FCPs

**Check your boxes!**
### "Calling methods on generic parameters of const fns" rfcs#2632

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

* Niko to take up with oli (acton item)

### "RFC: Add `target` configuration" rfcs#2991

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

* Still open discussion about how the details should work
* Last meeting we said that we wanted a shorthand alternative
* There is a new discussion around target aliases
    * For example, some folks use `x86_64-pc-linux-gnu`, and it'd be nice to be able to use one as an alias for the other
    * For that to work, we would need a concrete answer for how that behaves in Rust
        * We can define an alias and say that "target vendor" always shows up as unknown even if you pass pc
        * Is that also true if you match the whole target string?
* Niko: Feels like scope creep, do we have to decide this now?
* Mark: Kind of true that we don't, but we did have them for a few cycles, for one specific target. But `x86_64-sun-solaris` and `x86_64-pc-solaris`. But it was reverted.
    * Josh: we did that for backwards compatibility after accidentally changing name, right?
    * Mark: Not important
* Mark: Agree that it feels like scope creep, and this feature doesn't do anything different than what we already have available today. Doesn't feel like this RFC is changing anything.
    * We already have the "longhand" form of the variables available today.
    * https://github.com/rust-lang/rust/pull/61761
* We don't need to sort this out *before* accepting this RFC; we just need to commit to deciding that if we add target aliases.
* Conclusion:
    * Niko to drop concern about matching the entire target string
    * Josh will leave his concern in place regarding shorthand until is added
    * Conclusion:
        * We expect the "combined string" to match the behavior of the "longhand" variables.
        * But when we introduce an alias we can decide the specific values of the "longhand" variables at that time.

### "`#[derive(Default)]` on enums with a `#[default]` attribute" rfcs#3107

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

* Forward progress is being made
* Currently in FCP to lang + libs-api
* Action item: lang team members to review

### "Tracking issue for RFC 2523, `#[cfg(version(..))]`" rust#64796

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

* Same as before


## Active FCPs
### "Support forwarding caller location through trait object method call" rust#81360

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

### "negative impls integrated into coherence" lang-team#96

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

Action item: Niko to create charter or whatever :)

## P-critical issues
### "iter::Fuse is unsound with how specialization currently behaves around HRTB fn pointers" rust#85863

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

* Not P-critical for lang, just libs/compiler
* But libs would appreciate help and/or progress

## Nominated RFCs, PRs and issues
### "New RFC: Collection Transmute" rfcs#2756

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

* [Not a lang concern](https://github.com/rust-lang/rfcs/pull/2756#issuecomment-701533414)

### "New trait: core::convert::IntoUnderlying" rfcs#3046

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

* Been discussed async; moving in a slightly different direction
* Instead of `IntoUnderlying`, moving to "as repr", so you can convert to the discriminant type that was declared
* May eventually want lang input on this, take a look at this [summary comment](https://github.com/rust-lang/rust/pull/81642#issuecomment-862673931) and chime in if you have any concerns.

### "RFC: let-else statements" rfcs#3137

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

* :tada: from Josh
* Fallible let binding patterns with a fallback else that must diverge

```rust
let Some(x) = expression else { ... };
```

* Alternatives and things are thoroughly captured
* Felix: In the summary it says "expression" is "expression without block", what does that mean?
    * Josh: We disallow things that take braced blocks, like `if/else`, so that you can't end up with `let Some(x) = if expr { ... } else { ... } else { ... }`
* Niko: Is this referencing the existing nonterminal, the condition of an `if`?
    * Josh: I think so, but confirm.
    * Felix: I'll read the RFC.
* Josh: Anyone see a reason for me not to rfcbot merge this?
    * Mara: I didn't see a reply from Esteban, but he usually has an opinion about what works well for diagnostics.
    * Josh: Let's cc him into the thread.
* Josh: /me types loudly and does rfcbot merge

### "Tracking issue for RFC 2523, `#[cfg(version(..))]`" rust#64796

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

Already discussed

### "Support forwarding caller location through trait object method call" rust#81360

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

Already discussed

### "Allow deriving Into and TryFrom for primitive enums" rust#81642

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

* This is the one that is moving to `AsRepr` instead, likely to proceed

### "Stabilize "RangeFrom" patterns in 1.54" rust#83918

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

* We've discussed this a number of times
* Question is whether there is a conflict between slice patterns and range patterns
* Think it was resolved via Zulip, but was it captured on Github?
* Niko:
    * I believe we decided to keep the patterns embedded
    * But the PR author preferred to keep it unstable and didn't make the change
* Josh: Should we have a direct async conversation to discuss it a bit further?
* Niko: Seems good. In the end this feels like an edge case so I could live with holding it unstable, though I don't think I would want to give up on the natural pattern syntax.

### "Deny float matches" rust#84045

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

* Blocked on structural equality design meeting

### "Add `expr202x` macro pattern" rust#84364

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

* Last time we discussed it, concerns were raised
* [Summary from prior meeting](https://github.com/rust-lang/lang-team/blob/master/minutes/2021-05-11.md#add-expr202x-macro-pattern-rust84364)

### "Allow struct and enum to contain inner attrs" rust#84414

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

dtolnay proposing

```rust
struct Foo {
    #![derive(Foo)]
}
```

* Question:
    * Is this re-adding support or did we never have it? Unclear.
* Current state:
    * modules/extern-blocks/functions since 1.0
    * traits (https://github.com/rust-lang/rust/pull/68728)
    * struct/enum/union foo not supported
* Consistency:
    * Two "groups" of things 
    * Traits have items, like modules etc
* Josh: Exists for modules because there is no way to place things outer, but for struct/enum/union I'd just as soon have people write it on the outside and not have a choice.
    * If this is a thing people *expect* to do, we could add a rustfix to move it.
* Mark: dtolnay's argument is that placing it inside makes sense if it is expanding to the "variants" of a struct (stylistic)
    * petrochenkov doesn't like it
* Mara: this would also apply to putting methods inside structs
    * adding things on the inside into the comma-separated list feels weird
* Josh: I think petrochenkov is saying
    * we support inner attributes on places where items exist
    * match is a funny special case because back-compat
    * https://github.com/rust-lang/rust/pull/84414#issuecomment-826150936
* Niko: I think there's another, more 'syntactic' view that says "any time I'm inside a braced thing, I can put inner attributes there"
* Josh: I think I would explain it as "here is a special case for attaching something to the module that consists of your entire file, ignore the other places that it might work"
* Felix: I'd like to know if the community views things the josh way -- maybe we could have a lint that discourages use of inner attributes except in modules? Or some other way to take temperature?
    * Others: good point! interesting idea.
* Consensus:
    * We shouldn't leave this open
    * Some people have mild preferences one way, some the other
    * Don't have a full quorum for the team here, wait a bit

### "implement `Default` for all arrays" rust#84838

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

* Special lang item to support
    * `impl<T: Default, const N: usize> Default for [T; N]`
    * `impl<T> Default for [T; 0]` -- exists today
* Today we have
    * `impl<T: Default> Default for [T; N]` -- hardcoded from 1..=32
* Josh: Do we support `impl<T> Default for [T]` today (generating an empty slice)?
    * no, because `[T]` is unsized. we don't have `&[T]`/`&mut [T]` impls either though.
* Niko: what it comes down to:
    * In worst case, we are forever committed to having `array_default_hack` and some notion of marker traits. If we're ok with that because this pair of impls is valuable enough (and I may be) then we should just do it.
    * However, the ideal would be that we extend specialization to support this, or perhaps some other mechanism (`where N != 0`).
        * Josh: In theory we could have some kind of "conditional where clause" like `if N != 0 { T: Default }`.
            * Niko: probably equivalent to `where N != 0`.
* Conclusion:
    * fcp merge, Niko to write-up

### "add back support for inner attributes on non-block expressions?" rust#84879

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

* Felix: I believe this is addressed by PR #85193
* Conclusion: Denominate, adequately addressed by #85193.

### "Check for union field accesses in THIR unsafeck" rust#85263

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

### "Fix how allow/warn/deny/forbid `warnings` is handled" rust#85298

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

### "Stabilize bindings_after_at" rust#85305

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

### "Stabilize `const_fn_transmute`, `const_fn_union`" rust#85769

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

### "Associated functions that contain extern indicator or have `#[rustc_std_internal_symbol]` are reachable" rust#86492

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


