diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-01-20 09:37:28 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-20 09:37:28 +0100 |
| commit | b7c2ba71c8ee838fc5e31d6c8eb320f4e976ce0f (patch) | |
| tree | a2b8a468df3a92da0597dfda3745e6f72821ed34 | |
| parent | 409949bc233a75a45e646c4f720ac50f2dc52709 (diff) | |
| parent | de2575f35d46dfa2b24eb205ef133a679bff1b31 (diff) | |
| download | rust-b7c2ba71c8ee838fc5e31d6c8eb320f4e976ce0f.tar.gz rust-b7c2ba71c8ee838fc5e31d6c8eb320f4e976ce0f.zip | |
Rollup merge of #120148 - trevyn:issue-117965, r=cjgillot
`single_use_lifetimes`: Don't suggest deleting lifetimes with bounds
Closes #117965
```
9 | pub fn get<'b: 'a>(&'b self) -> &'a str {
| ^^ -- ...is used only here
| |
| this lifetime...
```
In this example, I think the `&'b self` can be replaced with the bound itself, yielding `&'a self`, but this would require a deeper refactor. Happy to do as a follow-on PR if desired.
| -rw-r--r-- | compiler/rustc_resolve/src/late/diagnostics.rs | 3 | ||||
| -rw-r--r-- | tests/ui/single-use-lifetime/issue-117965.rs | 18 | ||||
| -rw-r--r-- | tests/ui/single-use-lifetime/issue-117965.stderr | 16 |
3 files changed, 36 insertions, 1 deletions
diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index 5a95f2083f6..abb0a7a465a 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -2567,8 +2567,9 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> { debug!(?param.ident, ?param.ident.span, ?use_span); let elidable = matches!(use_ctxt, LifetimeCtxt::Ref); + let deletion_span = + if param.bounds.is_empty() { deletion_span() } else { None }; - let deletion_span = deletion_span(); self.r.lint_buffer.buffer_lint_with_diagnostic( lint::builtin::SINGLE_USE_LIFETIMES, param.id, diff --git a/tests/ui/single-use-lifetime/issue-117965.rs b/tests/ui/single-use-lifetime/issue-117965.rs new file mode 100644 index 00000000000..5eb2a03e13d --- /dev/null +++ b/tests/ui/single-use-lifetime/issue-117965.rs @@ -0,0 +1,18 @@ +#![deny(single_use_lifetimes)] + +pub enum Data<'a> { + Borrowed(&'a str), + Owned(String), +} + +impl<'a> Data<'a> { + pub fn get<'b: 'a>(&'b self) -> &'a str { + //~^ ERROR lifetime parameter `'b` only used once + match &self { + Self::Borrowed(val) => val, + Self::Owned(val) => &val, + } + } +} + +fn main() {} diff --git a/tests/ui/single-use-lifetime/issue-117965.stderr b/tests/ui/single-use-lifetime/issue-117965.stderr new file mode 100644 index 00000000000..ed14ab92f4d --- /dev/null +++ b/tests/ui/single-use-lifetime/issue-117965.stderr @@ -0,0 +1,16 @@ +error: lifetime parameter `'b` only used once + --> $DIR/issue-117965.rs:9:16 + | +LL | pub fn get<'b: 'a>(&'b self) -> &'a str { + | ^^ -- ...is used only here + | | + | this lifetime... + | +note: the lint level is defined here + --> $DIR/issue-117965.rs:1:9 + | +LL | #![deny(single_use_lifetimes)] + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error + |
