Skip to content

Split elided_lifetime_in_paths into finer-grained lints #120808

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions tests/ui/lifetimes/elided-lifetimes-in-type-paths.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#![deny(elided_lifetimes_in_paths)]

// Most of the time, we focus on elided lifetimes in function
// signatures, but they can also appear in other places! The original
// version of this lint handled all these cases in one location, but
// it's desired that the one lint actually be multiple.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (wording): maybe for clarity (I was reading this, and it wasn't immediately clear)

Most of the time, we focus on elided lifetimes in function signatures, but they can also appear in other places! The original lint elided_lifetime_in_paths handled all these cases in one location, but it's more desirable to split it into 3 more fine-grained lints under a new hidden_lifetimes_in_paths lint group umbrella:

  1. hidden_lifetimes_in_input_paths
  2. hidden_lifetimes_in_output_paths
  3. hidden_lifetimes_in_type_paths


struct ContainsLifetime<'a>(&'a u8);

impl<'a> ContainsLifetime<'a> {
fn use_it() {}
}

struct ContainsLifetimeAndType<'a, T>(&'a T);

impl<'a, T> ContainsLifetimeAndType<'a, T> {
fn use_it() {}
}

fn use_via_turbofish<T>() {}

trait UseViaTrait {
fn use_it() {}
}

impl UseViaTrait for ContainsLifetime<'_> {}

trait TraitWithLifetime<'a> {
fn use_it() {}
}

impl<'a> TraitWithLifetime<'a> for u8 {}

// ==========

static USE_VIA_STATIC: ContainsLifetime = ContainsLifetime(&42);
//~^ ERROR hidden lifetime parameters

fn main() {
use_via_turbofish::<ContainsLifetime>();
//~^ ERROR hidden lifetime parameters

let _use_via_binding: ContainsLifetime;
//~^ ERROR hidden lifetime parameters

<ContainsLifetime as UseViaTrait>::use_it();
//~^ ERROR hidden lifetime parameters

<ContainsLifetime>::use_it();
//~^ ERROR hidden lifetime parameters

ContainsLifetime::use_it();

ContainsLifetimeAndType::<u8>::use_it();

<u8 as TraitWithLifetime>::use_it();
}
62 changes: 62 additions & 0 deletions tests/ui/lifetimes/elided-lifetimes-in-type-paths.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
error: hidden lifetime parameters in types are deprecated
--> $DIR/elided-lifetimes-in-type-paths.rs:36:24
|
LL | static USE_VIA_STATIC: ContainsLifetime = ContainsLifetime(&42);
| ^^^^^^^^^^^^^^^^ expected lifetime parameter
|
note: the lint level is defined here
--> $DIR/elided-lifetimes-in-type-paths.rs:1:9
|
LL | #![deny(elided_lifetimes_in_paths)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^
help: indicate the anonymous lifetime
|
LL | static USE_VIA_STATIC: ContainsLifetime<'_> = ContainsLifetime(&42);
| ++++

error: hidden lifetime parameters in types are deprecated
--> $DIR/elided-lifetimes-in-type-paths.rs:40:25
|
LL | use_via_turbofish::<ContainsLifetime>();
| ^^^^^^^^^^^^^^^^ expected lifetime parameter
|
help: indicate the anonymous lifetime
|
LL | use_via_turbofish::<ContainsLifetime<'_>>();
| ++++

error: hidden lifetime parameters in types are deprecated
--> $DIR/elided-lifetimes-in-type-paths.rs:43:27
|
LL | let _use_via_binding: ContainsLifetime;
| ^^^^^^^^^^^^^^^^ expected lifetime parameter
|
help: indicate the anonymous lifetime
|
LL | let _use_via_binding: ContainsLifetime<'_>;
| ++++

error: hidden lifetime parameters in types are deprecated
--> $DIR/elided-lifetimes-in-type-paths.rs:46:6
|
LL | <ContainsLifetime as UseViaTrait>::use_it();
| ^^^^^^^^^^^^^^^^ expected lifetime parameter
|
help: indicate the anonymous lifetime
|
LL | <ContainsLifetime<'_> as UseViaTrait>::use_it();
| ++++

error: hidden lifetime parameters in types are deprecated
--> $DIR/elided-lifetimes-in-type-paths.rs:49:6
|
LL | <ContainsLifetime>::use_it();
| ^^^^^^^^^^^^^^^^ expected lifetime parameter
|
help: indicate the anonymous lifetime
|
LL | <ContainsLifetime<'_>>::use_it();
| ++++

error: aborting due to 5 previous errors