Skip to content

Elided lifetime changes in rust_2018_idioms lint is very noisy and results in dramatically degraded APIs for Bevy #131725

Open

Description

@alice-i-cecile

Problem

With the upcoming release of Rust 2024 edition, we're concerned that rust_2018_idioms will be deny by default.

[Editorial comment (TC): This is not an edition item for Rust 2024, and the edition is not accepting any new items, so we can say definitely that this will not be tied to the release of Rust 2024. See here.]

We investigated what these changes will entail for Bevy in bevyengine/bevy#15916, and the impact is quite severe. Our primary user-facing system and query APIs are littered with meaningless lifetimes.

This is a much worse experience with no upside for us, and Bevy and its entire ecosystem will have to manually allow this lint on every project.

Proposed solution

We would appreciate if the elided lifetimes lint could be split out from the rest of the rust_2018_idioms linting, which we generally liked the effect of.

Ideally this would be off by default as well, to avoid needing to teach new users to turn it off as a critical part of project setup.

Activity

  1. added
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Oct 15, 2024
  2. added
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    and removed
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Oct 15, 2024
  3. alice-i-cecile commented on Oct 15, 2024

    @alice-i-cecile
    Author

    Here's an example of some in-production code after this lint was applied:

    pub fn update_text2d_layout(
        // Text items which should be reprocessed again, generally when the font hasn't loaded yet.
        mut queue: Local<'_, HashSet<Entity>>,
        mut textures: ResMut<'_, Assets<Image>>,
        fonts: Res<'_, Assets<Font>>,
        windows: Query<'_, '_, &Window, With<PrimaryWindow>>,
        mut scale_factor_changed: EventReader<'_, '_, WindowScaleFactorChanged>,
        mut texture_atlases: ResMut<'_, Assets<TextureAtlasLayout>>,
        mut font_atlas_sets: ResMut<'_, FontAtlasSets>,
        mut text_pipeline: ResMut<'_, TextPipeline>,
        mut text_query: Query<'_, '_, (
            Entity,
            Ref<'_, TextLayout>,
            Ref<'_, TextBounds>,
            &mut TextLayoutInfo,
            &mut ComputedTextBlock,
        )>,
        mut text_reader: Text2dReader<'_, '_>,
        mut font_system: ResMut<'_, CosmicFontSystem>,
        mut swash_cache: ResMut<'_, SwashCache>,
    ) {
  4. jieyouxu commented on Oct 15, 2024

    @jieyouxu
    Member

    Since this seems to have potential non-minimal ecosystem impact, nominating for T-lang discussion.
    @rustbot label +I-lang-nominated

  5. added
    C-discussionCategory: Discussion or questions that doesn't represent real issues.
    and removed
    I-lang-nominatedNominated for discussion during a lang team meeting.
    on Oct 15, 2024
  6. alice-i-cecile commented on Oct 15, 2024

    @alice-i-cecile
    Author

    Turning this on by default is tracked in #54910 and #91639.

  7. removed
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Oct 15, 2024
  8. added
    A-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.
    on Oct 15, 2024
  9. 16 remaining items

  10. traviscross commented on Oct 16, 2024

    @traviscross
    Contributor

    @rustbot labels -A-edition-2024

    @alice-i-cecile: If you could, could you please link to what led you to believe this is true?:

    With the upcoming release of Rust 2024 edition, rust_2018_idioms will be deny by default.

    For reference, this program is currently accepted in nightly Rust 2024:

    //@ edition: 2024
    //#![deny(rust_2018_idioms)]
    
    struct S<'a>(&'a ());
    
    fn f(x: &()) -> S {
        S(x)
    }
    
    fn main() {}

    Playground link

    There are no open edition items for Rust 2024 that would change this behavior.

  11. alice-i-cecile commented on Oct 16, 2024

    @alice-i-cecile
    Author

    This was due to the presence of #54910 in the Lang Edition 2024 project :)

  12. traviscross commented on Oct 16, 2024

    @traviscross
    Contributor

    Thanks, that's helpful. It was just an idea. There were a lot of ideas that didn't become actual edition items.

    We've passed the go / no go date for all edition items for Rust 2024. The probability of this change happening in a way tied to the release of the Rust 2024 edition is now zero.

  13. musjj commented on Nov 6, 2024

    @musjj

    Will anything change for async functions: #103470?

    Right now, elided lifetimes is a hard error for async functions:

    struct Foo<'a> {
        a: &'a String,
    }
    
    fn hello(_foo: Foo) {} // no warning
    
    async fn hello(_foo: Foo) {} // implicit elided lifetime not allowed here

    It feels really confusing for it to be allowed in regular functions, but not async ones.

  14. shepmaster commented on Nov 6, 2024

    @shepmaster
    Member

    My take is that it's unlikely to change in the near future.

    I have discussion of choices in my pull request (look for "Existing hard errors").

  15. added
    I-lang-radarItems that are on lang's radar and will need eventual work or consideration.
    and removed
    I-lang-nominatedNominated for discussion during a lang team meeting.
    on Jan 26, 2025
  16. added a commit that references this issue on Aug 9, 2025
  17. theemathas commented on Sep 12, 2025

    @theemathas
    Contributor

    @shepmaster Your PR doesn't mention such a thing. What's the status of this?

  18. shepmaster commented on Sep 12, 2025

    @shepmaster
    Member

    What's the status of this?

    Assuming that "this" means what is discussed in the comment from a year ago and not the entire issue, then running the code from that comment shows that the error is still present, mirroring my previous comment that it was unlikely to change.

    If you mean some other topic, feel free to elaborate!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-edition-2018Area: The 2018 editionA-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.C-discussionCategory: Discussion or questions that doesn't represent real issues.I-lang-radarItems that are on lang's radar and will need eventual work or consideration.L-elided_lifetimes_in_pathsLint: elided_lifetimes_in_pathsT-langRelevant to the language team

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions