Skip to content

println!(), derive(Debug), derive(Clone), and probably many other macros break when using the elided_lifetimes_in_paths lint #51903

Closed

Description

@reuvenpo

in the latest stable compiler(1.27) (and probably earlier ones too) this snippet won't compile:

#![deny(elided_lifetimes_in_paths)]


#[derive(Debug)]
struct Foo {
    a: i32,
    b: i32,
}

#[derive(Debug)]
struct Bar<'a> {
    a: &'a Foo,
}

fn fun<'a>() {
    let foo = Foo {a: 1, b: 2};
    let bar = Bar::<'a> {a: &foo};
    println!("{}", bar);
}

fn main() {
    fun();
}

The issue is that the code is perfectly fine. The compilation errors come from the macros used:

error: hidden lifetime parameters are deprecated, try `Foo<'_>`
  --> src/main.rs:18:5
   |
18 |     println!("{}", bar);
   |     ^^^^^^^^^^^^^^^^^^^^
   |
note: lint level defined here
  --> src/main.rs:1:9
   |
1  | #![deny(elided_lifetimes_in_paths)]
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error: hidden lifetime parameters are deprecated, try `Foo<'_>`
  --> src/main.rs:18:5
   |
18 |     println!("{}", bar);
   |     ^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error: hidden lifetime parameters are deprecated, try `Foo<'_>`
 --> src/main.rs:4:10
  |
4 | #[derive(Debug)]
  |          ^^^^^

error: hidden lifetime parameters are deprecated, try `Foo<'_>`
  --> src/main.rs:10:10
   |
10 | #[derive(Debug)]
   |          ^^^^^

error: hidden lifetime parameters are deprecated, try `Foo<'_>`

error: aborting due to 5 previous errors

The user of these macros + lint can't do anything to fix the errors. It seems as though at least some macro definitions in the standard library aren't ready for this lint yet.

See also #51902.

Note, the lint is still useful (actually helped me figure out some issues i had), but can't be left on because of these bugs.

Activity

  1. changed the title [-]println!(), derive(Debug), derive(Clone), and probably many other macros break when using elided_lifetimes_in_paths[/-] [+]println!(), derive(Debug), derive(Clone), and probably many other macros break when using the elided_lifetimes_in_paths lint[/+] on Jun 29, 2018
  2. added
    A-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.
    A-lifetimesArea: Lifetimes / regions
    on Jun 29, 2018
  3. added
    C-enhancementCategory: An issue proposing an enhancement or a PR with one.
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Jul 11, 2018
  4. zackmdavis commented on Oct 31, 2018

    @zackmdavis
    Contributor

    The lint was rewritten in #52069. With some borrow-checker fixes (and {:?} instead of {}), the example now works:

    #![deny(elided_lifetimes_in_paths)]
    
    #[derive(Debug)]
    struct Foo {
        a: i32,
        b: i32,
    }
    
    #[derive(Debug)]
    struct Bar<'a> {
        a: &'a Foo,
    }
    
    fn fun<'a>(foo: &'a Foo) {
        let bar = Bar::<'a> {a: &foo};
        println!("{:?}", bar);
    }
    
    fn main() {
        let foo = Foo { a: 1, b: 2 };
        fun(&foo);
    }
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-lifetimesArea: Lifetimes / regionsA-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.C-enhancementCategory: An issue proposing an enhancement or a PR with one.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions