Rust Lang Team
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
      • Invitee
    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Sharing URL Help
Menu
Options
Versions and GitHub Sync Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
Invitee
Publish Note

Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

Your note will be visible on your profile and discoverable by anyone.
Your note is now live.
This note is visible on your profile and discoverable online.
Everyone on the web can find and read all notes of this public team.
See published notes
Unpublish note
Please check the box to agree to the Community Guidelines.
View profile
Engagement control
Commenting
Permission
Disabled Forbidden Owners Signed-in users Everyone
Enable
Permission
  • Forbidden
  • Owners
  • Signed-in users
  • Everyone
Suggest edit
Permission
Disabled Forbidden Owners Signed-in users Everyone
Enable
Permission
  • Forbidden
  • Owners
  • Signed-in users
Emoji Reply
Enable
Import from Dropbox Google Drive Gist Clipboard
   owned this note    owned this note      
Published Linked with GitHub
Subscribed
  • Any changes
    Be notified of any changes
  • Mention me
    Be notified of mention me
  • Unsubscribe
Subscribe
--- title: Triage meeting 2025-06-11 tags: ["T-lang", "triage-meeting", "minutes"] date: 2025-06-11 discussion: https://rust-lang.zulipchat.com/#narrow/channel/410673-t-lang.2Fmeetings/topic/Triage.20meeting.202025-06-11/ url: https://hackmd.io/GeghimpLSnexRr5JflEFmQ --- # T-lang meeting agenda - Meeting date: 2025-06-11 ## Attendance - People: Mara, Xiang, Tyler Mandry, nikomatsakis, TC, JoshT, Taylor, Martin (@martinomburajr), scottmcm ## Meeting roles - Driver: TC - Minutes: Tomas Sedovic ## Scheduled meetings - 2025-06-11: "Design meeting: Implementable trait aliases" [#322](https://github.com/rust-lang/lang-team/issues/322) - 2025-06-18: "Design meeting: "Marker effects"" [#317](https://github.com/rust-lang/lang-team/issues/317) - 2025-06-25: "Design meeting: Rust issues encountered by new Rust users in the Bevy project" [#229](https://github.com/rust-lang/lang-team/issues/229) - Tomas will follow-up with Jubilee and make sure the right people are invited to Zulip and the meeting - 2025-07-02: "Design meeting: `#[align(..)]`" [#327](https://github.com/rust-lang/lang-team/issues/327) - Canceled; this is now in FCP. - 2025-07-09: "Design meeting: Declarative (`macro_rules!`) attributes and derives" [#331](https://github.com/rust-lang/lang-team/issues/331) - Canceled; this is now in FCP. - 2025-07-23: "Design meeting: Solution for `NoCell` and `no_std`" [#324](https://github.com/rust-lang/lang-team/issues/324) - 2025-07-30: "Design meeting: In-place Initialization" [#332](https://github.com/rust-lang/lang-team/issues/332) Edit the schedule here: https://github.com/orgs/rust-lang/projects/31/views/7. ## Announcements or custom items (Meeting attendees, feel free to add items here!) TC: Joined the Foundation call, substituted Santiago. Got briefed, gave extensive project update. Talked about the All Hands, what we're doing with the PM program. Tomas did things we got to talk about (e.g. the compile-ops blog that Antonio wrote). Talked about the travel grant program, project goals -- the Foundation people were missing context about that. Companies investing in Rust, the Vision Doc work, funding situation and what we're trying to achieve on the council side: prioritising working with the Foundation on the Project Priorities budget and travel grants. Tyler: You said you were going to prioritised the budget for travel grants and Antonio's position? TC: When Microsoft gave us $1M we dedicated $600k to fund the travel grants program, all hands, funding Antonio's position. All that will be gone by the end of 2025. From the Council side we've agreed to speak in the Project voice to the Foundation to prioritise getting the budget for 2026. TC: RfL meeting is next week. ### Guest attendee items TC: For any guests who are present, please note in this section if you're attending for the purposes of any items on (or off) the agenda in particular. ### Moving right along TC: As we've been doing recently, due to the impressive backlog, I'm going to push the pace a bit. If it's ever too fast or you need a moment before we move on, please raise a hand and we'll pause. ### Design meeting at 12:30 EST / 09:30 PST / 17:30 CET TC: Remember that we have a design/planning meeting that starts half an hour after this call ends. ### Next meeting with RfL We're next meeting with RfL on 2025-04-23 to review the status of RfL project goals. https://github.com/rust-lang/rfcs/pull/3614 ## Rust 2025 review ### Meta TC: We should start thinking about Rust 2025. Our motivating priorities are: - Make every edition a success. - Do so without requiring heroics from anyone. - ...or stressing anyone or everyone out. The tentative timeline will be: | Date | Version | Edition stage | |------------|---------------|--------------------------------| | 2025-04-03 | Release v1.86 | Checking off items... | | 2025-05-15 | Release v1.87 | Checking off items... | | 2025-06-26 | Release v1.88 | Checking off items... | | 2025-08-07 | Release v1.89 | Checking off items... | | 2025-09-12 | Branch v1.91 | Go / no go on all items | | 2025-09-18 | Release v1.90 | | | 2025-10-24 | Branch v1.92 | Stabilize Rust 2025 on nightly | | 2025-10-30 | Release v1.91 | Rust 2025 nightly beta | | 2025-12-05 | Branch v1.93 | Cut Rust 2025 to beta | | 2025-12-11 | Release v1.92 | Announce Rust 2025 is pending | | 2026-01-22 | Release v1.93 | Release Rust 2025 | None. ## Nominated RFCs, PRs, and issues ### "Specify that "option-like" enums must be `#[repr(Rust)]` to be ABI-compatible with their non-1ZST field." rust#141947 **Link:** https://github.com/rust-lang/rust/pull/141947 Niko: Ship it. TC: Any thoughts on Jubilee's review question on align? Tyler: Is the question "if you specify align and it's the exact alignment that we'd do anyway than you'd lose the guarantee" Josh: That appears to be the question. Jubilee says "we could do this, but here are reasons why we shouldn't". I agree. TC: Specifically this applies to alignments other than align(1) which doesn't have this problem. ### "Reject unsupported `extern "{abi}"`s consistently in all positions" rust#142134 **Link:** https://github.com/rust-lang/rust/pull/142134 Niko: This is the logical conclusion of a decision we made. Josh: We made a decision to have a future compat warning and this is making it into an error. There was a crater one and analysis 3 days ago. Niko: Looks like it has fairly minimal impact. TC: Are we linting in dev? Josh: Sounds like we are, yes. TC: Since #135767 (https://github.com/rust-lang/rust/pull/135767) Josh: It sounds like there was one corner case: functions in traits that have ABI attached that were'n previously being linted. But crater didn't any hits for this. Do we trust these reports from crater or are we concerned about the iceberg that crater doesn't see and do another lint and wait andfor results from that? I think we should go ahead based on the 0 crater hits. Tyler: Ralf also made the point that crater only builds for linux so we're missing target-specific behaviour. Tyler: I think the minimal breakage and FCW together are enough justification to ship this. If the edge cases being added to this PR aren't showing up in crater at all it seems like the impact will be fairly small. TC: FCW now refers to two separate things now -- lint in deps and ??. We should split them to two lints. Tyler: I'm okay with landing this and if someone complaints, we can roll back. No breakage in crater on the new things. On the old things we've already put the PRs up. TC: I'll fire the FCP. Checkboxes are up. ### "Stabilize the `breakpoint` function" rust#142325 **Link:** https://github.com/rust-lang/rust/pull/142325 TC: Comes to us from libs api. Add a breakpoint that traps. Unlike normal abort it doesn't return never. The debugging can hook into it. Did I get that right? Josh: This is a wrapper around the breakpoint intrinsic (wrapper to provide stable interface). Why we're nominating this in lang: we're exposing a new intrinsic that wasn't exposed before. scottmcm: Mostly bringing up what Ralf was: if we stabilise this without a lint, we need to specify the semantics. Josh: Trying to figure out how to explain the semantics has been interestic. The semantics are documented, just not in the way Ralf recognises. Tyler: Where are they specified? Josh: Description in the doc comment and description in the ACP. Tyler: The semantics described aren't obviously the thing we want. If I call this and there's no debugger attached, the fact that it effectively aborts the program doesn't seem obvious to me. Josh: There seem to be folk who think obviously you only want to operate on this only if there's a debugger and others saying "obviously you want to specify the breakpoint". Maybe you want to do a "break if debugger attached" but that's OS specific. Emitting the "breakpoint" instruction that's portable. The higher level operation is easy enough to build on top (and we may want to add it too). We'll still need the lower-level one. Tyler: I think that's a logical explanation. In terms of process, which team is supposed to be reviewing which part of this? TC: Libs API already accepted wanting to expose this. On our side: FCP is about exposing this new intrinsic. scottmcm: I was surprised by the behaviour of this but I'm totally fine to note the default trapping. It's about what do we write in our spec. What does it mean to call this in the language running on the abstract machine. Josh: The only part that's intended as a semantic guarantee is: it can't be implemented as a no-op, it must be implemented as an abort. Other than that, the exact mechanism you generate is subject to implementation. TC: Proposed FCP, checkboxes are up. Niko: I think this is good. The intention of the semantics is adequately clear in my opinion. Niko: Not continuing executing isn't imply UB, right? Josh: Yes, not UB. This aborts the program unless you do something unusual (which attaching a debugger counts as). Once you attach a debugger you're in the same realm as poking around in `/proc/mem`. Josh: I'll respond to @hanna-kruppe's comment. Josh: The intention is: it's not a "no return" function -- due to the debugger. TC: Ralf isn't going to like answers if programs depend on external factors. You have to explicitly state that after the breakpoint things will be nondetermenistic. Niko: Should this be unsafe? And/or UB? Josh: I don't think it should be UB. I think this is closer to "unspeficied" not "undefined". Taylor: It's implementation defined. Josh: I think it'd be wildly less useful by having to wrapping it in an unsafe block (and possibly having to put a safety comment). Semantically speaking I'm not sure what the proof burden is. Taylor: Niko can you clarify why the it should be UB/unsafe? It's not illegal/undefined. Just an implementation detail. Niko: That means you can't prove much for the safety. Josh: For the purposes of proving whether this is correct or not: you flip a coin and if it's heads, it's "abort". scottmcm: On x86 this will be: call this specific interrupt (which isn't undefined). At the higher level I agree with Josh. It's like call abort (a lot of platforms would allow me to attach a debugger on abort). Niko: Do we want a warning? You don't want this in your code under normal circumstances. Josh: Because you shouldn't ship a code with breakpoint in it? Josh: I feel this is on the level of a clippy restriction that you'd turn on in CI but not locally. scottmcm: If it returned "never" you'd still be able to attach a debugger. Niko: _regrets having raised it_ scottmcm: The semantic should be treated as a `volatile`. Taylor: There's a lot of things that'll happen in practice that we don't want to spacify here like memory operations reordering. scottmcm: But I think that's exactly waht we should be defining though. Taylor: But that's the same as adding a `println!`. scottmcm: But if you're using this in a debugging ?? Taylor: I think that's why the implementation should do a specific thing but that we shouldn't be specifying. Taylor: There's a separate question about how it works vs. what we should guarantee. Josh: From an implementation perspective we probably should have a compiler barrier before and after. Tyler: hanna has questions about whether implying "always do nothing" is a valid implementation. Niko: Her comment is correct, that's what we said in this meeting. No-op should be a correct implementation. Mara: The reason we're putting it core::arch module is that we're writing inline assembly that's slightly more portable. Josh: A part of big discussion why we didn't put it in core::hint because that could be ignored. scottmcm: Do we have any examples on how it's used? If you're returning `()` you can't put this in `_` arm. What happens when you call this in such an arm: do you have to abort after it? TC: I think the right way of saying this from the language level is it's implementation defined. Including this as a no-op. Josh: I don't think it's correct you can replace this with a no-op. That would mean you could proceed onward without an attached debugger. TC + Niko: So what? We won't likely ever do that, but we could. Mara: You could similarly just sleep for five seconds. Josh: You can prove things about the program in the world where the program hits a breakpoint and aborts. If you attach a debugger, the spec can say here be dragons. Niko: The debugger is neither here nore there. I imagine you can have a platform where there's no debugger and it'll be a no op and that's fine. TC: I think it'd be great if we had a `-Z` option that would conver to no-op. Mara: This one is in arch, basically just a one-line assembly. Niko: That's one line is defined on the target. It could just be a nop line. Josh: For the purposes of spec, a long time ago we wrote a long list of things that you could do where all bets are off. Where you interracted with the outside world and we can't guarentee you didn't do anything that would change the behaviour. We should add attaching a debugger there. scottmcm: If that's where we're leaning on, then we should return `!`. Josh: If you have a function that returns `!` the compiler could throw away the rest of the code (you're interested in debugging). Niko: We might want to say: attaching a debugger (changing memory etc.) is UB. But that's not quite the right thing here -- we don't instantly go UB right after attaching a debugger -- we still want to behave normally (as much as possible). TC: From the lang point of view we're not even thinking about the debugger -- that's like opening mem in hex editor. Niko: The only reason I'm poking here is I want to move to a process where we have spec text before we stabilize. Josh: Can we have another conversation on the spec side of things? TC: We should file a concern? If we can't agree on the no-op thing? Taylor: Can we just not specify the behaviour and let the implementation to do the right thing? TC: But underspecifying implies it could be a no-op. Taylor: True but no-one will implement it as no-op. (The meeting ended here.) --- ### "RFC: enable `derive(From)` for single-field structs" rfcs#3809 **Link:** https://github.com/rust-lang/rfcs/pull/3809 ### "Permit attributes on `use` items" rust#141704 **Link:** https://github.com/rust-lang/rust/issues/141704 ### "Should a `[..]` slice pattern constitute a discriminant read" rust#141825 **Link:** https://github.com/rust-lang/rust/issues/141825 ### "`rustc_const_eval`: respect `target.min_global_align`" rust#142198 **Link:** https://github.com/rust-lang/rust/pull/142198 ### "&str and &[u8] have the same layout" reference#1848 **Link:** https://github.com/rust-lang/reference/pull/1848 ### "Permit duplicate imports" rust#141043 **Link:** https://github.com/rust-lang/rust/pull/141043 TC: There's a pattern like this that comes up with `serde` and other popular crates. Consider: ```rust mod serde { pub(crate) trait Serialize {} #[cfg(feature = "derive")] pub(crate) use crate::serde_derive::Serialize; } mod serde_derive { macro_rules! Serialize { () => {} } pub(crate) use Serialize; } mod caller { pub(crate) use crate::serde::Serialize; pub(crate) use crate::serde_derive::Serialize; //~^ ERROR the name `Serialize` is defined multiple times } ``` That is, a caller like the one above can be broken by the `derive` feature being enable anywhere in the crate graph. It seems OK to me to allow duplicate imports of the same item. The `unused_imports` lint will still fire. I've proposed FCP merge. ### "`fn_cast!` macro" rust#140803 **Link:** https://github.com/rust-lang/rust/issues/140803 TC: People, including the standard library, use a trick like this for type erasure: ```rust /// Invariant: there exists some type `T` such that `data` is actually /// a `&'a T` and `op` is actually a `fn(&T)`. struct ErasedTypeAndOp<'a> { data: *const (), op: unsafe fn(*const ()), _phantom: PhantomData<&'a ()>, } impl<'a> ErasedTypeAndOp<'a> { pub fn new<T>(data: &'a T, op: fn(&'a T)) -> Self { Self { data: data as *const _ as *const (), op: unsafe { core::mem::transmute(op) }, _phantom: PhantomData, } } pub fn call_op(&self) { unsafe { (self.op)(self.data) } } } ``` Unfortunately, even though this is allowed by our ABI compatibility rules, it creates problems for CFI (control-flow integrity) and KCFI since the caller and callee don't agree about the callee's signature. There are ways to write this in a CFI-friendly way by using a trampoline function, and what's proposed here is that we add a way to generate this trampoline automatically and only when necessary. With that, it becomes maybe feasible for us to say that while such mismatched calls are still defined behavior, they're "erroneous" (mostly in that they're second-class since they won't work with CFI). What do we think? ### "Decide on behavior of `anonymous_lifetime_in_impl_trait`" rust#137575 **Link:** https://github.com/rust-lang/rust/issues/137575 TC: We unnominated the original PR back in October 2023 as more analysis seemed to be needed. Since then, nikomatsakis and tmandry have posted substantive analysis that it seems we should discuss. Unfortunately, the author seems to have lost interest in this stabilization. Still, we'd be well-advised to finish our discussion so as to unblock anyone else from pursuing this. ### "Lang discussion: Item-level `const {}` blocks, and `const { assert!(...) }`" lang-team#251 **Link:** https://github.com/rust-lang/lang-team/issues/251 TC: This issue was raised due to discussion in a T-libs-api call. Josh gives the context: > In discussion of [rust-lang/libs-team#325](https://github.com/rust-lang/libs-team/issues/325) (a proposal for a compile-time assert macro), the idea came up to allow `const {}` blocks at item level, and then have people use `const { assert!(...) }`. > > @rust-lang/libs-api would like some guidance from @rust-lang/lang about whether lang is open to toplevel `const { ... }` blocks like this, which would influence whether we want to add a compile-time assert macro, as well as what we want to call it (e.g. `static_assert!` vs `const_assert!` vs some other name). > > Filing this issue to discuss in a lang meeting. This issue is _not_ seeking any hard commitment to add such a construct, just doing a temperature check. CAD97 noted: > To ensure that it's noted: if both item and expression `const` blocks are valid in the same position (i.e. in statement position), a rule to disambiguate would be needed (like for statement versus expression `if`-`else`). IMO it would be quite unfortunate for item-level `const` blocks to be evaluated pre-mono if that same `const` block but statement-level would be evaluated post-mono. > > Additionally: since `const { assert!(...) }` is post-mono (due to using the generic context), it's potentially desirable to push people towards using `const _: () = assert!(...);` (which is pre-mono) whenever possible (not capturing generics). TC: What do we think? ### "Add new `function_casts_as_integer` lint" rust#141470 **Link:** https://github.com/rust-lang/rust/pull/141470 ### "Declarative `macro_rules!` attribute macros" rfcs#3697 **Link:** https://github.com/rust-lang/rfcs/pull/3697 TC: Josh proposes an RFC for us: > Many crates provide attribute macros. Today, this requires defining proc macros, in a separate crate, typically with several additional dependencies adding substantial compilation time, and typically guarded by a feature that users need to remember to enable. > > However, many common cases of attribute macros don't require any more power than an ordinary `macro_rules!` macro. Supporting these common cases would allow many crates to avoid defining proc macros, reduce dependencies and compilation time, and provide these macros unconditionally without requiring the user to enable a feature. E.g.: ```rust macro_rules! main { attr() ($func:item) => { make_async_main!($func) }; attr(threads = $threads:literal) ($func:item) => { make_async_main!($threads, $func) }; } #[main] async fn main() { ... } #[main(threads = 42)] async fn main() { ... } ``` TC: What do we think? ### "Declarative `macro_rules!` derive macros" rfcs#3698 **Link:** https://github.com/rust-lang/rfcs/pull/3698 TC: Josh proposes an RFC for us: > Many crates support deriving their traits with `derive(Trait)`. Today, this requires defining proc macros, in a separate crate, typically with several additional dependencies adding substantial compilation time, and typically guarded by a feature that users need to remember to enable. > > However, many common cases of derives don't require any more power than an ordinary `macro_rules!` macro. Supporting these common cases would allow many crates to avoid defining proc macros, reduce dependencies and compilation time, and provide these macros unconditionally without requiring the user to enable a feature. E.g.: ```rust trait Answer { fn answer(&self) -> u32; } #[macro_derive] macro_rules! Answer { // Simplified for this example (struct $n:ident $_:tt) => { impl Answer for $n { fn answer(&self) -> u32 { 42 } } }; } #[derive(Answer)] struct Struct; fn main() { let s = Struct; assert_eq!(42, s.answer()); } ``` TC: What do we think? ### "Rename "unsized" coercion as "unsizing"" reference#1797 **Link:** https://github.com/rust-lang/reference/pull/1797 TC: We've called thing "unsized coercions" for a long time. Do we want to keep this name or change it? ### "Stabilize `#[cfg(version(...))]`, take 2" rust#141766 **Link:** https://github.com/rust-lang/rust/pull/141766 ## On radar RFCs, PRs, and issues ### "Fallback `{float}` to `f32` when `f32: From<{float}>` and add `impl From<f16> for f32`" rust#139087 **Link:** https://github.com/rust-lang/rust/pull/139087 TC: Start here: https://github.com/rust-lang/rust/pull/139087#issue-2957255130 What do we think? ### "[WIP] Forbid object lifetime changing pointer casts" rust#136776 **Link:** https://github.com/rust-lang/rust/pull/136776 TC: This PR acts to try to resolve a different concern around the stabilization of arbitrary self types and `derive(CoercePointee)`. It produces distinctly non-zero regressions. Let's review this situation. What do we think? ### "Tracking issue for `cfg_select` (formerly `cfg_match`)" rust#115585 **Link:** https://github.com/rust-lang/rust/issues/115585 TC: There's been a `cfg_match!` macro in the works for awhile. There's now a stabilization up. tmandry suggests that we have a look, and we should probably go on the FCP. ### "Split elided_lifetime_in_paths into tied and untied" rust#120808 **Link:** https://github.com/rust-lang/rust/pull/120808 TC: There's a new proposal here for us to work through. ### "Make `missing_fragment_specifier` an unconditional error" rust#128425 **Link:** https://github.com/rust-lang/rust/pull/128425 TC: tgross35 wants us to make `missing_fragment_specifier` a hard error in all editions. We started linting on deps in Rust 1.82. The lint is set to deny. What do we think? ### "Arbitrary self types v2: stabilize" rust#135881 **Link:** https://github.com/rust-lang/rust/pull/135881 TC: Adrian Taylor has put up a stabilization PR for arbitrary self types. I've reviewed the tests and talked through some nits with Adrian. It seems right to me. What do we think? ### "Stabilize return type notation (RFC 3654)" rust#138424 **Link:** https://github.com/rust-lang/rust/pull/138424 TC: CE put up the long-awaited stabilization PR for RTN. It looks right to me. I've proposed FCP merge. What do we think? ### "Add `#[loop_match]` for improved DFA codegen" rust#138780 **Link:** https://github.com/rust-lang/rust/pull/138780 TC: We accepted a project goal for having a better way to express state machines. There's a PR for the experiment for this. It adds two attributes that work with a restricted syntax pattern. I.e., it doesn't add new syntax. Are we OK with this experiment. I'm the "champion". ### "`#[target_feature]` mismatch on unsafe trait fn vs its impl causes sneaky UB" rust#139368 **Link:** https://github.com/rust-lang/rust/issues/139368 TC: Someone found a sneaky unsoundness with `target_feature`. What do we think? ### "Spurious irrefutable_let_patterns warning with let-chain" rust#139369 **Link:** https://github.com/rust-lang/rust/issues/139369 TC: Ralf wants us to not lint against: ```rust fn max() -> usize { 42 } fn main() { if let mx = max() && mx < usize::MAX { // ... } } ``` In the last meeting, we had a long discussion and decided to remove this lint entirely. After the meeting, tmandry raised a concern about this. I've suggested the concern actually generalizes to any trivial condition. The original consensus: https://github.com/rust-lang/rust/issues/139369#issuecomment-2842997955 The concern: https://github.com/rust-lang/rust/issues/139369#issuecomment-2843953637 My proposed generalization: https://github.com/rust-lang/rust/issues/139369#issuecomment-2844147025 Anyway, what do we think? ### "Stabilize `fn_align`: `#[repr(align(N))]` on functions and `-Zmin-function-alignment`" rust#140261 **Link:** https://github.com/rust-lang/rust/pull/140261 TC: This is a stabilization for a way to align functions. We should have a look at the point that Jules makess in favor of `#[align(..)]` rather than `#[align(repr(..))]` here: https://internals.rust-lang.org/t/pre-rfc-align-attribute/21004/27 Essentially, do we think of functions as more likely structs or more like statics, and if we were to have a way to align statics, would we say `#[align(repr(..))]` or `#[align(..)]`? ### "`core::marker::NoCell` in bounds (previously known an `Freeze`)" rfcs#3633 **Link:** https://github.com/rust-lang/rfcs/pull/3633 TC: We have up a proposed FCP. What do we think? ### "Unsafe derives and attributes" rfcs#3715 **Link:** https://github.com/rust-lang/rfcs/pull/3715 TC: Josh proposed FCP for this RFC back in November 2024. He's now nominated it. What do we think? ### "[RFC] Allow packed types to transitively contain aligned types" rfcs#3718 **Link:** https://github.com/rust-lang/rfcs/pull/3718 TC: This came up in a lang/RfL call. We might want to have a look for what we think here. ### "Tracking issue for RFC 2523, `#[cfg(version(..))]`" rust#64796 **Link:** https://github.com/rust-lang/rust/issues/64796 TC: Wesley Wiser, the compiler team lead, nominates this for us: > This was marked as blocked on #64797 two years ago but #64797 still has open design questions and does not appear ready for stabilization anytime soon whereas this feature has no open design questions and is fully implemented. Since #64797 does not address some important use cases such as conditionally using compiler or language features and use of [`version_check`](https://crates.io/crates/version_check/) continues to grow (now at >229M all-time downloads and upward-trending daily downloads), I think it makes sense to revisit stabilization of this feature. The issue we had marked it blocked on is RFC 2523, `#[cfg(accessible(::path::to::thing))]`. - https://github.com/rust-lang/rust/issues/64797 - https://github.com/rust-lang/rfcs/pull/2523 This was last proposed for stabilization 2021-03-16: - https://github.com/rust-lang/rust/issues/64796#issuecomment-799847092 Josh said at that time: > Based on that report, this feature seems ready in isolation. > > However, when last we discussed this feature, we also had the concern that stabilizing a compiler `version` check before stabilizing `accessible` would have a negative effect on the ecosystem, by pushing people towards version checks rather than feature checks. I feel that that concern still holds. > > I'm furthermore concerned that once we _have_ `version`, there will be even less motivation to work on `accessible`. cramertj proposed it for FCP merge anyway: > @joshtriplett I agree that it would be better if we could stabilize `accessible` first. However, I do think this is a very useful feature, and there is real harm done to the ecosystem by not providing it. I also believe that, once `accessible` is made available, we will be able to successfully encourage the ecosystem best practices to adapt (over time). `accessible` is currently at the pre-implementation phase, whereas this feature has been implemented and had time to bake on nightly for months. With that in mind, I personally would be in favor of moving forwards with stabilization. Niko was +1: > I look forward to having this feature available. It may also help with some questions around the async libraries, as it enables one to have methods that move to libstd and "disappear" from the futures crate at the same time. > > > I agree that it would be nice to make progress on accessible as well-- my impression when last we spoke was that accessible is largely implemented? I may be misremembering. > > However, in general, I don't like holding up things that are ready because of other things that are not yet ready. Josh then registered a concern: > I'm going to go ahead and register this as a concern, precisely _because_ `accessible` is harder than `version`. Other ecosystems (e.g. C) had version-detection much earlier than they had feature-detection, and the effects of that are quite visible in the ecosystem. I'm quite concerned that `version` will become the "good enough" mechanism for detection, and `accessible` won't end up happening. > > @est31 To be clear, I do think we need both, precisely because `accessible` only works for library changes, not for language changes. I'd love to have a variant of `accessible` that works for language changes as well, but there are multiple ways we could do that. > > Note: this concern is predicated on the understanding that `accessible` is feasible to implement, and "just" needs further implementation work. If that turns out to not be the case, and there's some critical blocking issue that prevents implementing `accessible` as specified, then I'd like to see it re-specified in a fashion that'd be more feasible to implement, but I'd be willing to drop this concern because I don't think stabilizing `version` should wait on further _design_ work. Niko later canceled FCP. Josh later commented: > It looks like `cfg(accessible(...))` may be at a state where we could stabilize enough of it to be generally useful, and what's available is enough that I'd consider it to unblock this. TC: Where are we on this? ### "Support for pointers with asm_const" rust#128464 **Link:** https://github.com/rust-lang/rust/issues/128464 TC: Niko nominates to ask whether extending `const` for asm needs an RFC. What do we think? ### "lexer: Treat more floats with empty exponent as valid tokens" rust#131656 **Link:** https://github.com/rust-lang/rust/pull/131656 TC: There's a lexing change proposed here. There's more context at: https://github.com/rust-lang/rust/pull/131656#issuecomment-2698831039 What do we think? ### "An unsafe const fn being used to compute an array length or const generic is incorrectly described as being an "item"." rust#133441 **Link:** https://github.com/rust-lang/rust/issues/133441 TC: We're being asked for our take on what contexts should inherent an `unsafe { .. }`. E.g., should this?: ```rust const unsafe fn f() -> usize { 1 } fn main() { unsafe { let _x = [0; f()]; } } ``` What about?: ```rust const unsafe fn f() -> usize { 1 } fn main() { _ = unsafe { const { f(); } }; } ``` ```rust const unsafe fn f() -> usize { 1 } fn main() { _ = unsafe { || { f(); } }; } ``` ```rust const unsafe fn f() -> usize { 1 } fn main() { unsafe { <[i32; f()]>::default(); } } ``` ```rust const unsafe fn f() -> usize { 1 } fn g<const N: usize>() {} fn main() { unsafe { g::<{f()}>(); } } ``` ```rust const unsafe fn f() -> usize { 1 } struct S<const N: usize>; fn main() { unsafe { let _x: S<{f()}>; } } ``` TC: What do we think? ### "Stabilize `derive(CoercePointee)`" rust#133820 **Link:** https://github.com/rust-lang/rust/pull/133820 TC: Are we ready to stabilize `derive(CoercePointee)`? Ding proposes that for us. ### "experiment with relaxing the orphan rule" rust#136979 **Link:** https://github.com/rust-lang/rust/issues/136979 TC: In the RfL/lang call on 2025-02-12, there was (again) a request for some way to relax the orphan rule, and they described their use case a bit. We asked them to file an issue about this for a nomination, and there's been some discussion. TC: What do we think? ### "Tracking issue for unsupported_calling_conventions" rust#137018 **Link:** https://github.com/rust-lang/rust/issues/137018 TC: Ralf and company want to move to only accepting ABIs on targets where they make sense. We need to give a signal here about our happiness with the direction and the plan, and then we con do our FCP on the stabilization as usual. Start with the comment here: https://github.com/rust-lang/rust/issues/137018#issuecomment-2851043788 What do we think? ### "Oddity with lifetime elision and type aliases" rust#140611 **Link:** https://github.com/rust-lang/rust/issues/140611 This behavior isn't documented correctly the Reference, and it's unclear whether it should be or whether we might want to fix it as a language matter: ```rust pub struct W<'a>(&'a ()); pub type Alias<'a> = W<'a>; impl<'a> Alias<'a> { fn f1<'x>(self: &W<'a>, x: &'x ()) -> &() { x } //~ `'_ == 'x`, what? fn f2<'x>(self: &Alias<'a>, x: &'x ()) -> &() { x } //~ `'_ == 'x`, what? fn f3<'x>(&self, _: &'x ()) -> &() { self.0 } //~ OK. } impl<'a> W<'a> { fn f4<'x>(self: &W<'a>, _: &'x ()) -> &() { self.0 } //~ OK. fn f5<'x>(self: &Alias<'a>, x: &'x ()) -> &() { x } //~ `'_ == 'x`, what? fn f6<'x>(&self, _: &'x ()) -> &() { self.0 } //~ OK. } ``` Anyone know about this? ### "Confusing error when a const contains a shared ref to interior mutable data" rust#140653 **Link:** https://github.com/rust-lang/rust/issues/140653 TC: RalfJ raises that we give a bogus error about this code: ```rust use std::sync::atomic::*; static FOO: AtomicU32 = AtomicU32::new(0); const C: &'static AtomicU32 = &FOO; ``` One option is that we could choose to accept this code. If we do, then we must error if this constant is used in a pattern (the error is still pre-mono). The other option is to forbid it, but say more correctly why we are. What do we think? ### "Split up the `unknown_or_malformed_diagnostic_attributes` lint" rust#140717 **Link:** https://github.com/rust-lang/rust/pull/140717 TC: mejrs wants to break up a lint. The motivation is related to holding a lower MSRV. What do we think? ### "Add `core::ptr::assume_moved`" rfcs#3700 **Link:** https://github.com/rust-lang/rfcs/pull/3700 TC: We're being asked for a vibe check on this one. Vibes? ### "RFC: Add an attribute for raising the alignment of various items" rfcs#3806 **Link:** https://github.com/rust-lang/rfcs/pull/3806 TC: Based on our request, and to help us on, - https://github.com/rust-lang/rust/pull/140261 Jules Bertholet has filed this RFC proposing `#[align(..)]`. What do we think? ### "#[deprecated] lint doesn't trigger when overriding deprecated method" rust#98990 **Link:** https://github.com/rust-lang/rust/issues/98990 TC: Mara asks about this: > This doesn't give any warnings, even though std::error::Error::description is deprecated: > > impl std::error::Error for E { > fn description(&self) -> &str { > ":)" > } > } What do we think? ### "Tracking Issue for unicode and escape codes in literals" rust#116907 **Link:** https://github.com/rust-lang/rust/issues/116907 TC: nnethercote has implemented most of RFC 3349 ("Mixed UTF-8 literals") and, based on implementation experience, argues that the remainder of the RFC should not be implemented: > I have a partial implementation of this RFC working locally (EDIT: now at #120286). The RFC proposes five changes to literal syntax. I think three of them are good, and two of them aren't necessary. TC: What do we think? ### "sanitizers: Stabilize AddressSanitizer and LeakSanitizer for the Tier 1 targets" rust#123617 **Link:** https://github.com/rust-lang/rust/pull/123617 TC: There's a proposed stabilization for sanitizers. It includes a new attribute, currently called `#[no_sanitize]`. I couldn't immediately find if we had previously discussed this. In discussion, Eric Huss proposed we might want to consider `#[sanitize(off)]` or similar for parity with what we're doing for `#[coverage(off)]`. We'd also need to think about whether there might be extensions to allow for e.g. turning off only one of many sanitizers. TC: What do we think? ### "Lint on fn pointers comparisons in external macros" rust#134536 **Link:** https://github.com/rust-lang/rust/pull/134536 TC: This is a question of whether we want to extend a lint. We had talked about this extension when considering the original lint, but we didn't answer that question. See: https://github.com/rust-lang/rust/pull/134536#issuecomment-2557487035 TC: What do we think? ### "Built-in attributes are treated differently vs prelude attributes, unstable built-in attributes can name-collide with stable macro, and built-in attributes can break back-compat" rust#134963 **Link:** https://github.com/rust-lang/rust/issues/134963 TC: jieyouxu makes an interesting observation of current behavior at which we should have a look. What do we think? ### "Add checking for unnecessary delims in closure body" rust#136906 **Link:** https://github.com/rust-lang/rust/pull/136906 TC: This is about linting against: ```rust pub fn main() { let _ = || (0 == 0); } ``` What do we think? ### "[RFC] Add `#[export_ordinal(n)]` attribute" rfcs#3641 **Link:** https://github.com/rust-lang/rfcs/pull/3641 TC: This RFC would allow writing: ```rust #[no_mangle] #[export_ordinal(1)] pub extern "C" fn hello() { println!("Hello, World!"); } ``` TC: There's a long-outstanding FCP. Josh nominates this for us to collect checkboxes. What do we think? ### "RFC: No (opsem) Magic Boxes" rfcs#3712 **Link:** https://github.com/rust-lang/rfcs/pull/3712 TC: The idea here is to remove the language invariant that a `Box` must not alias other things (the library invariant would of course remain). TC: What do we think? ### "Tracking Issue: Procedural Macro Diagnostics (RFC 1566)" rust#54140 **Link:** https://github.com/rust-lang/rust/issues/54140 TC: Spawned off from the original RFC 1566 for proc macros is the question of how to allow proc macros to emit diagnostics. TC: The feeling on the 2025-01-07 libs-api call, particularly from dtolnay, is that it would be mistake to do this without some way to allow users to suppress these warnings with some specificity. This then seems to call for some kind of namespacing solution, e.g. `allow(my_macro::*)`. As I wrote: > But more broadly, we've been thinking about a number of seemingly-related namespacing concerns, e.g. how to namespace attributes applied to fields for derive macros, the tooling namespace, etc. We may want to think holistically about this, or to encourage designs that fall within whatever direction we take here. TC: This is nominated just to build context and see if we have any immediate thoughts. Thoughts? ### "Tracking Issue for enum access in offset_of" rust#120141 **Link:** https://github.com/rust-lang/rust/issues/120141 TC: There's a proposed FCP merge for us: https://github.com/rust-lang/rust/issues/120141#issuecomment-2161507356 TC: What do we think? ### "Remove unstable cfg `target(...)` compact feature" rust#130780 **Link:** https://github.com/rust-lang/rust/pull/130780 TC: Urgau suggests that we remove the `cfg_target_compact` unstable feature. This allows writing, e.g., `cfg(target(os = "linux", arch = "arm")`. This only costs 28 lines of code in the compiler to support. I proposed, via FCP, that we don't remove this and instead invite a stabilization. What do we think? ### "Strengthen the follow-set rule for macros" rust#131025 **Link:** https://github.com/rust-lang/rust/issues/131025 TC: Over in: - https://github.com/rust-lang/rust/pull/130635 @compiler-errors describes this general problem: > The breakage specifically represents an inherent limitation to the "macro follow-set" formulation which is _supposed_ to make us more resilient against breakages due to extensions to the grammar like this. > > Given two macro matcher arms: > > * `($ty:ty) => ...` > * `(($tt:tt)*) => ...` > > And given tokens like: > > * `&` `pin` `mut` [...more tokens may follow...] > > On nightly today, `&pin` gets parsed as a type. However, we run out of matchers but still have tokens left (the `mut` token is next), so we fall through to the next arm. Since it's written like `($tt:tt)*`, everything is allowed, and we match the second arm successfully... > > I think that's weird, because if this second arm were written like `$ty:ty mut`, that would be illegal, since `mut` is not in the follow-set of the `:ty` matcher. Thus, we can use `:tt` matchers to observe whether the compiler _actually_ parses things not in our grammar that should otherwise be protected against, which seems pretty gross. And @Noratrieb proposes a general solution: > I believe a solution to this would be the following new logic: > > * after the end of a macro matcher arm has been reached > * and there are still input tokens remaining > * and if the last part of the matcher is a metavar > * ensure that the first remaining token is in the follow set of this metavar > * if it is, move on to the next arm > * if it is not, **emit an error** > > What this semantically does is strengthen the "commit to fully matching metavars or error" behavior such that it extends past the end. I don't know how many macros rely on this, but it seems like emitting an FCW (instead of error) on such macro invocations would find all these cases and ensure that the follow-set logic is actually robust past the end. But imo this shouldn't block this PR (which should probably just ship as-is) and can be done separately. About this, NM noted: > I don't think this proposal is sufficient but I am interested in pursuing a real fix to this for a future edition. > > Example: > ```rust macro_rules! test { (if $x:ty { }) => {}; (if $x:expr { }) => {}; } ``` > > This basically says to pick one arm if something is a type, another if it's an expression. Extending the type grammar to cover new cases could change which arm you go down to. > > I *think* the most general fix is to say: when you would start parsing a fragment, first skip ahead to find the extent of it (i.e., until you see an entry from the follow-set). Then parse it as the fragment. If the parsing fails or there are unconsumed tokens, report a hard error. > > I suspect it would break a lot in practice and we would need an opt-in. TC: What do we think? ### "Warn about C-style octal literals" rust#131309 **Link:** https://github.com/rust-lang/rust/pull/131309 TC: The question is about code like: ```rust fn is_executable(unix_mode: u32) -> bool { unix_mode & 0111 != 0 ``` TC: Do we want to lint against that? ### "Add lint against (some) interior mutable consts" rust#132146 **Link:** https://github.com/rust-lang/rust/pull/132146 TC: Urgau nominates a new lint for us. What do we think? ### "Add new `function_casts_as_integer` lint" rust#141470 **Link:** https://github.com/rust-lang/rust/pull/141470 ### "RFC: Improved State Machine Codegen" rfcs#3720 **Link:** https://github.com/rust-lang/rfcs/pull/3720 TC: After a long discussion on Zulip leading to this, folkertdev proposes a way to express intraprocedural finite state machine transitions building on match syntax. There's an draft implementation by bjorn3, and this results in some impressive speedups in `zlib-rs`. TC: What's our vibe, and are there any objections to accepting this work from bjorn3 as a lang experiment? ### "Add `must-use-output` attribute" rfcs#3773 **Link:** https://github.com/rust-lang/rfcs/pull/3773 TC: We have `#[must_use]` that applies to function return types. This RFC proposes a similar attribute that can be applied to output arguments on functions and have the same effect. E.g.: ```rust impl<T> Vec<T> { pub fn push(#[must_use_output] &mut self, item: T) { /* ... */ } } ``` TC: What do we think? ### "Effective breakage to `jiff` due to `ambiguous_negative_literals`" rust#128287 **Link:** https://github.com/rust-lang/rust/issues/128287 TC: We have an allow-by-default lint against `ambiguous_negative_literals` like: ```rust assert_eq!(-1.abs(), -1); ``` It's allow-by-default because we found use cases such as `jiff` (by BurntSushi) that have, in their API, operations whose result is invariant to the order of the negation and that rely on this syntax for the intended ergonomics. Urgau has a proposal for us. He'd like to lint by default, and have an... ```rust #[diagnostic::irrelevant_negative_literal_precedence] ``` ...attribute (of some name), using the diagnostic namespace, that could be applied to function definitions and that would suppress this lint on their callers. Urgau would prefer this be opt-in rather than opt-out so as to bring awareness to this, even though many functions don't affect the sign bit and so will have this invariance. I've asked BurntSushi for his views on this proposal with respect to `jiff`, to confirm this would address his use case. TC: What do we think? ### "Simplify lightweight clones, including into closures and async blocks" rfcs#3680 **Link:** https://github.com/rust-lang/rfcs/pull/3680 TC: Josh nominates a new RFC for us. What do we think? ### "Macro fragment fields" rfcs#3714 **Link:** https://github.com/rust-lang/rfcs/pull/3714 TC: This RFC proposes to allow: ```rust macro_rules! get_name { ($t:adt) => { println!("{}", stringify!(${t.name})); } } fn main() { let n1 = get_name!(struct S { field: u32 }); let n2 = get_name!(enum E { V1, V2 = 42, V3(u8) }); let n3 = get_name!(union U { u: u32, f: f32 }); println!("{n3}{n1}{n2}"); // prints "USE" } ``` That is, it lets MBE authors use the Rust parser to pull out certain elements. TC: What do we think? ### "Add `homogeneous_try_blocks` RFC" rfcs#3721 **Link:** https://github.com/rust-lang/rfcs/pull/3721 TC: scottmcm proposes for us a tweak to the way that `?` works within `try { .. }` blocks. TC: What's our vibe? ### "Elided lifetime changes in `rust_2018_idioms` lint is very noisy and results in dramatically degraded APIs for Bevy" rust#131725 **Link:** https://github.com/rust-lang/rust/issues/131725 TC: Long ago, we set a direction of wanting to move away from eliding lifetimes in paths, e.g.: ```rust #![deny(elided_lifetimes_in_paths)] struct S<'a>(&'a ()); fn f(x: &()) -> S { // ~ //~^ ERROR expected lifetime parameter S(x) } ``` However, that lint is currently `allow-by-default`. It was part of the `rust_2018_idioms` lint group (which is also `allow-by-default`). We talked about changing this in Rust 2024, but it seems we didn't get around to it. One of the maintainers of Bevy has now written in to ask us to never change this. I'd probably highlight: - The representativeness of the example being challenged. - https://github.com/rust-lang/rust/issues/131725#issuecomment-2413272045 - Details about the lint and what would actually be flagged. - https://github.com/rust-lang/rust/issues/91639#issuecomment-2413823502 TC: What do we think? ### "Coercing &mut to *const should not create a shared reference" rust#56604 **Link:** https://github.com/rust-lang/rust/issues/56604 TC: It's currently UB to write: ``` fn main() { let x = &mut 0; let y: *const i32 = x; unsafe { *(y as *mut i32) = 1; } assert_eq!(*x, 1); } ``` This is due to the fact that we implicitly first create a shared reference when coercing a `&mut` to a `*const`. See: TC: What do we think about this? ### "#[cold] on match arms" rust#120193 **Link:** https://github.com/rust-lang/rust/pull/120193 TC: Apparently our unstable `likely` and `unlikely` intrinsics don't work. There's a proposal to do some work on fixing that and stabilizing a solution here. The nominated question is whether we want to charter this as an experiment. ### "`is` operator for pattern-matching and binding" rfcs#3573 **Link:** https://github.com/rust-lang/rfcs/pull/3573 TC: Josh proposes for us that we should accept: ```rust if an_option is Some(x) && x > 3 { println!("{x}"); } ``` And: ```rust func(x is Some(y) && y > 3); ``` TC: The main topic discussed in the issue thread so far has been the degree to which Rust should have "two ways to do things". Probably the more interesting issue is how the binding and drop scopes for this should work. TC: In the 2024-02-21 meeting (with limited attendance), we discussed how we should prioritize stabilizing let chains, and tmandry suggested we may want to allow those to settle first. TC: What do we think, as a gut check? ### "Unsafe fields" rfcs#3458 **Link:** https://github.com/rust-lang/rfcs/pull/3458 TC: Nearly ten years ago, on 2014-10-09, pnkfelix proposed unsafe fields in RFC 381: https://github.com/rust-lang/rfcs/issues/381 On 2017-05-04, Niko commented: > I am pretty strongly in favor of unsafe fields at this point. The only thing that holds me back is some desire to think a bit more about the "unsafe" model more generally. Then, in 2023, Jacob Pratt refreshed this proposal with RFC 3458. It proposes that: > Fields may be declared `unsafe`. Unsafe fields may only be mutated (excluding interior mutability) or initialized in an unsafe context. Reading the value of an unsafe field may occur in either safe or unsafe contexts. An unsafe field may be relied upon as a safety invariant in other unsafe code. E.g.: ```rust struct Foo { safe_field: u32, /// Safety: Value must be an odd number. unsafe unsafe_field: u32, } // Unsafe field initialization requires an `unsafe` block. // Safety: `unsafe_field` is odd. let mut foo = unsafe { Foo { safe_field: 0, unsafe_field: 1, } }; ``` On 2024-05-21, Niko nominated this for us: > I'd like to nominate this RFC for discussion. I've not read the details of the thread but I think the concept of unsafe fields is something that comes up continuously and some version of it is worth doing. TC: What do we think? ### "RFC: Allow symbol re-export in cdylib crate from linked staticlib" rfcs#3556 **Link:** https://github.com/rust-lang/rfcs/pull/3556 TC: This seems to be about making the following work: ```rust // kind is optional if it's been specified elsewhere, e.g. via the `-l` flag to rustc #[link(name="ext", kind="static")] extern { #[no_mangle] pub fn foo(); #[no_mangle] pub static bar: std::ffi::c_int; } ``` There are apparently use cases for this. What's interesting is that apparently it already does, but we issue a warning that is wrong: ```rust warning: `#[no_mangle]` has no effect on a foreign function --> src/lib.rs:21:5 | 21 | #[no_mangle] | ^^^^^^^^^^^^ help: remove this attribute 22 | pub fn foo_rfc3556_pub_with_no_mangle(); | ---------------------------------------- foreign function | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: symbol names in extern blocks are not mangled ``` TC: One of the author's asks of us is that we don't make this into a hard error (e.g. with the new edition). TC: What do we think? ### "Hierarchy of Sized traits" rfcs#3729 **Link:** https://github.com/rust-lang/rfcs/pull/3729 TC: We discussed this in our design meeting on 2024-11-13. There's still a steady stream of good revisions and new ideas on the thread happening, so we should probably let this play out awhile longer. ### "Language vs. implementation threat models and implications for TypeId collision resistance" rust#129030 **Link:** https://github.com/rust-lang/rust/issues/129030 TC: We use SipHash-1-3-128 in Rust for hashing types to form TypeIds. If these TypeIds collide in a single program, UB may result. If SipHash-1-3-128 is a secure PRF, then the probability of such collisions happening accidentally in a program that contains an enormous 1M types is one in 2^-89. But, if someone wanted to brute-force a collision -- that is, find two entirely random types that would have the same TypeId -- the work factor for that is no more than about 2^64 on average. The question being nominated for lang is whether we consider that good enough for soundness, for now. TC: What do we think? ### "RFC: inherent trait implementation" rfcs#2375 **Link:** https://github.com/rust-lang/rfcs/pull/2375 TC: We had a design meeting on 2023-09-12 about inherent trait impls. In that meeting, I proposed a `use` syntax for this: > In the discussion above, we had left two major items unresolved. > > - How do we make blanket trait impls inherent? > - How can we allow only *some* items from the trait impl to be made inherent? > - This is especially tricky for associated functions and methods with a default implementation. > > (Part of the motivation for wanting to allow only some items to be made inherent is to prevent or to fix breakage caused when a trait later adds a new method with a default implementation whose name conflicts with the name of an existing inherent method.) > > Coming up with a syntax for these that combines well with the `#[inherent]` attribute could be challenging. > > One alternative that would make solving these problems straightforward is to add some syntax to the inherent `impl` block for the type. Given the desugaring in the RFC, there is some conceptual appeal here. (quaternic proposed this arrangement; TC is proposing the concrete syntax.) > > We can use `use` syntax to make this concise and intuitive. > > Here's an example: ```rust trait Trait1<Tag, T> { fn method0(&self) -> u8 { 0 } fn method1(&self) -> u8 { 1 } } trait Trait2<Tag, T> { fn method2(&self) -> u8 { 2 } fn method3(&self) -> u8 { 3 } fn method4(&self) -> u8 { 4 } } struct Tag; struct Foo<T>(T); impl<T> Foo<T> { // All methods and associated items of Trait1 become inherent, // except for `method0`. The inherent items are only visible // within this crate. pub(crate) use Trait1<Tag, T>::*; // Only `method2` and `method3` on Trait2 become inherent. pub use Trait2<Tag, T>::{method2, method3}; fn method0(&self) -> u64 { u64::MAX } } impl<T> Trait1<Tag, T> for Foo<T> {} impl<U: Trait1<Tag, T>, T> Trait2<Tag, T> for U {} ``` > This solves another problem that we discussed above. How do we prevent breakage in downstream crates when a trait later adds a new method with a default implementation? Since a downstream crate might have made an impl of this trait for some local type inherent and might have an inherent method with a conflicting name, this could be breaking. > > We already handle this correctly for `use` declarations with wildcards. Any locally-defined items override an item that would otherwise be brought into scope with a wildcard import. We can reuse that same behavior and intuition here. When a wildcard is used to make all items in the trait inherent, any locally-defined inherent items in the `impl` prevent those items from the trait with the same name from being made inherent. > > Advantages: > > - It provides a syntax for adopting as inherent a blanket implementation of a trait for the type. > - It provides a syntax for specifying which methods should become inherent, including methods with default implementations. > - The wildcard import (`use Trait::*`) makes it very intuitive what exactly is happening and what exactly your API is promising. > - The `use` syntax makes it natural for a locally-defined item to override an item from the wildcard import because that's exactly how other `use` declarations work. > - `rust-analyzer` would probably support expanding a wildcard `use Trait::*` to an explicit `use Trait::{ .. }` just as it does for other `use` declarations, which would help people to avoid breakage. > - We can support any visibility (e.g. `use`, `pub use`, `pub(crate) use`, etc.) for the items made inherent. > > Disadvantages: > > - There's some redundancy, especially when the items to make inherent are specifically named. During the meeting, this emerged as the presumptive favorite, and we took on a TODO item to updated the RFC. After follow-on discussion in Zulip, Niko agreed, and also raised a good question: > Per the discussion on zulip, I have become convinced that it would be better to make this feature use the syntax `use`, like: > ```rust impl SomeType { pub use SomeTrait::*; // re-export the methods for the trait implementation } ``` > > This syntax has a few advantages: > > * We can give preference to explicit method declared in the impl blocks over glob re-exports, eliminating one source of breakage (i.e., trait adds a method with a name that overlaps one of the inherent methods defined on `SomeType`) > * Can make just specific methods (not all of them) inherent. > * Easier to see the inherent method when scanning source. > * You can re-export with different visibility levels (e.g., `pub(crate)`) > * It would work best if we planned to permit `use SomeTrait::some_method;` as a way to import methods as standalone fns, but I wish we did that. > > However, in writing this, I realize an obvious disadvantage -- if the trait has more generics and things, it's not obvious how those should map. i.e., consider > ```rust struct MyType<T> { } impl<T> MyType<T> { pub use MyTrait::foo; } impl<T: Debug> MyTrait for MyType<T> { fn foo(&self) { } } ``` > > This would be weird -- is this an error, because the impl block says it's for all `T`? And what if it were `trait MyTRait<X>`? TC: My sense is that we've just been awaiting someone digging in and updating the RFC here. ### "Raw Keywords" rfcs#3098 **Link:** https://github.com/rust-lang/rfcs/pull/3098 TC: We've at various times discussed that we had earlier decided that if we wanted to use a new keyword within an edition, we would write it as `k#keyword`, and for that reason, we prefer to not speculatively reserve keywords ahead of an edition (except, perhaps, when it's clear we plan to use it in the near future). TC: Somewhat amusingly, however, we never in fact accepted that RFC. Back in 2021, we accepted scottmcm's proposal to **cancel**: > We discussed this RFC again in the lang team triage meeting today. > > For the short-term goal of the reservation for the edition, we'll be moving forward on #3101 instead. As such, we wanted to leave more time for conversations about this one, and maybe use crater results from 3101 to make design changes, > > @rfcbot cancel Instead we accepted RFC 3101 that reserved `ident#foo`, `ident"foo"`, `ident'f'`, and `ident#123` starting in the 2023 edition. Reading through the history, here's what I see: - What do we want to do about Rust 2015 and Rust 2018? It's a breaking change to add this there. Is this OK? Do we want to do a crater run on this? - Would we have the stomach to actually do this? It's one thing to *say* that if we wanted to use a new keyword within an edition, we'd write `k#keyword`, but it's another to actually do it in the face of certain criticism about that being e.g. unergonomic. Would we follow through? TC: What do we think? ### "RFC: Implementable trait aliases" rfcs#3437 **Link:** https://github.com/rust-lang/rfcs/pull/3437 TC: We discussed this in the lang planning meeting in June, and it looks like there have been updates since we last looked at this, so it's time for us to have another look since we seemed interested in this happening. TC: What do we think? ### "Should Rust still ignore SIGPIPE by default?" rust#62569 **Link:** https://github.com/rust-lang/rust/issues/62569 TC: Prior to `main()` being executed, the Rust startup code makes a syscall to change the handling of `SIGPIPE`. Many believe that this is wrong thing for a low-level language like Rust to do, because 1) it makes it impossible to recover what the original value was, and 2) means things like `seccomp` filters must be adjusted for this. It's also just, in a practical sense, wrong for most CLI applications. This seems to have been added back when Rust had green threads and then forgotten about. But it's been an ongoing footgun. Making a celebrity appearance, Rich Felker, the author of MUSL libc, notes: > As long as Rust is changing signal dispositions inside init code in a way that the application cannot suppress or undo, it is _fundamentally unusable to implement standard unix utilities that run child processes_ or anything that needs to preserve the signal dispositions it was invoked with and pass them on to children. Changing inheritable process state behind the application's back is just unbelievably bad behavior and does not belong in a language runtime for a serious language... > > As an example, if you implement `find` in Rust, the `-exec` option will invoke its commands with `SIGPIPE` set to `SIG_IGN`, so that they will not properly terminate on broken pipe. But if you just made it set `SIGPIPE` to `SIG_DFL` before invoking the commands, now it would be broken in the case where the invoking user intentionally set `SIGPIPE` to `SIG_IGN` so that the commands would not die on broken pipe. There was discussion in 2019 about fixing this over an edition, but nothing came of it. Are we interested in fixing it over this one? Strawman (horrible) proposal: We could stop making this pre-main syscall in Rust 2024 and have `cargo fix` insert this syscall at the start of every `main` function. (In partial defense of the strawman, it gets us directly to the arguably best end result while having an automatic semantics-preserving edition migration and it avoids the concerns about lang/libs coupling that Mara raised. The edition migration could add a comment above this inserted code telling people under what circumstances they should either keep or delete the added line.) ### "types team / lang team interaction" rust#116557 **Link:** https://github.com/rust-lang/rust/issues/116557 TC: nikomatsakis nominated this: > We had some discussion about types/lang team interaction. We concluded a few things: > > * Pinging the team like @rust-lang/lang is not an effective way to get attention. Nomination is the only official way to get attention. > * It's ok to nominate things in an "advisory" capacity but not block (e.g., landing a PR), particularly as most any action can ultimately be reversed. But right now, triagebot doesn't track closed issues, so that's a bit risky. > > Action items: > > * We should fix triagebot to track closed issues. TC: What do we think? ### "Trait method impl restrictions" rfcs#3678 **Link:** https://github.com/rust-lang/rfcs/pull/3678 TC: This RFC is pending further work that's probably on me at this point. ### "Closing issues relevant to T-lang on this repo" rfcs#3756 **Link:** https://github.com/rust-lang/rfcs/issues/3756 TC: We're being asked what we want to do, if anything, about issues (rather than PRs) in the RFCs repo. Thoughts? ### "Implement `PartialOrd` and `Ord` for `Discriminant`" rust#106418 **Link:** https://github.com/rust-lang/rust/pull/106418 TC: We discussed this last in the meeting on 2024-03-13. scottmcm has now raised on concern on the issue and is planning to make a counter-proposal: > I remain concerned about exposing this with no opt-out on an unrestricted generic type @rfcbot concern overly-broad > > I'm committing to making an alternative proposal because I shouldn't block without one. Please hold my feet to the fire if that's no up in a week. > > Basically, I have an idea for how we might be able to do this, from [#106418 (comment)](https://github.com/rust-lang/rust/pull/106418#issuecomment-1698887324) > > > 2. Expose the variant ordering privately, only accessible by the type owner/module. > > > > Solution 2. is obviously more desirable, but AFAIK Rust can't do that and there is no proposal to add a feature like that. https://github.com/rust-lang/rust/pull/106418#issuecomment-1994833151 ### "Fallout from expansion of redundant import checking" rust#121708 **Link:** https://github.com/rust-lang/rust/issues/121708 TC: We discussed this in the meeting on 2024-03-13. The feelings expressed included: - We don't want to create a perverse incentive for people to expand existing lints rather than to create new ones where appropriate just because there's less process for expanding the meaning of an existing lint. - It would be good if potentially-disruptive expansions of an existing lint either: - Had a machine-applicable fix. - Or had a new name. - We don't want to require a new lint name for each expansion. - We don't want to require a crater run for each change to a lint. - There are two ways to prevent disruption worth exploring: - Prevent potentially-disruptive changes from hitting master. - Respond quickly to early indications of disruption once the changes hit master. - Compiler maintainers have a sense of what might be disruptive and are cautious to avoid it. It may be OK to have a policy that is not perfectly measurable. TC: tmandry volunteered to draft a policy proposal. ### "What are the guarantees around which constants (and callees) in a function get monomorphized?" rust#122301 **Link:** https://github.com/rust-lang/rust/issues/122301 TC: The8472 asks whether this code, which compiles today, can be relied upon: ```rust const fn panic<T>() { struct W<T>(T); impl<T> W<T> { const C: () = panic!(); } W::<T>::C } struct Invoke<T, const N: usize>(T); impl<T, const N: usize> Invoke<T, N> { const C: () = match N { 0 => (), // Not called for `N == 0`, so not monomorphized. _ => panic::<T>(), }; } fn main() { let _x = Invoke::<(), 0>::C; } ``` The8472 notes that this is a useful property and that there are use cases for this in the compiler and the standard library, at least unless or until we adopt something like `const if`: https://github.com/rust-lang/rfcs/issues/3582 RalfJ has pointed out to The8472 that the current behavior might not be intentional and notes: > It's not opt-dependent, but it's also unclear how we want to resolve the opt-dependent issue. Some [proposals](https://github.com/rust-lang/rust/issues/122814#issuecomment-2015090501) involve also walking all items "mentioned" in a const. That would be in direct conflict with your goal here I think. To be clear I think that's a weakness of those proposals. But if that turns out to be the only viable strategy then we'll have to decide what we want more: using `const` tricks to control what gets monomorphized, or not having optimization-dependent errors. > > One crucial part of this construction is that everything involved is generic. If somewhere in the two "branches" you end up calling a monomorphic function, then that may have its constants evaluated even if it is in the "dead" branch -- or it may not, it depends on which functions are deemed cross-crate-inlinable. That's basically what #122814 is about. TC: The question to us is whether we want to guarantee this behavior. What do we think? ### "Policy for lint expansions" rust#122759 **Link:** https://github.com/rust-lang/rust/issues/122759 TC: In the call on 2024-03-13, we discussed this issue raised by tmandry: "Fallout from expansion of redundant import checking" https://github.com/rust-lang/rust/issues/121708 During the call, the thoughts expressed included: - We don't want to create a perverse incentive for people to expand existing lints rather than to create new ones where appropriate just because there's less process for expanding the meaning of an existing lint. - It would be good if potentially-disruptive expansions of an existing lint either: - Had a machine-applicable fix. - Or had a new name. - We don't want to require a new lint name for each expansion. - We don't want to require a crater run for each change to a lint. - There are two ways to prevent disruption worth exploring: - Prevent potentially-disruptive changes from hitting master. - Respond quickly to early indications of disruption once the changes hit master. - Compiler maintainers have a sense of what might be disruptive and are cautious to avoid it. It may be OK to have a policy that is not perfectly measurable. TC: tmandry volunteered to draft a policy proposal. He's now written up this proposal in this issue. TC: What do we think? ### "Decide on path forward for attributes on expressions" rust#127436 **Link:** https://github.com/rust-lang/rust/issues/127436 TC: We decided recently to unblock progress on attributes on expressions (RFC 16) by allowing attributes on blocks. We have a proposed FCP to this effect. After we did this, the question came up what we want to do about attributes in list contexts, e.g.: ```rust call(#[foo] { block1 }, #[bar] { block2 }) ``` ...in particular, macro attributes. Petrochenkov says: > It needs to be decided how proc macros see the commas, or other separators in similar cases. > > Ideally proc macros should be able to turn 1 expression into multiple (including 0) expressions in this position, similarly to `cfg`s or macros in list contexts without separators. So it would be reasonable if the separators were included into both input and output tokens streams (there are probably other alternatives, but they do not fit into the token-based model as well). The "reparse context" bit from [#61733 (comment)](https://github.com/rust-lang/rust/issues/61733#issuecomment-509626449) is likely relevant to this case as well. We filed a concern to figure this all out. We discussed this on 2024-07-24 and came up with these options: > Options ordered from least to most conservative (and then from most to least expressive): > > - Option A: Punt this case and don't support attributes in this position without parens (e.g. `call((#[attr] arg), (#[attr] arg2))`) > - Option B (exactly one): Specify that, for now, if you use a macro attribute on an expression, that macro can only expand to a single expresion (not zero tokens, and no tokens following in the output). > - Option C (zero or one): Specify that, for now, if you use a macro attribute on an expression, that macro can only expand to zero tokens or an expression with nothing following (extra tokens, including `,`, are an error for now) > - Option D (zero or more): Specify that an attribute in this position can expand to tokens that may include a `,`, and that if they expand to zero tokens then we elide the comma. > - Option E (flexible): include comma, let macro decide, etc > - We find it surprising that comma would be included. In discussion, we seemed generally interested in allowing at least zero and 1. We weren't sure about N, and we weren't sure about the handling of the comma in the input. TC: What do we think? ### "`continue` expressions in loop conditions" rust#118673 **Link:** https://github.com/rust-lang/rust/issues/118673 TC: This is an odd one. We accept: ```rust 'a: while continue 'a {} ``` The documentation in the Reference specifically disallows this, creating an opportunity for us to decide whether the Reference or the compiler is correct. Personally, I wouldn't expect us to accept 'a: while continue 'a {} unless we were to also accept 'a: { continue 'a }. What do we think? ### "Tracking Issue for `breakpoint` feature (`core::arch::breakpoint`)" rust#133724 **Link:** https://github.com/rust-lang/rust/issues/133724 TC: Generally we lang FCP the first stable use of an intrinsic. This is an intrinsic, and this is the first stable use. At the same time, as we discussed in the libs-api meeting, perhaps what we're meaning to lang FCP are new capabilities of the language, and this one could be seen as equivalent to some inline assembly. So I don't know. It's worth us having a look in any case. What do we think? ### "Stabilize `if let` guards (`feature(if_let_guard)`)" rust#141295 **Link:** https://github.com/rust-lang/rust/pull/141295 TC: This is a stabilization of `if let` in match arm guard position. I haven't reviewed this stabilization yet. Probably we'll want to see that some specific tests exist about the drop order, as we did for let chains. Notably this is apparently able to be stabilized in all editions. Any general thoughts to share? Probably we'll need to have a closer look at this later. ### "RFC: Allow type inference for const or static" rfcs#3546 **Link:** https://github.com/rust-lang/rfcs/pull/3546 ### "RFC: Unsafe Set Enum Discriminants" rfcs#3727 **Link:** https://github.com/rust-lang/rfcs/pull/3727 ### "RFC: naming groups of configuration with `cfg_alias`" rfcs#3804 **Link:** https://github.com/rust-lang/rfcs/pull/3804 ### "de-RFC: Remove unsized_locals" rfcs#3829 **Link:** https://github.com/rust-lang/rfcs/pull/3829 ### "Decide what we want about `macro_metavar_expr`" rust#137581 **Link:** https://github.com/rust-lang/rust/issues/137581 ### "Original `pin!()` macro behavior cannot be expressed in Rust 2024" rust#138718 **Link:** https://github.com/rust-lang/rust/issues/138718 ### "Allow while let chains on all editions" rust#140204 **Link:** https://github.com/rust-lang/rust/pull/140204 ### "Lang proposal: Allow `#[cfg(...)]` within `asm!`" rust#140279 **Link:** https://github.com/rust-lang/rust/issues/140279 ### "Consider folkertdev's `c_variadic` proposal" rust#141524 **Link:** https://github.com/rust-lang/rust/issues/141524 ### "Stabilize `feature(generic_arg_infer)`" rust#141610 **Link:** https://github.com/rust-lang/rust/pull/141610 ## Action item review - [Action items list](https://hackmd.io/gstfhtXYTHa3Jv-P_2RK7A) ## Pending lang team project proposals None. ## PRs on the lang-team repo ### "Frequently requested changes: add bypassing visibility" lang-team#323 **Link:** https://github.com/rust-lang/lang-team/pull/323 ### "Add soqb`s design doc to variadics notes" lang-team#236 **Link:** https://github.com/rust-lang/lang-team/pull/236 ### "Update auto traits design notes with recent discussion" lang-team#237 **Link:** https://github.com/rust-lang/lang-team/pull/237 ### "Update hackmd link to a public link" lang-team#258 **Link:** https://github.com/rust-lang/lang-team/pull/258 ### "Adding a link to "how to add a feature gate" in the experimenting how-to" lang-team#267 **Link:** https://github.com/rust-lang/lang-team/pull/267 ### "text describing how other teams are enabled to make decisions." lang-team#290 **Link:** https://github.com/rust-lang/lang-team/pull/290 ### "Fix link to agenda template" lang-team#315 **Link:** https://github.com/rust-lang/lang-team/pull/315 ### "new decision process" lang-team#326 **Link:** https://github.com/rust-lang/lang-team/pull/326 ### "Clarify that taking input in coroutines currently uses 'yield expressions'" lang-team#328 **Link:** https://github.com/rust-lang/lang-team/pull/328 ### "Document experimental `P-lang-drag-[0-4]` and `I-lang-easy-decision`" lang-team#330 **Link:** https://github.com/rust-lang/lang-team/pull/330 ### "Fix design meeting time and add meeting link" lang-team#334 **Link:** https://github.com/rust-lang/lang-team/pull/334 ## RFCs waiting to be merged ### "[RFC] Add `#[export_ordinal(n)]` attribute" rfcs#3641 **Link:** https://github.com/rust-lang/rfcs/pull/3641 ## `S-waiting-on-team` ### "Fallback `{float}` to `f32` when `f32: From<{float}>` and add `impl From<f16> for f32`" rust#139087 **Link:** https://github.com/rust-lang/rust/pull/139087 ### "Split elided_lifetime_in_paths into tied and untied" rust#120808 **Link:** https://github.com/rust-lang/rust/pull/120808 ### "Stabilize `fn_align`: `#[repr(align(N))]` on functions and `-Zmin-function-alignment`" rust#140261 **Link:** https://github.com/rust-lang/rust/pull/140261 ### "Specify that "option-like" enums must be `#[repr(Rust)]` to be ABI-compatible with their non-1ZST field." rust#141947 **Link:** https://github.com/rust-lang/rust/pull/141947 ### "lexer: Treat more floats with empty exponent as valid tokens" rust#131656 **Link:** https://github.com/rust-lang/rust/pull/131656 ### "Permit duplicate imports" rust#141043 **Link:** https://github.com/rust-lang/rust/pull/141043 ### "`repr(tag = ...)` for type aliases" rfcs#3659 **Link:** https://github.com/rust-lang/rfcs/pull/3659 ### "Remove unstable cfg `target(...)` compact feature" rust#130780 **Link:** https://github.com/rust-lang/rust/pull/130780 ### "Add lint against (some) interior mutable consts" rust#132146 **Link:** https://github.com/rust-lang/rust/pull/132146 ### "Add new `function_casts_as_integer` lint" rust#141470 **Link:** https://github.com/rust-lang/rust/pull/141470 ### "#[cold] on match arms" rust#120193 **Link:** https://github.com/rust-lang/rust/pull/120193 ### "const-eval: allow constants to refer to mutable/external memory, but reject such constants as patterns" rust#140942 **Link:** https://github.com/rust-lang/rust/pull/140942 ### "Stabilize `if let` guards (`feature(if_let_guard)`)" rust#141295 **Link:** https://github.com/rust-lang/rust/pull/141295 ### "Permissions" rfcs#3380 **Link:** https://github.com/rust-lang/rfcs/pull/3380 ### "Rename `AsyncIterator` back to `Stream`, introduce an AFIT-based `AsyncIterator` trait" rust#119550 **Link:** https://github.com/rust-lang/rust/pull/119550 ### "Tracking Issue for `bare_link_kind`" rust#132061 **Link:** https://github.com/rust-lang/rust/issues/132061 ### "Add compiler support for namespaced crates" rust#140271 **Link:** https://github.com/rust-lang/rust/pull/140271 ## Proposed FCPs **Check your boxes!** ### "Fallback `{float}` to `f32` when `f32: From<{float}>` and add `impl From<f16> for f32`" rust#139087 **Link:** https://github.com/rust-lang/rust/pull/139087 ### "Arbitrary self types v2: stabilize" rust#135881 **Link:** https://github.com/rust-lang/rust/pull/135881 ### "Stabilize return type notation (RFC 3654)" rust#138424 **Link:** https://github.com/rust-lang/rust/pull/138424 ### "`core::marker::NoCell` in bounds (previously known an `Freeze`)" rfcs#3633 **Link:** https://github.com/rust-lang/rfcs/pull/3633 ### "Unsafe derives and attributes" rfcs#3715 **Link:** https://github.com/rust-lang/rfcs/pull/3715 ### "sanitizers: Stabilize AddressSanitizer and LeakSanitizer for the Tier 1 targets" rust#123617 **Link:** https://github.com/rust-lang/rust/pull/123617 ### "Add checking for unnecessary delims in closure body" rust#136906 **Link:** https://github.com/rust-lang/rust/pull/136906 ### "Permit duplicate imports" rust#141043 **Link:** https://github.com/rust-lang/rust/pull/141043 ### "RFC: enable `derive(From)` for single-field structs" rfcs#3809 **Link:** https://github.com/rust-lang/rfcs/pull/3809 ### "RFC: No (opsem) Magic Boxes" rfcs#3712 **Link:** https://github.com/rust-lang/rfcs/pull/3712 ### "Remove unstable cfg `target(...)` compact feature" rust#130780 **Link:** https://github.com/rust-lang/rust/pull/130780 ### "Warn about C-style octal literals" rust#131309 **Link:** https://github.com/rust-lang/rust/pull/131309 ### "Unsafe fields" rfcs#3458 **Link:** https://github.com/rust-lang/rfcs/pull/3458 ### "[RFC] externally implementable functions" rfcs#3632 **Link:** https://github.com/rust-lang/rfcs/pull/3632 ### "Closing issues relevant to T-lang on this repo" rfcs#3756 **Link:** https://github.com/rust-lang/rfcs/issues/3756 ### "Implement `PartialOrd` and `Ord` for `Discriminant`" rust#106418 **Link:** https://github.com/rust-lang/rust/pull/106418 ### "Policy for lint expansions" rust#122759 **Link:** https://github.com/rust-lang/rust/issues/122759 ### "Decide on path forward for attributes on expressions" rust#127436 **Link:** https://github.com/rust-lang/rust/issues/127436 ### "RFC: Allow type inference for const or static" rfcs#3546 **Link:** https://github.com/rust-lang/rfcs/pull/3546 ### "Allow `&&`, `||`, and `!` in `cfg`" rfcs#3796 **Link:** https://github.com/rust-lang/rfcs/pull/3796 ### "de-RFC: Remove unsized_locals" rfcs#3829 **Link:** https://github.com/rust-lang/rfcs/pull/3829 ### "Stabilize associated type position impl Trait (ATPIT)" rust#120700 **Link:** https://github.com/rust-lang/rust/pull/120700 ### "Allow while let chains on all editions" rust#140204 **Link:** https://github.com/rust-lang/rust/pull/140204 ### "Stabilize `#[cfg(version(...))]`, take 2" rust#141766 **Link:** https://github.com/rust-lang/rust/pull/141766 ### "new decision process" lang-team#326 **Link:** https://github.com/rust-lang/lang-team/pull/326 ## Active FCPs ### "Stabilize `derive(CoercePointee)`" rust#133820 **Link:** https://github.com/rust-lang/rust/pull/133820 ### "RFC: Add an attribute for raising the alignment of various items" rfcs#3806 **Link:** https://github.com/rust-lang/rfcs/pull/3806 ### "Declarative `macro_rules!` attribute macros" rfcs#3697 **Link:** https://github.com/rust-lang/rfcs/pull/3697 ### "Declarative `macro_rules!` derive macros" rfcs#3698 **Link:** https://github.com/rust-lang/rfcs/pull/3698 ### "const-eval: allow constants to refer to mutable/external memory, but reject such constants as patterns" rust#140942 **Link:** https://github.com/rust-lang/rust/pull/140942 ### " Allow storing `format_args!()` in variable" rust#140748 **Link:** https://github.com/rust-lang/rust/pull/140748 ### "Allow volatile access to non-Rust memory, including address 0" rust#141260 **Link:** https://github.com/rust-lang/rust/pull/141260 ### "Report never type lints in dependencies" rust#141937 **Link:** https://github.com/rust-lang/rust/pull/141937 ## P-critical issues None.

Import from clipboard

Paste your markdown or webpage here...

Advanced permission required

Your current role can only read. Ask the system administrator to acquire write and comment permission.

This team is disabled

Sorry, this team is disabled. You can't edit this note.

This note is locked

Sorry, only owner can edit this note.

Reach the limit

Sorry, you've reached the max length this note can be.
Please reduce the content or divide it to more notes, thank you!

Import from Gist

Import from Snippet

or

Export to Snippet

Are you sure?

Do you really want to delete this note?
All users will lose their connection.

Create a note from template

Create a note from template

Oops...
This template has been removed or transferred.
Upgrade
All
  • All
  • Team
No template.

Create a template

Upgrade

Delete template

Do you really want to delete this template?
Turn this template into a regular note and keep its content, versions, and comments.

This page need refresh

You have an incompatible client version.
Refresh to update.
New version available!
See releases notes here
Refresh to enjoy new features.
Your user state has changed.
Refresh to load new user state.

Sign in

Forgot password

or

By clicking below, you agree to our terms of service.

Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
Wallet ( )
Connect another wallet

New to HackMD? Sign up

Help

  • English
  • 中文
  • Français
  • Deutsch
  • 日本語
  • Español
  • Català
  • Ελληνικά
  • Português
  • italiano
  • Türkçe
  • Русский
  • Nederlands
  • hrvatski jezik
  • język polski
  • Українська
  • हिन्दी
  • svenska
  • Esperanto
  • dansk

Documents

Help & Tutorial

How to use Book mode

Slide Example

API Docs

Edit in VSCode

Install browser extension

Contacts

Feedback

Discord

Send us email

Resources

Releases

Pricing

Blog

Policy

Terms

Privacy

Cheatsheet

Syntax Example Reference
# Header Header 基本排版
- Unordered List
  • Unordered List
1. Ordered List
  1. Ordered List
- [ ] Todo List
  • Todo List
> Blockquote
Blockquote
**Bold font** Bold font
*Italics font* Italics font
~~Strikethrough~~ Strikethrough
19^th^ 19th
H~2~O H2O
++Inserted text++ Inserted text
==Marked text== Marked text
[link text](https:// "title") Link
![image alt](https:// "title") Image
`Code` Code 在筆記中貼入程式碼
```javascript
var i = 0;
```
var i = 0;
:smile: :smile: Emoji list
{%youtube youtube_id %} Externals
$L^aT_eX$ LaTeX
:::info
This is a alert area.
:::

This is a alert area.

Versions and GitHub Sync
Get Full History Access

  • Edit version name
  • Delete

revision author avatar     named on  

More Less

Note content is identical to the latest version.
Compare
    Choose a version
    No search result
    Version not found
Sign in to link this note to GitHub
Learn more
This note is not linked with GitHub
 

Feedback

Submission failed, please try again

Thanks for your support.

On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

Please give us some advice and help us improve HackMD.

 

Thanks for your feedback

Remove version name

Do you want to remove this version name and description?

Transfer ownership

Transfer to
    Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

      Link with GitHub

      Please authorize HackMD on GitHub
      • Please sign in to GitHub and install the HackMD app on your GitHub repo.
      • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
      Learn more  Sign in to GitHub

      Push the note to GitHub Push to GitHub Pull a file from GitHub

        Authorize again
       

      Choose which file to push to

      Select repo
      Refresh Authorize more repos
      Select branch
      Select file
      Select branch
      Choose version(s) to push
      • Save a new version and push
      • Choose from existing versions
      Include title and tags
      Available push count

      Pull from GitHub

       
      File from GitHub
      File from HackMD

      GitHub Link Settings

      File linked

      Linked by
      File path
      Last synced branch
      Available push count

      Danger Zone

      Unlink
      You will no longer receive notification when GitHub file changes after unlink.

      Syncing

      Push failed

      Push successfully