From 04804c713ea269ea9599ff6b690740cb0106f2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 17 Jan 2025 01:05:15 +0000 Subject: [PATCH] Tweak wording in associated type with anon lifetime error Move the previous long message to a note and use a shorter primary message: ``` error: missing lifetime in associated type --> $DIR/missing-lifetime-in-assoc-type-1.rs:9:17 | LL | impl<'a> IntoIterator for &S { | ---- there is a named lifetime specified on the impl block you could use ... LL | type Item = &T; | ^ this lifetime must come from the implemented type | note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL help: consider using the lifetime from the impl block | LL | type Item = &'a T; | ++ ``` --- compiler/rustc_resolve/messages.ftl | 4 +- compiler/rustc_resolve/src/errors.rs | 2 + compiler/rustc_resolve/src/late.rs | 38 ++++++++++++++++--- .../assoc-type.rs | 6 +-- .../assoc-type.stderr | 9 +++-- .../missing-lifetime-in-assoc-type-1.rs | 3 +- .../missing-lifetime-in-assoc-type-1.stderr | 4 +- .../missing-lifetime-in-assoc-type-2.rs | 2 +- .../missing-lifetime-in-assoc-type-2.stderr | 4 +- .../missing-lifetime-in-assoc-type-3.rs | 2 +- .../missing-lifetime-in-assoc-type-3.stderr | 4 +- .../missing-lifetime-in-assoc-type-4.rs | 2 +- .../missing-lifetime-in-assoc-type-4.stderr | 4 +- .../missing-lifetime-in-assoc-type-5.rs | 3 +- .../missing-lifetime-in-assoc-type-5.stderr | 4 +- .../missing-lifetime-in-assoc-type-6.rs | 26 +++++++++++++ .../missing-lifetime-in-assoc-type-6.stderr | 30 +++++++++++++++ tests/ui/lifetimes/no_lending_iterators.rs | 2 +- .../ui/lifetimes/no_lending_iterators.stderr | 4 +- 19 files changed, 128 insertions(+), 25 deletions(-) create mode 100644 tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.rs create mode 100644 tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.stderr diff --git a/compiler/rustc_resolve/messages.ftl b/compiler/rustc_resolve/messages.ftl index 5bf90d2637df..f5a3363c50d3 100644 --- a/compiler/rustc_resolve/messages.ftl +++ b/compiler/rustc_resolve/messages.ftl @@ -11,9 +11,9 @@ resolve_added_macro_use = resolve_ancestor_only = visibilities can only be restricted to ancestor modules -resolve_anonymous_lifetime_non_gat_report_error = - in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +resolve_anonymous_lifetime_non_gat_report_error = missing lifetime in associated type .label = this lifetime must come from the implemented type + .note = in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type resolve_arguments_macro_use_not_allowed = arguments to `macro_use` are not allowed here diff --git a/compiler/rustc_resolve/src/errors.rs b/compiler/rustc_resolve/src/errors.rs index f0ea97ba8a0c..8b06230c7667 100644 --- a/compiler/rustc_resolve/src/errors.rs +++ b/compiler/rustc_resolve/src/errors.rs @@ -930,6 +930,8 @@ pub(crate) struct AnonymousLifetimeNonGatReportError { #[primary_span] #[label] pub(crate) lifetime: Span, + #[note] + pub(crate) decl: MultiSpan, } #[derive(Subdiagnostic)] diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index bc5bae0b46d5..3b03e21fcd56 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -20,21 +20,21 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; use rustc_data_structures::unord::{UnordMap, UnordSet}; use rustc_errors::codes::*; use rustc_errors::{ - Applicability, Diag, DiagArgValue, ErrorGuaranteed, IntoDiagArg, StashKey, Suggestions, - pluralize, + Applicability, Diag, DiagArgValue, ErrorGuaranteed, IntoDiagArg, MultiSpan, StashKey, + Suggestions, pluralize, }; use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::{self, CtorKind, DefKind, LifetimeRes, NonMacroAttrKind, PartialRes, PerNS}; use rustc_hir::def_id::{CRATE_DEF_ID, DefId, LOCAL_CRATE, LocalDefId}; use rustc_hir::{MissingLifetimeKind, PrimTy, TraitCandidate}; use rustc_middle::middle::resolve_bound_vars::Set1; -use rustc_middle::ty::{DelegationFnSig, Visibility}; +use rustc_middle::ty::{AssocTag, DelegationFnSig, Visibility}; use rustc_middle::{bug, span_bug}; use rustc_session::config::{CrateType, ResolveDocLinks}; use rustc_session::lint; use rustc_session::parse::feature_err; use rustc_span::source_map::{Spanned, respan}; -use rustc_span::{BytePos, Ident, Span, Symbol, SyntaxContext, kw, sym}; +use rustc_span::{BytePos, DUMMY_SP, Ident, Span, Symbol, SyntaxContext, kw, sym}; use smallvec::{SmallVec, smallvec}; use thin_vec::ThinVec; use tracing::{debug, instrument, trace}; @@ -725,6 +725,9 @@ struct DiagMetadata<'ast> { /// The current impl items (used to suggest). current_impl_items: Option<&'ast [Box]>, + /// The current impl items (used to suggest). + current_impl_item: Option<&'ast AssocItem>, + /// When processing impl trait currently_processing_impl_trait: Option<(TraitRef, Ty)>, @@ -1878,9 +1881,31 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { ty: ty.span, }); } else { + let decl = if !trait_id.is_local() + && let Some(assoc) = self.diag_metadata.current_impl_item + && let AssocItemKind::Type(_) = assoc.kind + && let assocs = self.r.tcx.associated_items(trait_id) + && let Some(ident) = assoc.kind.ident() + && let Some(assoc) = assocs.find_by_ident_and_kind( + self.r.tcx, + ident, + AssocTag::Type, + trait_id, + ) { + let mut decl: MultiSpan = + self.r.tcx.def_span(assoc.def_id).into(); + decl.push_span_label( + self.r.tcx.def_span(trait_id), + String::new(), + ); + decl + } else { + DUMMY_SP.into() + }; let mut err = self.r.dcx().create_err( errors::AnonymousLifetimeNonGatReportError { lifetime: lifetime.ident.span, + decl, }, ); self.point_at_impl_lifetimes(&mut err, i, lifetime.ident.span); @@ -1993,7 +2018,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { } else if let Some(item) = &self.diag_metadata.current_item && let ItemKind::Impl(impl_) = &item.kind && let Some(of_trait) = &impl_.of_trait - && let ControlFlow::Break(sp) = AnonRefFinder.visit_trait_ref(of_trait) + && let ControlFlow::Break(sp) = AnonRefFinder.visit_trait_ref(&of_trait.trait_ref) { err.multipart_suggestion_verbose( "add a lifetime to the impl block and use it in the trait and associated type", @@ -3354,6 +3379,8 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { ) { use crate::ResolutionError::*; self.resolve_doc_links(&item.attrs, MaybeExported::ImplItem(trait_id.ok_or(&item.vis))); + let prev = self.diag_metadata.current_impl_item.take(); + self.diag_metadata.current_impl_item = Some(&item); match &item.kind { AssocItemKind::Const(box ast::ConstItem { ident, @@ -3502,6 +3529,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { panic!("unexpanded macro in resolve!") } } + self.diag_metadata.current_impl_item = prev; } fn check_trait_item( diff --git a/tests/ui/impl-header-lifetime-elision/assoc-type.rs b/tests/ui/impl-header-lifetime-elision/assoc-type.rs index e999bd02db26..f03a110d7dc1 100644 --- a/tests/ui/impl-header-lifetime-elision/assoc-type.rs +++ b/tests/ui/impl-header-lifetime-elision/assoc-type.rs @@ -9,7 +9,7 @@ trait MyTrait { impl MyTrait for &i32 { type Output = &i32; - //~^ ERROR in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + //~^ ERROR missing lifetime in associated type } impl MyTrait for &u32 { @@ -19,7 +19,7 @@ impl MyTrait for &u32 { impl<'a> MyTrait for &f64 { type Output = &f64; - //~^ ERROR in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + //~^ ERROR missing lifetime in associated type } trait OtherTrait<'a> { @@ -27,7 +27,7 @@ trait OtherTrait<'a> { } impl OtherTrait<'_> for f64 { type Output = &f64; - //~^ ERROR in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + //~^ ERROR missing lifetime in associated type } // This is what you have to do: diff --git a/tests/ui/impl-header-lifetime-elision/assoc-type.stderr b/tests/ui/impl-header-lifetime-elision/assoc-type.stderr index 933ed3efec5d..201ea2d894eb 100644 --- a/tests/ui/impl-header-lifetime-elision/assoc-type.stderr +++ b/tests/ui/impl-header-lifetime-elision/assoc-type.stderr @@ -1,9 +1,10 @@ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/assoc-type.rs:11:19 | LL | type Output = &i32; | ^ this lifetime must come from the implemented type | + = note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type help: add a lifetime to the impl block and use it in the self type and associated type | LL ~ impl<'a> MyTrait for &'a i32 { @@ -16,7 +17,7 @@ error[E0637]: `'_` cannot be used here LL | type Output = &'_ i32; | ^^ `'_` is a reserved lifetime name -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/assoc-type.rs:21:19 | LL | impl<'a> MyTrait for &f64 { @@ -24,17 +25,19 @@ LL | impl<'a> MyTrait for &f64 { LL | type Output = &f64; | ^ this lifetime must come from the implemented type | + = note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type help: consider using the lifetime from the impl block | LL | type Output = &'a f64; | ++ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/assoc-type.rs:29:19 | LL | type Output = &f64; | ^ this lifetime must come from the implemented type | + = note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type help: add a lifetime to the impl block and use it in the trait and associated type | LL ~ impl<'a> OtherTrait<'a> for f64 { diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.rs b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.rs index 5401bc4ecb87..3d02d1bb1bd8 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.rs +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.rs @@ -7,9 +7,10 @@ impl<'a> IntoIterator for &S { //~| NOTE unconstrained lifetime parameter //~| HELP consider using the named lifetime here instead of an implicit lifetime type Item = &T; - //~^ ERROR in the trait associated type + //~^ ERROR missing lifetime in associated type //~| HELP consider using the lifetime from the impl block //~| NOTE this lifetime must come from the implemented type + //~| NOTE in the trait the associated type is declared without lifetime parameters type IntoIter = std::collections::btree_map::Values<'a, i32, T>; fn into_iter(self) -> Self::IntoIter { diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.stderr b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.stderr index feac49eb0ff5..3374c76bb76b 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.stderr +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-1.stderr @@ -1,4 +1,4 @@ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/missing-lifetime-in-assoc-type-1.rs:9:17 | LL | impl<'a> IntoIterator for &S { @@ -7,6 +7,8 @@ LL | impl<'a> IntoIterator for &S { LL | type Item = &T; | ^ this lifetime must come from the implemented type | +note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL help: consider using the lifetime from the impl block | LL | type Item = &'a T; diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.rs b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.rs index dd720f075ac4..d24aaaf8b10e 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.rs +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.rs @@ -3,7 +3,7 @@ struct T; impl IntoIterator for &S { type Item = &T; - //~^ ERROR in the trait associated type + //~^ ERROR missing lifetime in associated type type IntoIter = std::collections::btree_map::Values<'a, i32, T>; //~^ ERROR use of undeclared lifetime name `'a` diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.stderr b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.stderr index cd6fa2894ad2..9d9d2bc97d90 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.stderr +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-2.stderr @@ -1,9 +1,11 @@ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/missing-lifetime-in-assoc-type-2.rs:5:17 | LL | type Item = &T; | ^ this lifetime must come from the implemented type | +note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL help: add a lifetime to the impl block and use it in the self type and associated type | LL ~ impl<'a> IntoIterator for &'a S { diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.rs b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.rs index 60d1f0f8fe57..cf745ab97eb3 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.rs +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.rs @@ -3,7 +3,7 @@ struct T; impl IntoIterator for &S { type Item = &T; - //~^ ERROR in the trait associated type + //~^ ERROR missing lifetime in associated type type IntoIter = std::collections::btree_map::Values; //~^ ERROR missing lifetime specifier diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.stderr b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.stderr index a71042fa9872..b5811dc8ff27 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.stderr +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-3.stderr @@ -1,9 +1,11 @@ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/missing-lifetime-in-assoc-type-3.rs:5:17 | LL | type Item = &T; | ^ this lifetime must come from the implemented type | +note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL help: add a lifetime to the impl block and use it in the self type and associated type | LL ~ impl<'a> IntoIterator for &'a S { diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.rs b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.rs index 0c99e8874c35..138f6d7bdf2f 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.rs +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.rs @@ -3,7 +3,7 @@ struct T; impl IntoIterator for &S { type Item = &T; - //~^ ERROR in the trait associated type + //~^ ERROR missing lifetime in associated type type IntoIter<'a> = std::collections::btree_map::Values<'a, i32, T>; //~^ ERROR lifetime parameters or bounds on associated type `IntoIter` do not match the trait declaration diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.stderr b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.stderr index 8481b60f845a..ccc0d7ebae9f 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.stderr +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-4.stderr @@ -1,9 +1,11 @@ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/missing-lifetime-in-assoc-type-4.rs:5:17 | LL | type Item = &T; | ^ this lifetime must come from the implemented type | +note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL help: add a lifetime to the impl block and use it in the self type and associated type | LL ~ impl<'a> IntoIterator for &'a S { diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.rs b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.rs index 17cca7cc9e37..853cc6dc8e4e 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.rs +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.rs @@ -7,9 +7,10 @@ impl<'a> IntoIterator for &'_ S { //~| NOTE unconstrained lifetime parameter //~| HELP consider using the named lifetime here instead of an implicit lifetime type Item = &T; - //~^ ERROR in the trait associated type + //~^ ERROR missing lifetime in associated type //~| HELP consider using the lifetime from the impl block //~| NOTE this lifetime must come from the implemented type + //~| NOTE in the trait the associated type is declared without lifetime parameters type IntoIter = std::collections::btree_map::Values<'a, i32, T>; fn into_iter(self) -> Self::IntoIter { diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.stderr b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.stderr index cb15bcb7d504..d58fd8995ef9 100644 --- a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.stderr +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-5.stderr @@ -1,4 +1,4 @@ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/missing-lifetime-in-assoc-type-5.rs:9:17 | LL | impl<'a> IntoIterator for &'_ S { @@ -7,6 +7,8 @@ LL | impl<'a> IntoIterator for &'_ S { LL | type Item = &T; | ^ this lifetime must come from the implemented type | +note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL help: consider using the lifetime from the impl block | LL | type Item = &'a T; diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.rs b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.rs new file mode 100644 index 000000000000..036596c2aec6 --- /dev/null +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.rs @@ -0,0 +1,26 @@ +//~ NOTE in the trait the associated type is declared without lifetime parameters +struct S; +struct T; + +trait Trait { + type Item; + type IntoIter; + fn into_iter(self) -> Self::IntoIter; +} + +impl<'a> Trait for &'_ S { + //~^ ERROR E0207 + //~| NOTE there is a named lifetime specified on the impl block you could use + //~| NOTE unconstrained lifetime parameter + //~| HELP consider using the named lifetime here instead of an implict lifetime + type Item = &T; + //~^ ERROR missing lifetime in associated type + //~| HELP consider using the lifetime from the impl block + //~| NOTE this lifetime must come from the implemented type + type IntoIter = std::collections::btree_map::Values<'a, i32, T>; + + fn into_iter(self) -> Self::IntoIter { + todo!() + } +} +fn main() {} diff --git a/tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.stderr b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.stderr new file mode 100644 index 000000000000..2e81d4367461 --- /dev/null +++ b/tests/ui/lifetimes/missing-lifetime-in-assoc-type-6.stderr @@ -0,0 +1,30 @@ +error: missing lifetime in associated type + --> $DIR/missing-lifetime-in-assoc-type-6.rs:16:17 + | +LL | impl<'a> Trait for &'_ S { + | ---- there is a named lifetime specified on the impl block you could use +... +LL | type Item = &T; + | ^ this lifetime must come from the implemented type + | + = note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +help: consider using the lifetime from the impl block + | +LL | type Item = &'a T; + | ++ + +error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates + --> $DIR/missing-lifetime-in-assoc-type-6.rs:11:6 + | +LL | impl<'a> Trait for &'_ S { + | ^^ unconstrained lifetime parameter + | +help: consider using the named lifetime here instead of an implict lifetime + | +LL - impl<'a> Trait for &'_ S { +LL + impl<'a> Trait for &'a S { + | + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0207`. diff --git a/tests/ui/lifetimes/no_lending_iterators.rs b/tests/ui/lifetimes/no_lending_iterators.rs index 88b8cda0898b..aa2e57ee3036 100644 --- a/tests/ui/lifetimes/no_lending_iterators.rs +++ b/tests/ui/lifetimes/no_lending_iterators.rs @@ -16,7 +16,7 @@ trait Bar { impl Bar for usize { type Item = &usize; - //~^ ERROR in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type + //~^ ERROR missing lifetime in associated type fn poke(&mut self, item: Self::Item) { self += *item; diff --git a/tests/ui/lifetimes/no_lending_iterators.stderr b/tests/ui/lifetimes/no_lending_iterators.stderr index 0f18f858cb8f..ef90c286fc75 100644 --- a/tests/ui/lifetimes/no_lending_iterators.stderr +++ b/tests/ui/lifetimes/no_lending_iterators.stderr @@ -10,13 +10,15 @@ note: you can't create an `Iterator` that borrows each `Item` from itself, but y LL | impl Iterator for Data { | ^^^^ -error: in the trait associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type +error: missing lifetime in associated type --> $DIR/no_lending_iterators.rs:18:17 | LL | impl Bar for usize { | - you could add a lifetime on the impl block, if the trait or the self type could have one LL | type Item = &usize; | ^ this lifetime must come from the implemented type + | + = note: in the trait the associated type is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type error[E0195]: lifetime parameters or bounds on associated type `Item` do not match the trait declaration --> $DIR/no_lending_iterators.rs:27:14