about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2023-11-15 16:56:41 +0000
committerEsteban Küber <esteban@kuber.com.ar>2023-11-20 23:44:37 +0000
commit2a92d820c79e56be8191bdf64e8b2dc7c96210df (patch)
tree0d0fe4dbdec15d9b0b0b93deedc7c2cf0121ee8a
parentdec7f00e158f04054320f63796fea1445ac18917 (diff)
downloadrust-2a92d820c79e56be8191bdf64e8b2dc7c96210df.tar.gz
rust-2a92d820c79e56be8191bdf64e8b2dc7c96210df.zip
Suggest 'a when trait object assoc type has '_
-rw-r--r--compiler/rustc_resolve/src/late/diagnostics.rs33
-rw-r--r--tests/ui/suggestions/impl-trait-missing-lifetime-gated.stderr8
-rw-r--r--tests/ui/suggestions/impl-trait-missing-lifetime.stderr8
3 files changed, 37 insertions, 12 deletions
diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs
index ce981c333d8..984516baa18 100644
--- a/compiler/rustc_resolve/src/late/diagnostics.rs
+++ b/compiler/rustc_resolve/src/late/diagnostics.rs
@@ -2971,9 +2971,13 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
                     // we identified that the return expression references only one argument, we
                     // would suggest borrowing only that argument, and we'd skip the prior
                     // "use `'static`" suggestion entirely.
-                    if let [lt] = &lifetime_refs[..] && lt.kind == MissingLifetimeKind::Ampersand {
-                        let pre = if let Some((kind, _span)) =
-                            self.diagnostic_metadata.current_function
+                    if let [lt] = &lifetime_refs[..]
+                        && (lt.kind == MissingLifetimeKind::Ampersand
+                            || lt.kind == MissingLifetimeKind::Underscore)
+                    {
+                        let pre = if lt.kind == MissingLifetimeKind::Ampersand
+                            && let Some((kind, _span)) =
+                                self.diagnostic_metadata.current_function
                             && let FnKind::Fn(_, _, sig, _, _, _) = kind
                             && !sig.decl.inputs.is_empty()
                             && let sugg = sig
@@ -3013,8 +3017,10 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
                                 Applicability::MaybeIncorrect,
                             );
                             "...or alternatively, you might want"
-                        } else if let Some((kind, _span)) =
-                            self.diagnostic_metadata.current_function
+                        } else if (lt.kind == MissingLifetimeKind::Ampersand
+                                || lt.kind == MissingLifetimeKind::Underscore)
+                            && let Some((kind, _span)) =
+                                self.diagnostic_metadata.current_function
                             && let FnKind::Fn(_, _, sig, _, _, _) = kind
                             && let ast::FnRetTy::Ty(ret_ty) = &sig.decl.output
                             && !sig.decl.inputs.is_empty()
@@ -3059,7 +3065,6 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
                                 err,
                                 None,
                                 |err, higher_ranked, span, message, intro_sugg| {
-                                    info!(?span, ?message, ?intro_sugg);
                                     err.multipart_suggestion_verbose(
                                         message,
                                         std::iter::once((span, intro_sugg))
@@ -3093,7 +3098,9 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
                                     && segments[0].ident.name == sym::str
                                 {
                                     // Don't suggest `-> str`, suggest `-> String`.
-                                    sugg = vec![(lt.span.with_hi(ty.span.hi()), "String".to_string())];
+                                    sugg = vec![
+                                        (lt.span.with_hi(ty.span.hi()), "String".to_string()),
+                                    ];
                                 }
                                 if let TyKind::Slice(inner_ty) = &ty.kind {
                                     // Don't suggest `-> [T]`, suggest `-> Vec<T>`.
@@ -3104,11 +3111,13 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
                                 }
                             }
                         };
-                        err.multipart_suggestion_verbose(
-                            format!("{pre} to return an owned value"),
-                            sugg,
-                            Applicability::MaybeIncorrect,
-                        );
+                        if lt.kind == MissingLifetimeKind::Ampersand {
+                            err.multipart_suggestion_verbose(
+                                format!("{pre} to return an owned value"),
+                                sugg,
+                                Applicability::MaybeIncorrect,
+                            );
+                        }
                     }
                 }
 
diff --git a/tests/ui/suggestions/impl-trait-missing-lifetime-gated.stderr b/tests/ui/suggestions/impl-trait-missing-lifetime-gated.stderr
index a1ab4392214..383cba75e28 100644
--- a/tests/ui/suggestions/impl-trait-missing-lifetime-gated.stderr
+++ b/tests/ui/suggestions/impl-trait-missing-lifetime-gated.stderr
@@ -51,6 +51,10 @@ help: consider using the `'static` lifetime, but this is uncommon unless you're
    |
 LL |     fn g(mut x: impl Iterator<Item = &'_ ()>) -> Option<&'static ()> { x.next() }
    |                                                          ~~~~~~~
+help: consider introducing a named lifetime parameter
+   |
+LL |     fn g<'a>(mut x: impl Iterator<Item = &'a ()>) -> Option<&'a ()> { x.next() }
+   |         ++++                             ~~~                ~~~
 
 error[E0106]: missing lifetime specifier
   --> $DIR/impl-trait-missing-lifetime-gated.rs:37:64
@@ -63,6 +67,10 @@ help: consider using the `'static` lifetime, but this is uncommon unless you're
    |
 LL |     async fn i(mut x: impl Iterator<Item = &'_ ()>) -> Option<&'static ()> { x.next() }
    |                                                                ~~~~~~~
+help: consider introducing a named lifetime parameter
+   |
+LL |     async fn i<'a>(mut x: impl Iterator<Item = &'a ()>) -> Option<&'a ()> { x.next() }
+   |               ++++                             ~~~                ~~~
 
 error[E0106]: missing lifetime specifier
   --> $DIR/impl-trait-missing-lifetime-gated.rs:47:37
diff --git a/tests/ui/suggestions/impl-trait-missing-lifetime.stderr b/tests/ui/suggestions/impl-trait-missing-lifetime.stderr
index 37c2ad2aaea..98b0ab82b3c 100644
--- a/tests/ui/suggestions/impl-trait-missing-lifetime.stderr
+++ b/tests/ui/suggestions/impl-trait-missing-lifetime.stderr
@@ -9,6 +9,10 @@ help: consider using the `'static` lifetime, but this is uncommon unless you're
    |
 LL | fn g(mut x: impl Iterator<Item = &'_ ()>) -> Option<&'static ()> { x.next() }
    |                                                      ~~~~~~~
+help: consider introducing a named lifetime parameter
+   |
+LL | fn g<'a>(mut x: impl Iterator<Item = &'a ()>) -> Option<&'a ()> { x.next() }
+   |     ++++                             ~~~                ~~~
 
 error[E0106]: missing lifetime specifier
   --> $DIR/impl-trait-missing-lifetime.rs:16:60
@@ -21,6 +25,10 @@ help: consider using the `'static` lifetime, but this is uncommon unless you're
    |
 LL | async fn i(mut x: impl Iterator<Item = &'_ ()>) -> Option<&'static ()> { x.next() }
    |                                                            ~~~~~~~
+help: consider introducing a named lifetime parameter
+   |
+LL | async fn i<'a>(mut x: impl Iterator<Item = &'a ()>) -> Option<&'a ()> { x.next() }
+   |           ++++                             ~~~                ~~~
 
 error: lifetime may not live long enough
   --> $DIR/impl-trait-missing-lifetime.rs:16:69