---
title: Triage meeting 2022-09-27
tags: triage-meeting
---
# T-lang meeting agenda
* Meeting date: 2022-09-27
## Attendance
* Team members: Josh, Felix
* Others: dtolnay, Lokathor
## Meeting roles
* Action item scribe: Felix
* Note-taker: Felix
## Scheduled meetings
- Provenance meeting October 5
- Planning either September 28 or October 12
## Announcements or custom items
(Meeting attendees, feel free to add items here!)
## Action item review
* [Action items list](https://hackmd.io/gstfhtXYTHa3Jv-P_2RK7A)
## Pending lang team project proposals
### "Support platforms with size_t != uintptr_t" lang-team#125
**Link:** https://github.com/rust-lang/lang-team/issues/125
### "Positional Associated Types" lang-team#126
**Link:** https://github.com/rust-lang/lang-team/issues/126
### "Interoperability With C++ Destruction Order" lang-team#135
**Link:** https://github.com/rust-lang/lang-team/issues/135
### "allow construction of non-exhaustive structs when using functional update syntax" lang-team#143
**Link:** https://github.com/rust-lang/lang-team/issues/143
### "Async fns in traits" lang-team#150
**Link:** https://github.com/rust-lang/lang-team/issues/150
### "dyn* trait" lang-team#158
**Link:** https://github.com/rust-lang/lang-team/issues/158
### "Initiative: `?` traits, `try` blocks, `yeet` exprs, oh my" lang-team#160
**Link:** https://github.com/rust-lang/lang-team/issues/160
### "Initiative: Ghost types and blocks" lang-team#161
**Link:** https://github.com/rust-lang/lang-team/issues/161
### "Keyword generics" lang-team#162
**Link:** https://github.com/rust-lang/lang-team/issues/162
### "Add const evaluatable `where const { <block> }`" lang-team#163
**Link:** https://github.com/rust-lang/lang-team/issues/163
### "#[repr(Interoperable_2024)]" lang-team#165
**Link:** https://github.com/rust-lang/lang-team/issues/165
### "add `#[never_call]` attribute" lang-team#170
**Link:** https://github.com/rust-lang/lang-team/issues/170
## PRs on the lang-team repo
### "Note design constraints on hypothetical `DynSized`" lang-team#166
**Link:** https://github.com/rust-lang/lang-team/pull/166
### "replace initiatives with a newer, lighterweight process" lang-team#173
**Link:** https://github.com/rust-lang/lang-team/pull/173
### "Document membership criteria and expectations" lang-team#174
**Link:** https://github.com/rust-lang/lang-team/pull/174
## RFCs waiting to be merged
None.
## Proposed FCPs
**Check your boxes!**
### "Stop using `Reveal::All` before borrowck" rust#101478
- **Link:** https://github.com/rust-lang/rust/pull/101478
- [**Tracking Comment**](https://github.com/rust-lang/rust/pull/101478#issuecomment-1249693297):
> Team member @lcnr has proposed to merge this. The next step is review by the rest of the tagged team members:
>
> * [x] @compiler-errors
> * [ ] @cramertj
> * [ ] @jackh726
> * [ ] @joshtriplett
> * [x] @lcnr
> * [ ] @nikomatsakis
> * [ ] @oli-obk
> * [ ] @pnkfelix
> * [ ] @scottmcm
> * [ ] @spastorino
>
> No concerns currently listed.
>
> Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!
>
> See [this document](https://github.com/rust-lang/rfcbot-rs/blob/master/README.md) for info about what commands tagged team members can give me.
- [**Initiating Comment**](https://github.com/rust-lang/rust/pull/101478#issuecomment-1249693270):
> I lowered some of the changes to a future compat lint which should hopefully allow us to merge this PR quickly without figuring out our exact goals for opaque types.
>
> ---
>
> This pull request changes the compiler to stop using `Reveal::All` at any point until `borrowck` is completed. Using `Reveal::All` means that it is possible to inspect
> - the underlying type of opaque types
> - the value of a "defaulted" associated item (requires `feature(specialization)`)
>
> In cases where this is known to break existing code, we retry the failing code with `Reveal::All`, emitting a future compatibility lint in case that succeeds. The cases where we emit a future compatibility lint are const evaluation for type system constants and `transmute` checking. **We currently do not retry for patterns, this is a breaking change, even if not discovered using crater.** See `in-ctfe/match-arm-exhaustive.rs` for an example. In case this causes an actual regression, we could extend the future compatibility lint to this area as well.
>
> This PR is necessary as using `Reveal::All` before `borrowck` is incorrect and blocks work on implied bounds. Even if we want to fully embrace opaque types in these places - which is not trivial, see https://github.com/rust-lang/rust/pull/101478#issuecomment-1246610070, the approach then should not use `Reveal::All`. So even then, this PR will be "correct". I do not want to wait with my implied bounds work until this is figured out.
>
>
>
> A crater run found 2 impacted crates:
>
> ## [`mijit`](https://github.com/apt1002/mijit/)
>
> Transmute in a test between an opaque type and the underlying concrete type. Opened PR fixing this in https://github.com/apt1002/mijit/pull/51.
>
> ## [`name-it`](https://github.com/GoldsteinE/name-it)
>
> This crate cannot really be fixed to avoid the lint, as it [fundamentally requires this pattern](https://github.com/GoldsteinE/name-it/blob/47544a062a950279fc49c8c3832b7b8e13febb8d/src/lib.rs#L104-L114):
> ```rust
> use std::mem;
> fn returns_opaque() -> impl Sized {
> 0u8
> }
>
> struct NamedOpaqueType {
> data: [mem::MaybeUninit\<u8\>; size_of_fut(returns_opaque)]
> }
>
> const fn size_of_fut\<FUT\>(x: fn() -> FUT) -> usize {
> mem::size_of::\<FUT\>()
> }
> ```
> @rfcbot fcp merge
### "replace initiatives with a newer, lighterweight process" lang-team#173
- **Link:** https://github.com/rust-lang/lang-team/pull/173
- [**Tracking Comment**](https://github.com/rust-lang/lang-team/pull/173#issuecomment-1256506373):
> Team member @nikomatsakis has proposed to merge this. The next step is review by the rest of the tagged team members:
>
> * [ ] @cramertj
> * [ ] @joshtriplett
> * [x] @nikomatsakis
> * [ ] @pnkfelix
> * [ ] @scottmcm
>
> No concerns currently listed.
>
> Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!
>
> See [this document](https://github.com/rust-lang/rfcbot-rs/blob/master/README.md) for info about what commands tagged team members can give me.
- [**Initiating Comment**](https://github.com/rust-lang/lang-team/pull/173#issuecomment-1256501398):
> @rfcbot fcp merge
>
> I'd like to get folks to review this and agree to it. We discussed it some in the meeting, and I don't think I really deviated from that, but nonetheless.
### "Document membership criteria and expectations" lang-team#174
- **Link:** https://github.com/rust-lang/lang-team/pull/174
- [**Tracking Comment**](https://github.com/rust-lang/lang-team/pull/174#issuecomment-1256506230):
> Team member @nikomatsakis has proposed to merge this. The next step is review by the rest of the tagged team members:
>
> * [ ] @cramertj
> * [ ] @joshtriplett
> * [x] @nikomatsakis
> * [ ] @pnkfelix
> * [ ] @scottmcm
>
> No concerns currently listed.
>
> Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!
>
> See [this document](https://github.com/rust-lang/rfcbot-rs/blob/master/README.md) for info about what commands tagged team members can give me.
- [**Initiating Comment**](https://github.com/rust-lang/lang-team/pull/174#issuecomment-1256499859):
> @rfcbot fcp merge
>
> I think this is largely documenting existing practice, but I've also made a few changes (e.g., suggesting a brief write-up for a proposed new member). I'd like to get people to review and agree to the plans formally.
## Active FCPs
### "Tracking Issue for asm_sym" rust#93333
**Link:** https://github.com/rust-lang/rust/issues/93333
### "Allow transmutes between the same types after erasing lifetimes" rust#101520
**Link:** https://github.com/rust-lang/rust/pull/101520
### "Positional Associated Types" lang-team#126
**Link:** https://github.com/rust-lang/lang-team/issues/126
### "Interoperability With C++ Destruction Order" lang-team#135
**Link:** https://github.com/rust-lang/lang-team/issues/135
### "allow construction of non-exhaustive structs when using functional update syntax" lang-team#143
**Link:** https://github.com/rust-lang/lang-team/issues/143
### "Async fns in traits" lang-team#150
**Link:** https://github.com/rust-lang/lang-team/issues/150
### "Initiative: `?` traits, `try` blocks, `yeet` exprs, oh my" lang-team#160
**Link:** https://github.com/rust-lang/lang-team/issues/160
### "Initiative: Ghost types and blocks" lang-team#161
**Link:** https://github.com/rust-lang/lang-team/issues/161
### "Keyword generics" lang-team#162
**Link:** https://github.com/rust-lang/lang-team/issues/162
## P-critical issues
None.
## Nominated RFCs, PRs and issues discussed this meeting
### "Document `label_break_value` in the reference" reference#1263
**Link:** https://github.com/rust-lang/reference/pull/1263
* (discussed amongst Josh + Felix: suggested change is about content presentation, not about a semantic change to the language itself. It is also readily revertible. thus does not need to go through a "heavy-weight" process like FCP merge for approval.)
### "Constify `Location` methods" rust#101030
**Link:** https://github.com/rust-lang/rust/pull/101030
* should we delegate decision here to wg-const?
* scott's concern: seems like it might enable one to observe things like filename at compile-time.
* josh: wouldn't that be blocked on nightly features?
* dtolnay: there are other functions that may well become const fn that would enable that logic. Or just put `#[track_caller]` on another const fn that you define.
(specifically https://doc.rust-lang.org/nightly/std/panic/struct.Location.html#method.caller)
* scott: The scary part for me is `const { assert!(location.line(), 10) };`
* josh: sure, but you can shoot yourself in foot in lots of ways. Can already do that at runtime too.
* scott: seems like different category, to have a runtime error vs a compile-time error.
* felix: my concern is more about developers assuming these values will be "reasonable", when the original intention was that `Location` information is for debugging, and could well imagine swapping in dummy values for file names and line/column numbers.
* josh: could indeed imagine a compilation mode that swaps in such dummy values...
* josh: for short term: Would documenting that "these values are solely for debugging and should not be relied on for program logic", but without adding a mode to *enable* that (e.g. something that swaps in dummy values); would that suffice here? Or do we need the latter?
* scott: the argument you can already shoot self in foot at runtime resonates. but I want to ask: when *do* you want to actually use this during const-eval? (in the sense of the specific values, rather than, say, a `{:?}` to show someone).
* josh: presumably for embedding source info for developer feedback
* josh: this feature strikes me as in the category as "both useful and easily misused"
* lokathor: The docs themselves say that the location info is about the location of a panic, which is itself not entirely correct.
* josh: Anyone up for doing some documentation work here? Scott?
* scott: sure.
* josh: does this deserve actual lang FCP, or just some lang review and libs-api FCP?
* scott: this is const unstable, so we can just merge the PR, we don't need to go through those layers.
### "Constify `TypeId` ordering impls" rust#101698
**Link:** https://github.com/rust-lang/rust/pull/101698
* josh: similar to aforementioned topic: Powerful and easily misused.
* josh: What is motivation?
* scott: people were trying to transmute TypeIds to u64 precisely to be able to sort them.
* josh: ah
* scott: note that the hashes and string names here are available at const-eval, though the memory addresess are not available.
* scott: There are plans/ideas for changing representation of TypeId to, instead of being 128-bit, make it some inline hash bits plus a pointer to something out-of-line.
* josh: that would definitely make *this* not work.
* scott: compilation units can already have different memory addresses, which means this already needs to be a fast-accept for same address but *not* fast-reject for differing addresses.
* scott: But you still cannot compare the address since its the address of a const...
* scott: in any case you cannot e.g. rely on linker to intern all the possible objects here, so you *have* to handle the different addresses case via the expensive traversal.
* josh: why isn't the 128 bits representation enough here?
* (accidental vs adversarial questions re what is the threat model)
* josh: how is this used? For debugging?
* scott: its used in Any. Downcasting.
* lokathor: on most Tier-1 platforms, 256 bits "isn't that bad"
* josh: Const-ifying this one is different from Location, because doing so may close off implementation possibilities (w.r.t. the aforementioned use of memory addresses for fast accept)
* scott: Another concern I have here is what *is* "ordering" supposed to mean. E.g. can one assume that the type-id of `u32` will always be less than the type-id of `u64`? Or is this just enough to order for a data structure.
* josh: Even ignoring Ord and just look at Eq, two types that are the same must have equal TypeId, and type types that are not the same must have non-equal TypeId.
* josh: That seems like relevant decision criteria here.
* josh: namely it will outlaw certain implementation options
* felix: does it? What if we had a way to specialize on `const`/non-`const`, and leveraged that to provide differing implementations depending on which context we are in?
* scott/josh: We ... could ... (even going so far as to have differing structural representations at const-eval vs runtime)
* josh: scary though
* josh: or we could have TypeId be the thing that is committed to the variant that could not be optimally designed for runtime performance, and people would have to add a separate FastTypeId that you could always convert TypeId to.
* josh/scott: This is const unstable, so we could for now say that that we are approving this, while also updating the tracking issue with a unresolved question describing the potential one-way door here that rules out certain TypeId implementations.
* josh: does anybody feel like this should not go in, even unstable? or should the associated feature gate be marked as "experimental"?
* scott: probably not. and I don't know if you can do that for library features anyway.
* josh: can anyone follow up with a comment to the above effect?
* scott: I can do that, it aligned with the other thing I'm following up on.
* ...
* scott: related note, do we have any plan in place for avoiding having to re-derive every trait in the standard library?
* josh: there's some idea of doing an opt-in e.g. `#[derive(PartialEq(const))]` or `#[derive(const PartialEq)]` that would provide the const-derived form.
* scott: so someone should try to propose a policy such that we stop ripping out the derives (replacing them with ugly manual impls that have the constified forms), and instead work on providing whatever the above feature is..
* lokathor: I can help! (e.g. proposing something)
* scott: ideally it would follow Niko's new proposal that is meant to make initiatives lighter weight.
* lokathor: BTW, is there an inclination one way or the other re the bikeshed `#[derive(const Trait)]` vs `#[derive(Trait(const)]`
* (people provide reasons in both directions, and Felix thinks he hears scott suggest a third alternative, `#[const_derive(Trait, ...)]` ...! (to avoid repeating the word "derive" ad nauseum for N traits))
* [Zulip Thread](https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/Request.20For.20Bikeshed.3A.20Deriving.20Const.20Trait.20Impls) for discussion
### "make const_err a hard error" rust#102091
**Link:** https://github.com/rust-lang/rust/pull/102091
* josh: advantage of switching this from future-incompat lint to hard error, is that it will enable removing the effectvely dead-code.
* josh: definitely needs an FCP, as well as a crater run (where the latter has already been done and reviewed by RalfJ).
* josh: any objection to starting FCP and handling rest asynchronously?
* scott: go for it.
* josh: okay. done. Boxes ready for checking.
### "Inference failure with `type_changing_struct_update`" rust#101970
**Link:** https://github.com/rust-lang/rust/issues/101970
* scott: This is a "we need a plan" kind of thing. We cannot cover it in remainder of this meeting.
## Nominated RFCs, PRs and issues NOT discussed this meeting
### "impl DispatchFromDyn for Cell and UnsafeCell" rust#97373
**Link:** https://github.com/rust-lang/rust/pull/97373
### "Introduce a no-op FakeRead for `let _ =`." rust#102256
**Link:** https://github.com/rust-lang/rust/pull/102256