And more general error
This commit is contained in:
@@ -11,6 +11,10 @@ resolve_added_macro_use =
|
||||
resolve_ancestor_only =
|
||||
visibilities can only be restricted to ancestor modules
|
||||
|
||||
resolve_anonymous_livetime_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
|
||||
.label = this lifetime must come from the implemented type
|
||||
|
||||
resolve_arguments_macro_use_not_allowed = arguments to `macro_use` are not allowed here
|
||||
|
||||
resolve_associated_const_with_similar_name_exists =
|
||||
@@ -235,7 +239,7 @@ resolve_label_with_similar_name_reachable =
|
||||
a label with a similar name is reachable
|
||||
|
||||
resolve_lending_iterator_report_error =
|
||||
associated type `Iterator::Item` is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type.
|
||||
associated type `Iterator::Item` is declared without lifetime parameters, so using a borrowed type for them requires that lifetime to come from the implemented type
|
||||
.note = you can't create an `Iterator` that borrows each `Item` from itself, but you can instead create a new type that borrows your existing type and implement `Iterator` for that new type.
|
||||
|
||||
resolve_lifetime_param_in_enum_discriminant =
|
||||
|
||||
@@ -891,6 +891,14 @@ pub(crate) struct LendingIteratorReportError {
|
||||
pub(crate) ty: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(resolve_anonymous_livetime_non_gat_report_error)]
|
||||
pub(crate) struct AnonymousLivetimeNonGatReportError {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub(crate) lifetime: Span,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[multipart_suggestion(
|
||||
resolve_elided_anonymous_lifetime_report_error_suggestion,
|
||||
|
||||
@@ -629,6 +629,9 @@ struct DiagMetadata<'ast> {
|
||||
in_assignment: Option<&'ast Expr>,
|
||||
is_assign_rhs: bool,
|
||||
|
||||
/// If we are setting an associated type in trait impl, is it a non-GAT type?
|
||||
in_non_gat_assoc_type: Option<bool>,
|
||||
|
||||
/// Used to detect possible `.` -> `..` typo when calling methods.
|
||||
in_range: Option<(&'ast Expr, &'ast Expr)>,
|
||||
|
||||
@@ -1704,21 +1707,28 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
// Is it caused by user trying to implement a lending iterator?
|
||||
// are we trying to use an anonymous lifetime
|
||||
// on a non GAT associated trait type?
|
||||
if !self.in_func_body
|
||||
&& let Some((module, _)) = &self.current_trait_ref
|
||||
&& let Some(ty) = &self.diag_metadata.current_self_type
|
||||
&& Some(true) == self.diag_metadata.in_non_gat_assoc_type
|
||||
&& let crate::ModuleKind::Def(DefKind::Trait, trait_id, _) = module.kind
|
||||
&& def_id_matches_path(
|
||||
{
|
||||
if def_id_matches_path(
|
||||
self.r.tcx,
|
||||
trait_id,
|
||||
&["core", "iter", "traits", "iterator", "Iterator"],
|
||||
)
|
||||
{
|
||||
self.r.dcx().emit_err(errors::LendingIteratorReportError {
|
||||
lifetime: lifetime.ident.span,
|
||||
ty: ty.span(),
|
||||
});
|
||||
) {
|
||||
self.r.dcx().emit_err(errors::LendingIteratorReportError {
|
||||
lifetime: lifetime.ident.span,
|
||||
ty: ty.span(),
|
||||
});
|
||||
} else {
|
||||
self.r.dcx().emit_err(errors::AnonymousLivetimeNonGatReportError {
|
||||
lifetime: lifetime.ident.span,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
self.r.dcx().emit_err(errors::ElidedAnonymousLivetimeReportError {
|
||||
span: lifetime.ident.span,
|
||||
@@ -3076,6 +3086,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||
);
|
||||
}
|
||||
AssocItemKind::Type(box TyAlias { generics, .. }) => {
|
||||
self.diag_metadata.in_non_gat_assoc_type = Some(generics.params.is_empty());
|
||||
debug!("resolve_implementation AssocItemKind::Type");
|
||||
// We also need a new scope for the impl item type parameters.
|
||||
self.with_generic_param_rib(
|
||||
@@ -3104,6 +3115,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||
});
|
||||
},
|
||||
);
|
||||
self.diag_metadata.in_non_gat_assoc_type = None;
|
||||
}
|
||||
AssocItemKind::Delegation(box delegation) => {
|
||||
debug!("resolve_implementation AssocItemKind::Delegation");
|
||||
|
||||
Reference in New Issue
Block a user