Auto merge of #97644 - Dylan-DPC:rollup-xaeio91, r=Dylan-DPC

Rollup of 6 pull requests

Successful merges:

 - #96894 (Apply track_caller to closure on `expect_non_local()`)
 - #97023 (Diagnose anonymous lifetimes errors more uniformly between async and regular fns)
 - #97397 (Stabilize `box_into_pin`)
 - #97587 (Migrate more diagnostics to use the `#[derive(SessionDiagnostic)]`)
 - #97603 (Arc make_mut doc comment spelling correction.)
 - #97635 (Fix file metadata documentation for Windows)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2022-06-02 10:39:24 +00:00
commit 9598b4b594
40 changed files with 754 additions and 254 deletions

View File

@ -567,15 +567,17 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
let lifetime = let lifetime =
self.try_match_adt_and_generic_args(substs, needle_fr, args, search_stack)?; self.try_match_adt_and_generic_args(substs, needle_fr, args, search_stack)?;
match lifetime.name { match lifetime.name {
hir::LifetimeName::Param(_) hir::LifetimeName::Param(hir::ParamName::Plain(_) | hir::ParamName::Error)
| hir::LifetimeName::Error | hir::LifetimeName::Error
| hir::LifetimeName::Static | hir::LifetimeName::Static => {
| hir::LifetimeName::Underscore => {
let lifetime_span = lifetime.span; let lifetime_span = lifetime.span;
Some(RegionNameHighlight::MatchedAdtAndSegment(lifetime_span)) Some(RegionNameHighlight::MatchedAdtAndSegment(lifetime_span))
} }
hir::LifetimeName::ImplicitObjectLifetimeDefault | hir::LifetimeName::Implicit => { hir::LifetimeName::Param(hir::ParamName::Fresh(_))
| hir::LifetimeName::ImplicitObjectLifetimeDefault
| hir::LifetimeName::Implicit
| hir::LifetimeName::Underscore => {
// In this case, the user left off the lifetime; so // In this case, the user left off the lifetime; so
// they wrote something like: // they wrote something like:
// //

View File

@ -14,3 +14,21 @@ parser-add-paren = try adding parentheses
parser-forgot-paren = perhaps you forgot parentheses? parser-forgot-paren = perhaps you forgot parentheses?
parser-expect-path = expected a path parser-expect-path = expected a path
parser-maybe-recover-from-bad-qpath-stage-2 =
missing angle brackets in associated item path
.suggestion = try: `{$ty}`
parser-incorrect-semicolon =
expected item, found `;`
.suggestion = remove this semicolon
.help = {$name} declarations are not followed by a semicolon
parser-incorrect-use-of-await =
incorrect use of `await`
.parentheses-suggestion = `await` is not a method call, remove the parentheses
.postfix-suggestion = `await` is a postfix operation
parser-in-in-typo =
expected iterable, found keyword `in`
.suggestion = remove the duplicated `in`

View File

@ -671,7 +671,10 @@ impl<Id> Res<Id> {
#[track_caller] #[track_caller]
pub fn expect_non_local<OtherId>(self) -> Res<OtherId> { pub fn expect_non_local<OtherId>(self) -> Res<OtherId> {
self.map_id(|_| panic!("unexpected `Res::Local`")) self.map_id(
#[track_caller]
|_| panic!("unexpected `Res::Local`"),
)
} }
pub fn macro_kind(self) -> Option<MacroKind> { pub fn macro_kind(self) -> Option<MacroKind> {

View File

@ -131,6 +131,17 @@ impl LifetimeName {
} }
} }
pub fn is_anonymous(&self) -> bool {
match *self {
LifetimeName::ImplicitObjectLifetimeDefault
| LifetimeName::Implicit
| LifetimeName::Underscore
| LifetimeName::Param(ParamName::Fresh(_))
| LifetimeName::Error => true,
LifetimeName::Static | LifetimeName::Param(_) => false,
}
}
pub fn is_elided(&self) -> bool { pub fn is_elided(&self) -> bool {
match self { match self {
LifetimeName::ImplicitObjectLifetimeDefault LifetimeName::ImplicitObjectLifetimeDefault

View File

@ -3,6 +3,7 @@
//! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/hir.html //! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/hir.html
#![feature(associated_type_defaults)] #![feature(associated_type_defaults)]
#![feature(closure_track_caller)]
#![feature(const_btree_new)] #![feature(const_btree_new)]
#![feature(let_else)] #![feature(let_else)]
#![feature(once_cell)] #![feature(once_cell)]

View File

@ -72,7 +72,7 @@ use rustc_middle::ty::{
subst::{GenericArgKind, Subst, SubstsRef}, subst::{GenericArgKind, Subst, SubstsRef},
Binder, EarlyBinder, List, Region, Ty, TyCtxt, TypeFoldable, Binder, EarlyBinder, List, Region, Ty, TyCtxt, TypeFoldable,
}; };
use rustc_span::{sym, BytePos, DesugaringKind, Pos, Span}; use rustc_span::{sym, symbol::kw, BytePos, DesugaringKind, Pos, Span};
use rustc_target::spec::abi; use rustc_target::spec::abi;
use std::ops::ControlFlow; use std::ops::ControlFlow;
use std::{cmp, fmt, iter}; use std::{cmp, fmt, iter};
@ -161,35 +161,45 @@ fn msg_span_from_early_bound_and_free_regions<'tcx>(
{ {
sp = param.span; sp = param.span;
} }
(format!("the lifetime `{}` as defined here", br.name), sp) let text = if br.has_name() {
format!("the lifetime `{}` as defined here", br.name)
} else {
format!("the anonymous lifetime as defined here")
};
(text, sp)
} }
ty::ReFree(ty::FreeRegion { ty::ReFree(ref fr) => {
bound_region: ty::BoundRegionKind::BrNamed(_, name), .. if !fr.bound_region.is_named()
}) => { && let Some((ty, _)) = find_anon_type(tcx, region, &fr.bound_region)
let mut sp = sm.guess_head_span(tcx.def_span(scope));
if let Some(param) =
tcx.hir().get_generics(scope).and_then(|generics| generics.get_named(name))
{ {
sp = param.span; ("the anonymous lifetime defined here".to_string(), ty.span)
} } else {
(format!("the lifetime `{}` as defined here", name), sp) match fr.bound_region {
} ty::BoundRegionKind::BrNamed(_, name) => {
ty::ReFree(ref fr) => match fr.bound_region { let mut sp = sm.guess_head_span(tcx.def_span(scope));
ty::BrAnon(idx) => { if let Some(param) =
if let Some((ty, _)) = find_anon_type(tcx, region, &fr.bound_region) { tcx.hir().get_generics(scope).and_then(|generics| generics.get_named(name))
("the anonymous lifetime defined here".to_string(), ty.span) {
} else { sp = param.span;
( }
let text = if name == kw::UnderscoreLifetime {
format!("the anonymous lifetime as defined here")
} else {
format!("the lifetime `{}` as defined here", name)
};
(text, sp)
}
ty::BrAnon(idx) => (
format!("the anonymous lifetime #{} defined here", idx + 1), format!("the anonymous lifetime #{} defined here", idx + 1),
tcx.def_span(scope), tcx.def_span(scope)
) ),
_ => (
format!("the lifetime `{}` as defined here", region),
sm.guess_head_span(tcx.def_span(scope)),
),
} }
} }
_ => ( }
format!("the lifetime `{}` as defined here", region),
sm.guess_head_span(tcx.def_span(scope)),
),
},
_ => bug!(), _ => bug!(),
} }
} }
@ -2552,7 +2562,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
ty::ReEarlyBound(ty::EarlyBoundRegion { name, .. }) ty::ReEarlyBound(ty::EarlyBoundRegion { name, .. })
| ty::ReFree(ty::FreeRegion { bound_region: ty::BrNamed(_, name), .. }), | ty::ReFree(ty::FreeRegion { bound_region: ty::BrNamed(_, name), .. }),
_, _,
) => { ) if name != kw::UnderscoreLifetime => {
// Does the required lifetime have a nice name we can print? // Does the required lifetime have a nice name we can print?
let mut err = struct_span_err!( let mut err = struct_span_err!(
self.tcx.sess, self.tcx.sess,

View File

@ -12,6 +12,7 @@ use rustc_errors::{struct_span_err, Applicability, Diagnostic, ErrorGuaranteed};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::{GenericParamKind, Ty}; use rustc_hir::{GenericParamKind, Ty};
use rustc_middle::ty::Region; use rustc_middle::ty::Region;
use rustc_span::symbol::kw;
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
/// Print the error message for lifetime errors when both the concerned regions are anonymous. /// Print the error message for lifetime errors when both the concerned regions are anonymous.
@ -169,7 +170,7 @@ pub fn suggest_adding_lifetime_params<'tcx>(
return false; return false;
}; };
if !lifetime_sub.name.is_elided() || !lifetime_sup.name.is_elided() { if !lifetime_sub.name.is_anonymous() || !lifetime_sup.name.is_anonymous() {
return false; return false;
}; };
@ -188,32 +189,37 @@ pub fn suggest_adding_lifetime_params<'tcx>(
_ => return false, _ => return false,
}; };
let (suggestion_param_name, introduce_new) = generics let suggestion_param_name = generics
.params .params
.iter() .iter()
.find(|p| matches!(p.kind, GenericParamKind::Lifetime { .. })) .filter(|p| matches!(p.kind, GenericParamKind::Lifetime { .. }))
.and_then(|p| tcx.sess.source_map().span_to_snippet(p.span).ok()) .map(|p| p.name.ident().name)
.map(|name| (name, false)) .find(|i| *i != kw::UnderscoreLifetime);
.unwrap_or_else(|| ("'a".to_string(), true)); let introduce_new = suggestion_param_name.is_none();
let suggestion_param_name =
suggestion_param_name.map(|n| n.to_string()).unwrap_or_else(|| "'a".to_owned());
let mut suggestions = vec![ debug!(?lifetime_sup.span);
if let hir::LifetimeName::Underscore = lifetime_sub.name { debug!(?lifetime_sub.span);
(lifetime_sub.span, suggestion_param_name.clone()) let make_suggestion = |span: rustc_span::Span| {
if span.is_empty() {
(span, format!("{}, ", suggestion_param_name))
} else if let Ok("&") = tcx.sess.source_map().span_to_snippet(span).as_deref() {
(span.shrink_to_hi(), format!("{} ", suggestion_param_name))
} else { } else {
(lifetime_sub.span.shrink_to_hi(), suggestion_param_name.clone() + " ") (span, suggestion_param_name.clone())
}, }
if let hir::LifetimeName::Underscore = lifetime_sup.name { };
(lifetime_sup.span, suggestion_param_name.clone()) let mut suggestions =
} else { vec![make_suggestion(lifetime_sub.span), make_suggestion(lifetime_sup.span)];
(lifetime_sup.span.shrink_to_hi(), suggestion_param_name.clone() + " ")
},
];
if introduce_new { if introduce_new {
let new_param_suggestion = match &generics.params { let new_param_suggestion =
[] => (generics.span, format!("<{}>", suggestion_param_name)), if let Some(first) = generics.params.iter().find(|p| !p.name.ident().span.is_empty()) {
[first, ..] => (first.span.shrink_to_lo(), format!("{}, ", suggestion_param_name)), (first.span.shrink_to_lo(), format!("{}, ", suggestion_param_name))
}; } else {
(generics.span, format!("<{}>", suggestion_param_name))
};
suggestions.push(new_param_suggestion); suggestions.push(new_param_suggestion);
} }

View File

@ -4,6 +4,7 @@ use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_
use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::error_reporting::nice_region_error::NiceRegionError;
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, ErrorGuaranteed}; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, ErrorGuaranteed};
use rustc_middle::ty; use rustc_middle::ty;
use rustc_span::symbol::kw;
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
/// When given a `ConcreteFailure` for a function with parameters containing a named region and /// When given a `ConcreteFailure` for a function with parameters containing a named region and
@ -67,7 +68,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
let is_impl_item = region_info.is_impl_item; let is_impl_item = region_info.is_impl_item;
match br { match br {
ty::BrAnon(_) => {} ty::BrNamed(_, kw::UnderscoreLifetime) | ty::BrAnon(_) => {}
_ => { _ => {
/* not an anonymous region */ /* not an anonymous region */
debug!("try_report_named_anon_conflict: not an anonymous region"); debug!("try_report_named_anon_conflict: not an anonymous region");

View File

@ -2177,61 +2177,47 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
define_scoped_cx!(self); define_scoped_cx!(self);
let mut region_index = self.region_index; let mut region_index = self.region_index;
let mut next_name = |this: &Self| loop {
let name = name_by_region_index(region_index);
region_index += 1;
if !this.used_region_names.contains(&name) {
break name;
}
};
// If we want to print verbosely, then print *all* binders, even if they // If we want to print verbosely, then print *all* binders, even if they
// aren't named. Eventually, we might just want this as the default, but // aren't named. Eventually, we might just want this as the default, but
// this is not *quite* right and changes the ordering of some output // this is not *quite* right and changes the ordering of some output
// anyways. // anyways.
let (new_value, map) = if self.tcx().sess.verbose() { let (new_value, map) = if self.tcx().sess.verbose() {
// anon index + 1 (BrEnv takes 0) -> name // anon index + 1 (BrEnv takes 0) -> name
let mut region_map: BTreeMap<u32, Symbol> = BTreeMap::default(); let mut region_map: FxHashMap<_, _> = Default::default();
let bound_vars = value.bound_vars(); let bound_vars = value.bound_vars();
for var in bound_vars { for var in bound_vars {
let ty::BoundVariableKind::Region(var) = var else { continue };
match var { match var {
ty::BoundVariableKind::Region(ty::BrNamed(_, name)) => { ty::BrAnon(_) | ty::BrEnv => {
start_or_continue(&mut self, "for<", ", ");
let name = next_name(&self);
do_continue(&mut self, name);
region_map.insert(var, ty::BrNamed(CRATE_DEF_ID.to_def_id(), name));
}
ty::BrNamed(def_id, kw::UnderscoreLifetime) => {
start_or_continue(&mut self, "for<", ", ");
let name = next_name(&self);
do_continue(&mut self, name);
region_map.insert(var, ty::BrNamed(def_id, name));
}
ty::BrNamed(_, name) => {
start_or_continue(&mut self, "for<", ", "); start_or_continue(&mut self, "for<", ", ");
do_continue(&mut self, name); do_continue(&mut self, name);
} }
ty::BoundVariableKind::Region(ty::BrAnon(i)) => {
start_or_continue(&mut self, "for<", ", ");
let name = loop {
let name = name_by_region_index(region_index);
region_index += 1;
if !self.used_region_names.contains(&name) {
break name;
}
};
do_continue(&mut self, name);
region_map.insert(i + 1, name);
}
ty::BoundVariableKind::Region(ty::BrEnv) => {
start_or_continue(&mut self, "for<", ", ");
let name = loop {
let name = name_by_region_index(region_index);
region_index += 1;
if !self.used_region_names.contains(&name) {
break name;
}
};
do_continue(&mut self, name);
region_map.insert(0, name);
}
_ => continue,
} }
} }
start_or_continue(&mut self, "", "> "); start_or_continue(&mut self, "", "> ");
self.tcx.replace_late_bound_regions(value.clone(), |br| { self.tcx.replace_late_bound_regions(value.clone(), |br| {
let kind = match br.kind { let kind = region_map[&br.kind];
ty::BrNamed(_, _) => br.kind,
ty::BrAnon(i) => {
let name = region_map[&(i + 1)];
ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
}
ty::BrEnv => {
let name = region_map[&0];
ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
}
};
self.tcx.mk_region(ty::ReLateBound( self.tcx.mk_region(ty::ReLateBound(
ty::INNERMOST, ty::INNERMOST,
ty::BoundRegion { var: br.var, kind }, ty::BoundRegion { var: br.var, kind },
@ -2242,21 +2228,20 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
let mut name = |br: ty::BoundRegion| { let mut name = |br: ty::BoundRegion| {
start_or_continue(&mut self, "for<", ", "); start_or_continue(&mut self, "for<", ", ");
let kind = match br.kind { let kind = match br.kind {
ty::BrAnon(_) | ty::BrEnv => {
let name = next_name(&self);
do_continue(&mut self, name);
ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
}
ty::BrNamed(def_id, kw::UnderscoreLifetime) => {
let name = next_name(&self);
do_continue(&mut self, name);
ty::BrNamed(def_id, name)
}
ty::BrNamed(_, name) => { ty::BrNamed(_, name) => {
do_continue(&mut self, name); do_continue(&mut self, name);
br.kind br.kind
} }
ty::BrAnon(_) | ty::BrEnv => {
let name = loop {
let name = name_by_region_index(region_index);
region_index += 1;
if !self.used_region_names.contains(&name) {
break name;
}
};
do_continue(&mut self, name);
ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
}
}; };
tcx.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BoundRegion { var: br.var, kind })) tcx.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BoundRegion { var: br.var, kind }))
}; };

View File

@ -285,6 +285,54 @@ pub enum BadTypePlusSub {
}, },
} }
#[derive(SessionDiagnostic)]
#[error(slug = "parser-maybe-recover-from-bad-qpath-stage-2")]
struct BadQPathStage2 {
#[primary_span]
#[suggestion(applicability = "maybe-incorrect")]
span: Span,
ty: String,
}
#[derive(SessionDiagnostic)]
#[error(slug = "parser-incorrect-semicolon")]
struct IncorrectSemicolon<'a> {
#[primary_span]
#[suggestion_short(applicability = "machine-applicable")]
span: Span,
#[help]
opt_help: Option<()>,
name: &'a str,
}
#[derive(SessionDiagnostic)]
#[error(slug = "parser-incorrect-use-of-await")]
struct IncorrectUseOfAwait {
#[primary_span]
#[suggestion(message = "parentheses-suggestion", applicability = "machine-applicable")]
span: Span,
}
#[derive(SessionDiagnostic)]
#[error(slug = "parser-incorrect-use-of-await")]
struct IncorrectAwait {
#[primary_span]
span: Span,
#[suggestion(message = "postfix-suggestion", code = "{expr}.await{question_mark}")]
sugg_span: (Span, Applicability),
expr: String,
question_mark: &'static str,
}
#[derive(SessionDiagnostic)]
#[error(slug = "parser-in-in-typo")]
struct InInTypo {
#[primary_span]
span: Span,
#[suggestion(applicability = "machine-applicable")]
sugg_span: Span,
}
// SnapshotParser is used to create a snapshot of the parser // SnapshotParser is used to create a snapshot of the parser
// without causing duplicate errors being emitted when the `Parser` // without causing duplicate errors being emitted when the `Parser`
// is dropped. // is dropped.
@ -1451,15 +1499,10 @@ impl<'a> Parser<'a> {
path.span = ty_span.to(self.prev_token.span); path.span = ty_span.to(self.prev_token.span);
let ty_str = self.span_to_snippet(ty_span).unwrap_or_else(|_| pprust::ty_to_string(&ty)); let ty_str = self.span_to_snippet(ty_span).unwrap_or_else(|_| pprust::ty_to_string(&ty));
self.struct_span_err(path.span, "missing angle brackets in associated item path") self.sess.emit_err(BadQPathStage2 {
.span_suggestion( span: path.span,
// This is a best-effort recovery. ty: format!("<{}>::{}", ty_str, pprust::path_to_string(&path)),
path.span, });
"try",
format!("<{}>::{}", ty_str, pprust::path_to_string(&path)),
Applicability::MaybeIncorrect,
)
.emit();
let path_span = ty_span.shrink_to_hi(); // Use an empty path since `position == 0`. let path_span = ty_span.shrink_to_hi(); // Use an empty path since `position == 0`.
Ok(P(T::recovered(Some(QSelf { ty, path_span, position: 0 }), path))) Ok(P(T::recovered(Some(QSelf { ty, path_span, position: 0 }), path)))
@ -1468,13 +1511,10 @@ impl<'a> Parser<'a> {
pub fn maybe_consume_incorrect_semicolon(&mut self, items: &[P<Item>]) -> bool { pub fn maybe_consume_incorrect_semicolon(&mut self, items: &[P<Item>]) -> bool {
if self.token.kind == TokenKind::Semi { if self.token.kind == TokenKind::Semi {
self.bump(); self.bump();
let mut err = self.struct_span_err(self.prev_token.span, "expected item, found `;`");
err.span_suggestion_short( let mut err =
self.prev_token.span, IncorrectSemicolon { span: self.prev_token.span, opt_help: None, name: "" };
"remove this semicolon",
String::new(),
Applicability::MachineApplicable,
);
if !items.is_empty() { if !items.is_empty() {
let previous_item = &items[items.len() - 1]; let previous_item = &items[items.len() - 1];
let previous_item_kind_name = match previous_item.kind { let previous_item_kind_name = match previous_item.kind {
@ -1487,10 +1527,11 @@ impl<'a> Parser<'a> {
_ => None, _ => None,
}; };
if let Some(name) = previous_item_kind_name { if let Some(name) = previous_item_kind_name {
err.help(&format!("{name} declarations are not followed by a semicolon")); err.opt_help = Some(());
err.name = name;
} }
} }
err.emit(); self.sess.emit_err(err);
true true
} else { } else {
false false
@ -1604,18 +1645,20 @@ impl<'a> Parser<'a> {
} }
fn error_on_incorrect_await(&self, lo: Span, hi: Span, expr: &Expr, is_question: bool) -> Span { fn error_on_incorrect_await(&self, lo: Span, hi: Span, expr: &Expr, is_question: bool) -> Span {
let expr_str = let span = lo.to(hi);
self.span_to_snippet(expr.span).unwrap_or_else(|_| pprust::expr_to_string(&expr)); let applicability = match expr.kind {
let suggestion = format!("{}.await{}", expr_str, if is_question { "?" } else { "" });
let sp = lo.to(hi);
let app = match expr.kind {
ExprKind::Try(_) => Applicability::MaybeIncorrect, // `await <expr>?` ExprKind::Try(_) => Applicability::MaybeIncorrect, // `await <expr>?`
_ => Applicability::MachineApplicable, _ => Applicability::MachineApplicable,
}; };
self.struct_span_err(sp, "incorrect use of `await`")
.span_suggestion(sp, "`await` is a postfix operation", suggestion, app) self.sess.emit_err(IncorrectAwait {
.emit(); span,
sp sugg_span: (span, applicability),
expr: self.span_to_snippet(expr.span).unwrap_or_else(|_| pprust::expr_to_string(&expr)),
question_mark: if is_question { "?" } else { "" },
});
span
} }
/// If encountering `future.await()`, consumes and emits an error. /// If encountering `future.await()`, consumes and emits an error.
@ -1626,16 +1669,10 @@ impl<'a> Parser<'a> {
// future.await() // future.await()
let lo = self.token.span; let lo = self.token.span;
self.bump(); // ( self.bump(); // (
let sp = lo.to(self.token.span); let span = lo.to(self.token.span);
self.bump(); // ) self.bump(); // )
self.struct_span_err(sp, "incorrect use of `await`")
.span_suggestion( self.sess.emit_err(IncorrectUseOfAwait { span });
sp,
"`await` is not a method call, remove the parentheses",
String::new(),
Applicability::MachineApplicable,
)
.emit();
} }
} }
@ -1907,14 +1944,10 @@ impl<'a> Parser<'a> {
pub(super) fn check_for_for_in_in_typo(&mut self, in_span: Span) { pub(super) fn check_for_for_in_in_typo(&mut self, in_span: Span) {
if self.eat_keyword(kw::In) { if self.eat_keyword(kw::In) {
// a common typo: `for _ in in bar {}` // a common typo: `for _ in in bar {}`
self.struct_span_err(self.prev_token.span, "expected iterable, found keyword `in`") self.sess.emit_err(InInTypo {
.span_suggestion_short( span: self.prev_token.span,
in_span.until(self.prev_token.span), sugg_span: in_span.until(self.prev_token.span),
"remove the duplicated `in`", });
String::new(),
Applicability::MachineApplicable,
)
.emit();
} }
} }

View File

@ -8,10 +8,11 @@ use super::*;
use rustc_attr as attr; use rustc_attr as attr;
use rustc_errors::{Applicability, ErrorGuaranteed, MultiSpan}; use rustc_errors::{Applicability, ErrorGuaranteed, MultiSpan};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::intravisit::Visitor; use rustc_hir::intravisit::Visitor;
use rustc_hir::lang_items::LangItem; use rustc_hir::lang_items::LangItem;
use rustc_hir::{def::Res, ItemKind, Node, PathSegment}; use rustc_hir::{ItemKind, Node, PathSegment};
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
use rustc_infer::infer::{RegionVariableOrigin, TyCtxtInferExt}; use rustc_infer::infer::{RegionVariableOrigin, TyCtxtInferExt};
use rustc_infer::traits::Obligation; use rustc_infer::traits::Obligation;
@ -29,7 +30,6 @@ use rustc_trait_selection::traits;
use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _; use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
use rustc_ty_utils::representability::{self, Representability}; use rustc_ty_utils::representability::{self, Representability};
use rustc_hir::def::DefKind;
use std::iter; use std::iter;
use std::ops::ControlFlow; use std::ops::ControlFlow;
@ -93,7 +93,6 @@ pub(super) fn check_fn<'a, 'tcx>(
fcx.return_type_pre_known = return_type_pre_known; fcx.return_type_pre_known = return_type_pre_known;
let tcx = fcx.tcx; let tcx = fcx.tcx;
let sess = tcx.sess;
let hir = tcx.hir(); let hir = tcx.hir();
let declared_ret_ty = fn_sig.output(); let declared_ret_ty = fn_sig.output();
@ -259,87 +258,125 @@ pub(super) fn check_fn<'a, 'tcx>(
if let Some(panic_impl_did) = tcx.lang_items().panic_impl() if let Some(panic_impl_did) = tcx.lang_items().panic_impl()
&& panic_impl_did == hir.local_def_id(fn_id).to_def_id() && panic_impl_did == hir.local_def_id(fn_id).to_def_id()
{ {
if let Some(panic_info_did) = tcx.lang_items().panic_info() { check_panic_info_fn(tcx, panic_impl_did.expect_local(), fn_sig, decl, declared_ret_ty);
if *declared_ret_ty.kind() != ty::Never {
sess.span_err(decl.output.span(), "return type should be `!`");
}
let inputs = fn_sig.inputs();
let span = hir.span(fn_id);
if inputs.len() == 1 {
let arg_is_panic_info = match *inputs[0].kind() {
ty::Ref(region, ty, mutbl) => match *ty.kind() {
ty::Adt(ref adt, _) => {
adt.did() == panic_info_did
&& mutbl == hir::Mutability::Not
&& !region.is_static()
}
_ => false,
},
_ => false,
};
if !arg_is_panic_info {
sess.span_err(decl.inputs[0].span, "argument should be `&PanicInfo`");
}
if let Node::Item(item) = hir.get(fn_id)
&& let ItemKind::Fn(_, ref generics, _) = item.kind
&& !generics.params.is_empty()
{
sess.span_err(span, "should have no type parameters");
}
} else {
let span = sess.source_map().guess_head_span(span);
sess.span_err(span, "function should have one argument");
}
} else {
sess.err("language item required, but not found: `panic_info`");
}
} }
// Check that a function marked as `#[alloc_error_handler]` has signature `fn(Layout) -> !` // Check that a function marked as `#[alloc_error_handler]` has signature `fn(Layout) -> !`
if let Some(alloc_error_handler_did) = tcx.lang_items().oom() if let Some(alloc_error_handler_did) = tcx.lang_items().oom()
&& alloc_error_handler_did == hir.local_def_id(fn_id).to_def_id() && alloc_error_handler_did == hir.local_def_id(fn_id).to_def_id()
{ {
if let Some(alloc_layout_did) = tcx.lang_items().alloc_layout() { check_alloc_error_fn(tcx, alloc_error_handler_did.expect_local(), fn_sig, decl, declared_ret_ty);
if *declared_ret_ty.kind() != ty::Never {
sess.span_err(decl.output.span(), "return type should be `!`");
}
let inputs = fn_sig.inputs();
let span = hir.span(fn_id);
if inputs.len() == 1 {
let arg_is_alloc_layout = match inputs[0].kind() {
ty::Adt(ref adt, _) => adt.did() == alloc_layout_did,
_ => false,
};
if !arg_is_alloc_layout {
sess.span_err(decl.inputs[0].span, "argument should be `Layout`");
}
if let Node::Item(item) = hir.get(fn_id)
&& let ItemKind::Fn(_, ref generics, _) = item.kind
&& !generics.params.is_empty()
{
sess.span_err(
span,
"`#[alloc_error_handler]` function should have no type parameters",
);
}
} else {
let span = sess.source_map().guess_head_span(span);
sess.span_err(span, "function should have one argument");
}
} else {
sess.err("language item required, but not found: `alloc_layout`");
}
} }
(fcx, gen_ty) (fcx, gen_ty)
} }
fn check_panic_info_fn(
tcx: TyCtxt<'_>,
fn_id: LocalDefId,
fn_sig: ty::FnSig<'_>,
decl: &hir::FnDecl<'_>,
declared_ret_ty: Ty<'_>,
) {
let Some(panic_info_did) = tcx.lang_items().panic_info() else {
tcx.sess.err("language item required, but not found: `panic_info`");
return;
};
if *declared_ret_ty.kind() != ty::Never {
tcx.sess.span_err(decl.output.span(), "return type should be `!`");
}
let span = tcx.def_span(fn_id);
let inputs = fn_sig.inputs();
if inputs.len() != 1 {
let span = tcx.sess.source_map().guess_head_span(span);
tcx.sess.span_err(span, "function should have one argument");
return;
}
let arg_is_panic_info = match *inputs[0].kind() {
ty::Ref(region, ty, mutbl) => match *ty.kind() {
ty::Adt(ref adt, _) => {
adt.did() == panic_info_did && mutbl == hir::Mutability::Not && !region.is_static()
}
_ => false,
},
_ => false,
};
if !arg_is_panic_info {
tcx.sess.span_err(decl.inputs[0].span, "argument should be `&PanicInfo`");
}
let DefKind::Fn = tcx.def_kind(fn_id) else {
let span = tcx.def_span(fn_id);
tcx.sess.span_err(span, "should be a function");
return;
};
let generic_counts = tcx.generics_of(fn_id).own_counts();
if generic_counts.types != 0 {
let span = tcx.def_span(fn_id);
tcx.sess.span_err(span, "should have no type parameters");
}
if generic_counts.consts != 0 {
let span = tcx.def_span(fn_id);
tcx.sess.span_err(span, "should have no const parameters");
}
}
fn check_alloc_error_fn(
tcx: TyCtxt<'_>,
fn_id: LocalDefId,
fn_sig: ty::FnSig<'_>,
decl: &hir::FnDecl<'_>,
declared_ret_ty: Ty<'_>,
) {
let Some(alloc_layout_did) = tcx.lang_items().alloc_layout() else {
tcx.sess.err("language item required, but not found: `alloc_layout`");
return;
};
if *declared_ret_ty.kind() != ty::Never {
tcx.sess.span_err(decl.output.span(), "return type should be `!`");
}
let inputs = fn_sig.inputs();
if inputs.len() != 1 {
let span = tcx.def_span(fn_id);
let span = tcx.sess.source_map().guess_head_span(span);
tcx.sess.span_err(span, "function should have one argument");
return;
}
let arg_is_alloc_layout = match inputs[0].kind() {
ty::Adt(ref adt, _) => adt.did() == alloc_layout_did,
_ => false,
};
if !arg_is_alloc_layout {
tcx.sess.span_err(decl.inputs[0].span, "argument should be `Layout`");
}
let DefKind::Fn = tcx.def_kind(fn_id) else {
let span = tcx.def_span(fn_id);
tcx.sess.span_err(span, "`#[alloc_error_handler]` should be a function");
return;
};
let generic_counts = tcx.generics_of(fn_id).own_counts();
if generic_counts.types != 0 {
let span = tcx.def_span(fn_id);
tcx.sess.span_err(span, "`#[alloc_error_handler]` function should have no type parameters");
}
if generic_counts.consts != 0 {
let span = tcx.def_span(fn_id);
tcx.sess
.span_err(span, "`#[alloc_error_handler]` function should have no const parameters");
}
}
fn check_struct(tcx: TyCtxt<'_>, def_id: LocalDefId, span: Span) { fn check_struct(tcx: TyCtxt<'_>, def_id: LocalDefId, span: Span) {
let def = tcx.adt_def(def_id); let def = tcx.adt_def(def_id);
def.destructor(tcx); // force the destructor to be evaluated def.destructor(tcx); // force the destructor to be evaluated

View File

@ -660,8 +660,24 @@ fn compare_number_of_generics<'tcx>(
_ => None, _ => None,
}) })
.collect(); .collect();
let spans = impl_item.generics.spans(); let spans = if impl_item.generics.params.is_empty() {
let span = spans.primary_span(); vec![impl_item.generics.span]
} else {
impl_item
.generics
.params
.iter()
.filter(|p| {
matches!(
p.kind,
hir::GenericParamKind::Type { .. }
| hir::GenericParamKind::Const { .. }
)
})
.map(|p| p.span)
.collect::<Vec<Span>>()
};
let span = spans.first().copied();
let mut err = tcx.sess.struct_span_err_with_code( let mut err = tcx.sess.struct_span_err_with_code(
spans, spans,

View File

@ -1175,14 +1175,33 @@ impl<T: ?Sized, A: Allocator> Box<T, A> {
/// This conversion does not allocate on the heap and happens in place. /// This conversion does not allocate on the heap and happens in place.
/// ///
/// This is also available via [`From`]. /// This is also available via [`From`].
#[unstable(feature = "box_into_pin", issue = "62370")] ///
/// # Notes
///
/// It's not recommended that crates add an impl like `From<Box<T>> for Pin<T>`,
/// as it'll introduce an ambiguity when calling `Pin::from`.
/// A demonstration of such a poor impl is shown below.
///
/// ```compile_fail
/// # use std::pin::Pin;
/// struct Foo; // A type defined in this crate.
/// impl From<Box<()>> for Pin<Foo> {
/// fn from(_: Box<()>) -> Pin<Foo> {
/// Pin::new(Foo)
/// }
/// }
///
/// let foo = Box::new(());
/// let bar = Pin::from(foo);
/// ```
#[stable(feature = "box_into_pin", since = "1.63.0")]
#[rustc_const_unstable(feature = "const_box", issue = "92521")] #[rustc_const_unstable(feature = "const_box", issue = "92521")]
pub const fn into_pin(boxed: Self) -> Pin<Self> pub const fn into_pin(boxed: Self) -> Pin<Self>
where where
A: 'static, A: 'static,
{ {
// It's not possible to move or replace the insides of a `Pin<Box<T>>` // It's not possible to move or replace the insides of a `Pin<Box<T>>`
// when `T: !Unpin`, so it's safe to pin it directly without any // when `T: !Unpin`, so it's safe to pin it directly without any
// additional requirements. // additional requirements.
unsafe { Pin::new_unchecked(boxed) } unsafe { Pin::new_unchecked(boxed) }
} }

View File

@ -1393,11 +1393,11 @@ impl<T: Clone> Arc<T> {
/// referred to as clone-on-write. /// referred to as clone-on-write.
/// ///
/// However, if there are no other `Arc` pointers to this allocation, but some [`Weak`] /// However, if there are no other `Arc` pointers to this allocation, but some [`Weak`]
/// pointers, then the [`Weak`] pointers will be disassociated and the inner value will not /// pointers, then the [`Weak`] pointers will be dissociated and the inner value will not
/// be cloned. /// be cloned.
/// ///
/// See also [`get_mut`], which will fail rather than cloning the inner value /// See also [`get_mut`], which will fail rather than cloning the inner value
/// or diassociating [`Weak`] pointers. /// or dissociating [`Weak`] pointers.
/// ///
/// [`clone`]: Clone::clone /// [`clone`]: Clone::clone
/// [`get_mut`]: Arc::get_mut /// [`get_mut`]: Arc::get_mut
@ -1420,7 +1420,7 @@ impl<T: Clone> Arc<T> {
/// assert_eq!(*other_data, 12); /// assert_eq!(*other_data, 12);
/// ``` /// ```
/// ///
/// [`Weak`] pointers will be disassociated: /// [`Weak`] pointers will be dissociated:
/// ///
/// ``` /// ```
/// use std::sync::Arc; /// use std::sync::Arc;

View File

@ -1620,7 +1620,7 @@ pub fn remove_file<P: AsRef<Path>>(path: P) -> io::Result<()> {
/// # Platform-specific behavior /// # Platform-specific behavior
/// ///
/// This function currently corresponds to the `stat` function on Unix /// This function currently corresponds to the `stat` function on Unix
/// and the `GetFileAttributesEx` function on Windows. /// and the `GetFileInformationByHandle` function on Windows.
/// Note that, this [may change in the future][changes]. /// Note that, this [may change in the future][changes].
/// ///
/// [changes]: io#platform-specific-behavior /// [changes]: io#platform-specific-behavior
@ -1654,7 +1654,7 @@ pub fn metadata<P: AsRef<Path>>(path: P) -> io::Result<Metadata> {
/// # Platform-specific behavior /// # Platform-specific behavior
/// ///
/// This function currently corresponds to the `lstat` function on Unix /// This function currently corresponds to the `lstat` function on Unix
/// and the `GetFileAttributesEx` function on Windows. /// and the `GetFileInformationByHandle` function on Windows.
/// Note that, this [may change in the future][changes]. /// Note that, this [may change in the future][changes].
/// ///
/// [changes]: io#platform-specific-behavior /// [changes]: io#platform-specific-behavior

View File

@ -5,6 +5,12 @@ LL | async fn fut(bufs: &mut [&mut [u8]]) {
| ---------------- these two types are declared with different lifetimes... | ---------------- these two types are declared with different lifetimes...
LL | ListFut(bufs).await LL | ListFut(bufs).await
| ^^^^ ...but data from `bufs` flows into `bufs` here | ^^^^ ...but data from `bufs` flows into `bufs` here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter
|
LL | async fn fut<'a>(bufs: &'a mut [&'a mut [u8]]) {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/issue-76547.rs:39:14 --> $DIR/issue-76547.rs:39:14
@ -13,6 +19,12 @@ LL | async fn fut2(bufs: &mut [&mut [u8]]) -> i32 {
| ---------------- these two types are declared with different lifetimes... | ---------------- these two types are declared with different lifetimes...
LL | ListFut2(bufs).await LL | ListFut2(bufs).await
| ^^^^ ...but data from `bufs` flows into `bufs` here | ^^^^ ...but data from `bufs` flows into `bufs` here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter
|
LL | async fn fut2<'a>(bufs: &'a mut [&'a mut [u8]]) -> i32 {
| ++++ ++ ++
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@ -7,6 +7,11 @@ LL | async fn fut(bufs: &mut [&mut [u8]]) {
| let's call the lifetime of this reference `'1` | let's call the lifetime of this reference `'1`
LL | ListFut(bufs).await LL | ListFut(bufs).await
| ^^^^ this usage requires that `'1` must outlive `'2` | ^^^^ this usage requires that `'1` must outlive `'2`
|
help: consider introducing a named lifetime parameter
|
LL | async fn fut<'a>(bufs: &'a mut [&'a mut [u8]]) {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/issue-76547.rs:39:14 --> $DIR/issue-76547.rs:39:14
@ -17,6 +22,11 @@ LL | async fn fut2(bufs: &mut [&mut [u8]]) -> i32 {
| let's call the lifetime of this reference `'1` | let's call the lifetime of this reference `'1`
LL | ListFut2(bufs).await LL | ListFut2(bufs).await
| ^^^^ this usage requires that `'1` must outlive `'2` | ^^^^ this usage requires that `'1` must outlive `'2`
|
help: consider introducing a named lifetime parameter
|
LL | async fn fut2<'a>(bufs: &'a mut [&'a mut [u8]]) -> i32 {
| ++++ ++ ++
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@ -1,14 +1,12 @@
error[E0623]: lifetime mismatch error[E0621]: explicit lifetime required in the type of `foo`
--> $DIR/issue-63388-1.rs:19:9 --> $DIR/issue-63388-1.rs:19:9
| |
LL | &'a self, foo: &dyn Foo LL | &'a self, foo: &dyn Foo
| -------- this parameter and the return type are declared with different lifetimes... | -------- help: add explicit lifetime `'a` to the type of `foo`: `&'a (dyn Foo + 'a)`
LL | ) -> &dyn Foo
| --------
... ...
LL | foo LL | foo
| ^^^ ...but data from `foo` is returned here | ^^^ lifetime `'a` required
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0623`. For more information about this error, try `rustc --explain E0621`.

View File

@ -1,17 +1,16 @@
error: lifetime may not live long enough error[E0621]: explicit lifetime required in the type of `foo`
--> $DIR/issue-63388-1.rs:17:5 --> $DIR/issue-63388-1.rs:17:5
| |
LL | async fn do_sth<'a>(
| -- lifetime `'a` defined here
LL | &'a self, foo: &dyn Foo LL | &'a self, foo: &dyn Foo
| - let's call the lifetime of this reference `'1` | -------- help: add explicit lifetime `'a` to the type of `foo`: `&'a (dyn Foo + 'a)`
LL | ) -> &dyn Foo LL | ) -> &dyn Foo
LL | / { LL | / {
LL | | LL | |
LL | | foo LL | | foo
LL | | LL | |
LL | | } LL | | }
| |_____^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1` | |_____^ lifetime `'a` required
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0621`.

View File

@ -15,9 +15,9 @@ impl Xyz {
&'a self, foo: &dyn Foo &'a self, foo: &dyn Foo
) -> &dyn Foo ) -> &dyn Foo
{ {
//[nll]~^ ERROR lifetime may not live long enough //[nll]~^ ERROR explicit lifetime required in the type of `foo` [E0621]
foo foo
//[base]~^ ERROR lifetime mismatch //[base]~^ ERROR explicit lifetime required in the type of `foo` [E0621]
} }
} }

View File

@ -6,7 +6,7 @@ LL | impl Eq for &dyn DynEq {}
| |
= note: expected trait `<&dyn DynEq as PartialEq>` = note: expected trait `<&dyn DynEq as PartialEq>`
found trait `<&(dyn DynEq + 'static) as PartialEq>` found trait `<&(dyn DynEq + 'static) as PartialEq>`
note: the lifetime `'_` as defined here... note: the anonymous lifetime as defined here...
--> $DIR/E0308-2.rs:9:13 --> $DIR/E0308-2.rs:9:13
| |
LL | impl Eq for &dyn DynEq {} LL | impl Eq for &dyn DynEq {}

View File

@ -8,7 +8,7 @@ LL | type A = u32;
| ^ lifetimes do not match type in trait | ^ lifetimes do not match type in trait
error[E0049]: type `B` has 1 type parameter but its trait declaration has 0 type parameters error[E0049]: type `B` has 1 type parameter but its trait declaration has 0 type parameters
--> $DIR/parameter_number_and_kind_impl.rs:17:12 --> $DIR/parameter_number_and_kind_impl.rs:17:16
| |
LL | type B<'a, 'b>; LL | type B<'a, 'b>;
| -- -- | -- --
@ -16,9 +16,7 @@ LL | type B<'a, 'b>;
| expected 0 type parameters | expected 0 type parameters
... ...
LL | type B<'a, T> = Vec<T>; LL | type B<'a, T> = Vec<T>;
| ^^ ^ | ^ found 1 type parameter
| |
| found 1 type parameter
error[E0195]: lifetime parameters or bounds on type `C` do not match the trait declaration error[E0195]: lifetime parameters or bounds on type `C` do not match the trait declaration
--> $DIR/parameter_number_and_kind_impl.rs:19:11 --> $DIR/parameter_number_and_kind_impl.rs:19:11

View File

@ -11,7 +11,7 @@ note: the anonymous lifetime defined here...
| |
LL | fn say(self: &Pair<&str, isize>) { LL | fn say(self: &Pair<&str, isize>) {
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'_` as defined here note: ...does not necessarily outlive the anonymous lifetime as defined here
--> $DIR/issue-17905-2.rs:5:5 --> $DIR/issue-17905-2.rs:5:5
| |
LL | &str, LL | &str,
@ -25,7 +25,7 @@ LL | fn say(self: &Pair<&str, isize>) {
| |
= note: expected struct `Pair<&str, _>` = note: expected struct `Pair<&str, _>`
found struct `Pair<&str, _>` found struct `Pair<&str, _>`
note: the lifetime `'_` as defined here... note: the anonymous lifetime as defined here...
--> $DIR/issue-17905-2.rs:5:5 --> $DIR/issue-17905-2.rs:5:5
| |
LL | &str, LL | &str,

View File

@ -6,7 +6,7 @@ LL | impl T1 for &dyn T2 {}
| |
= note: expected trait `<&dyn T2 as T0>` = note: expected trait `<&dyn T2 as T0>`
found trait `<&(dyn T2 + 'static) as T0>` found trait `<&(dyn T2 + 'static) as T0>`
note: the lifetime `'_` as defined here... note: the anonymous lifetime as defined here...
--> $DIR/issue-65230.rs:8:13 --> $DIR/issue-65230.rs:8:13
| |
LL | impl T1 for &dyn T2 {} LL | impl T1 for &dyn T2 {}

View File

@ -4,7 +4,7 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
LL | self.y = b.z LL | self.y = b.z
| ^^^ | ^^^
| |
note: ...the reference is valid for the lifetime `'_` as defined here... note: ...the reference is valid for the anonymous lifetime as defined here...
--> $DIR/issue-52742.rs:15:10 --> $DIR/issue-52742.rs:15:10
| |
LL | impl Foo<'_, '_> { LL | impl Foo<'_, '_> {

View File

@ -2,7 +2,7 @@ error: lifetime may not live long enough
--> $DIR/issue-52742.rs:17:9 --> $DIR/issue-52742.rs:17:9
| |
LL | fn take_bar(&mut self, b: Bar<'_>) { LL | fn take_bar(&mut self, b: Bar<'_>) {
| --------- -- let's call this `'1` | --------- - has type `Bar<'1>`
| | | |
| has type `&mut Foo<'_, '2>` | has type `&mut Foo<'_, '2>`
LL | self.y = b.z LL | self.y = b.z

View File

@ -14,7 +14,7 @@ note: ...so that reference does not outlive borrowed content
| |
LL | Foo { bar } LL | Foo { bar }
| ^^^ | ^^^
note: but, the lifetime must be valid for the lifetime `'_` as defined here... note: but, the lifetime must be valid for the anonymous lifetime as defined here...
--> $DIR/issue-55394.rs:11:10 --> $DIR/issue-55394.rs:11:10
| |
LL | impl Foo<'_> { LL | impl Foo<'_> {

View File

@ -2,9 +2,9 @@ error[E0700]: hidden type for `impl Trait` captures lifetime that does not appea
--> $DIR/arbitrary_self_types_pin_lifetime_impl_trait-async.rs:8:48 --> $DIR/arbitrary_self_types_pin_lifetime_impl_trait-async.rs:8:48
| |
LL | async fn f(self: Pin<&Self>) -> impl Clone { self } LL | async fn f(self: Pin<&Self>) -> impl Clone { self }
| - ^^^^^^^^ | ----- ^^^^^^^^
| | | |
| hidden type `Pin<&Foo>` captures the lifetime `'_` as defined here | hidden type `Pin<&Foo>` captures the anonymous lifetime defined here
| |
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
| |

View File

@ -5,6 +5,12 @@ LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
| ---- ---- ^ ...but data from `f` is returned here | ---- ---- ^ ...but data from `f` is returned here
| | | |
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn a<'a>(self: Pin<&'a Foo>, f: &'a Foo) -> &Foo { f }
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:82 --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:82
@ -13,6 +19,12 @@ LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (
| ---- ----------------- ^ ...but data from `f` is returned here | ---- ----------------- ^ ...but data from `f` is returned here
| | | |
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn c<'a>(self: Pin<&'a Self>, f: &'a Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:22:64 --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:22:64

View File

@ -6,6 +6,11 @@ LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
| | | | | |
| | let's call the lifetime of this reference `'1` | | let's call the lifetime of this reference `'1`
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn a<'a>(self: Pin<&'a Foo>, f: &'a Foo) -> &Foo { f }
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:75 --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:15:75
@ -15,6 +20,11 @@ LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (
| | | | | |
| | let's call the lifetime of this reference `'1` | | let's call the lifetime of this reference `'1`
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn c<'a>(self: Pin<&'a Self>, f: &'a Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:22:64 --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:22:64

View File

@ -7,6 +7,12 @@ LL | async fn ref_self(&self, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_self<'a>(&'a self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/lt-ref-self-async.rs:24:9 --> $DIR/lt-ref-self-async.rs:24:9
@ -17,6 +23,12 @@ LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Self<'a>(self: &'a Self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/lt-ref-self-async.rs:30:9 --> $DIR/lt-ref-self-async.rs:30:9
@ -27,6 +39,12 @@ LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Self<'a>(self: Box<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/lt-ref-self-async.rs:36:9 --> $DIR/lt-ref-self-async.rs:36:9
@ -37,6 +55,12 @@ LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Self<'a>(self: Pin<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/lt-ref-self-async.rs:42:9 --> $DIR/lt-ref-self-async.rs:42:9
@ -47,6 +71,12 @@ LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Self<'a>(self: Box<Box<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/lt-ref-self-async.rs:48:9 --> $DIR/lt-ref-self-async.rs:48:9
@ -57,6 +87,12 @@ LL | async fn box_pin_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_Self<'a>(self: Box<Pin<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 6 previous errors error: aborting due to 6 previous errors

View File

@ -7,6 +7,11 @@ LL | async fn ref_self(&self, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_self<'a>(&'a self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/lt-ref-self-async.rs:24:9 --> $DIR/lt-ref-self-async.rs:24:9
@ -17,6 +22,11 @@ LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Self<'a>(self: &'a Self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/lt-ref-self-async.rs:30:9 --> $DIR/lt-ref-self-async.rs:30:9
@ -27,6 +37,11 @@ LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Self<'a>(self: Box<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/lt-ref-self-async.rs:36:9 --> $DIR/lt-ref-self-async.rs:36:9
@ -37,6 +52,11 @@ LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Self<'a>(self: Pin<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/lt-ref-self-async.rs:42:9 --> $DIR/lt-ref-self-async.rs:42:9
@ -47,6 +67,11 @@ LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Self<'a>(self: Box<Box<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/lt-ref-self-async.rs:48:9 --> $DIR/lt-ref-self-async.rs:48:9
@ -57,6 +82,11 @@ LL | async fn box_pin_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_Self<'a>(self: Box<Pin<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 6 previous errors error: aborting due to 6 previous errors

View File

@ -7,6 +7,12 @@ LL | async fn ref_self(&mut self, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_self<'a>(&'a mut self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-self-async.rs:24:9 --> $DIR/ref-mut-self-async.rs:24:9
@ -17,6 +23,12 @@ LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Self<'a>(self: &'a mut Self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-self-async.rs:30:9 --> $DIR/ref-mut-self-async.rs:30:9
@ -27,6 +39,12 @@ LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Self<'a>(self: Box<&'a mut Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-self-async.rs:36:9 --> $DIR/ref-mut-self-async.rs:36:9
@ -37,6 +55,12 @@ LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Self<'a>(self: Pin<&'a mut Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-self-async.rs:42:9 --> $DIR/ref-mut-self-async.rs:42:9
@ -47,6 +71,12 @@ LL | async fn box_box_ref_Self(self: Box<Box<&mut Self>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Self<'a>(self: Box<Box<&'a mut Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-self-async.rs:48:9 --> $DIR/ref-mut-self-async.rs:48:9
@ -57,6 +87,12 @@ LL | async fn box_pin_ref_Self(self: Box<Pin<&mut Self>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_ref_Self<'a>(self: Box<Pin<&'a mut Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 6 previous errors error: aborting due to 6 previous errors

View File

@ -7,6 +7,11 @@ LL | async fn ref_self(&mut self, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_self<'a>(&'a mut self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-self-async.rs:24:9 --> $DIR/ref-mut-self-async.rs:24:9
@ -17,6 +22,11 @@ LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Self<'a>(self: &'a mut Self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-self-async.rs:30:9 --> $DIR/ref-mut-self-async.rs:30:9
@ -27,6 +37,11 @@ LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Self<'a>(self: Box<&'a mut Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-self-async.rs:36:9 --> $DIR/ref-mut-self-async.rs:36:9
@ -37,6 +52,11 @@ LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Self<'a>(self: Pin<&'a mut Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-self-async.rs:42:9 --> $DIR/ref-mut-self-async.rs:42:9
@ -47,6 +67,11 @@ LL | async fn box_box_ref_Self(self: Box<Box<&mut Self>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Self<'a>(self: Box<Box<&'a mut Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-self-async.rs:48:9 --> $DIR/ref-mut-self-async.rs:48:9
@ -57,6 +82,11 @@ LL | async fn box_pin_ref_Self(self: Box<Pin<&mut Self>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_ref_Self<'a>(self: Box<Pin<&'a mut Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 6 previous errors error: aborting due to 6 previous errors

View File

@ -7,6 +7,12 @@ LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Struct<'a>(self: &'a mut Struct, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-struct-async.rs:22:9 --> $DIR/ref-mut-struct-async.rs:22:9
@ -17,6 +23,12 @@ LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Struct<'a>(self: Box<&'a mut Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-struct-async.rs:28:9 --> $DIR/ref-mut-struct-async.rs:28:9
@ -27,6 +39,12 @@ LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Struct<'a>(self: Pin<&'a mut Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-struct-async.rs:34:9 --> $DIR/ref-mut-struct-async.rs:34:9
@ -37,6 +55,12 @@ LL | async fn box_box_ref_Struct(self: Box<Box<&mut Struct>>, f: &u32) -> &u
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Struct<'a>(self: Box<Box<&'a mut Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-mut-struct-async.rs:40:9 --> $DIR/ref-mut-struct-async.rs:40:9
@ -47,6 +71,12 @@ LL | async fn box_pin_ref_Struct(self: Box<Pin<&mut Struct>>, f: &u32) -> &u
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_ref_Struct<'a>(self: Box<Pin<&'a mut Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 5 previous errors error: aborting due to 5 previous errors

View File

@ -7,6 +7,11 @@ LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Struct<'a>(self: &'a mut Struct, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-struct-async.rs:22:9 --> $DIR/ref-mut-struct-async.rs:22:9
@ -17,6 +22,11 @@ LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Struct<'a>(self: Box<&'a mut Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-struct-async.rs:28:9 --> $DIR/ref-mut-struct-async.rs:28:9
@ -27,6 +37,11 @@ LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Struct<'a>(self: Pin<&'a mut Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-struct-async.rs:34:9 --> $DIR/ref-mut-struct-async.rs:34:9
@ -37,6 +52,11 @@ LL | async fn box_box_ref_Struct(self: Box<Box<&mut Struct>>, f: &u32) -> &u
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Struct<'a>(self: Box<Box<&'a mut Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-mut-struct-async.rs:40:9 --> $DIR/ref-mut-struct-async.rs:40:9
@ -47,6 +67,11 @@ LL | async fn box_pin_ref_Struct(self: Box<Pin<&mut Struct>>, f: &u32) -> &u
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_ref_Struct<'a>(self: Box<Pin<&'a mut Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 5 previous errors error: aborting due to 5 previous errors

View File

@ -7,6 +7,12 @@ LL | async fn ref_self(&self, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_self<'a>(&'a self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-self-async.rs:34:9 --> $DIR/ref-self-async.rs:34:9
@ -17,6 +23,12 @@ LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Self<'a>(self: &'a Self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-self-async.rs:40:9 --> $DIR/ref-self-async.rs:40:9
@ -27,6 +39,12 @@ LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Self<'a>(self: Box<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-self-async.rs:46:9 --> $DIR/ref-self-async.rs:46:9
@ -37,6 +55,12 @@ LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Self<'a>(self: Pin<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-self-async.rs:52:9 --> $DIR/ref-self-async.rs:52:9
@ -47,6 +71,12 @@ LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Self<'a>(self: Box<Box<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-self-async.rs:58:9 --> $DIR/ref-self-async.rs:58:9
@ -57,6 +87,12 @@ LL | async fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_ref_Self<'a>(self: Box<Pin<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-self-async.rs:64:9 --> $DIR/ref-self-async.rs:64:9
@ -67,6 +103,12 @@ LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn wrap_ref_Self_Self<'a>(self: Wrap<&'a Self, Self>, f: &'a u8) -> &u8 {
| ++++ ++ ++
error: aborting due to 7 previous errors error: aborting due to 7 previous errors

View File

@ -7,6 +7,11 @@ LL | async fn ref_self(&self, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_self<'a>(&'a self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-self-async.rs:34:9 --> $DIR/ref-self-async.rs:34:9
@ -17,6 +22,11 @@ LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Self<'a>(self: &'a Self, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-self-async.rs:40:9 --> $DIR/ref-self-async.rs:40:9
@ -27,6 +37,11 @@ LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Self<'a>(self: Box<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-self-async.rs:46:9 --> $DIR/ref-self-async.rs:46:9
@ -37,6 +52,11 @@ LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Self<'a>(self: Pin<&'a Self>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-self-async.rs:52:9 --> $DIR/ref-self-async.rs:52:9
@ -47,6 +67,11 @@ LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Self<'a>(self: Box<Box<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-self-async.rs:58:9 --> $DIR/ref-self-async.rs:58:9
@ -57,6 +82,11 @@ LL | async fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_ref_Self<'a>(self: Box<Pin<&'a Self>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-self-async.rs:64:9 --> $DIR/ref-self-async.rs:64:9
@ -67,6 +97,11 @@ LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn wrap_ref_Self_Self<'a>(self: Wrap<&'a Self, Self>, f: &'a u8) -> &u8 {
| ++++ ++ ++
error: aborting due to 7 previous errors error: aborting due to 7 previous errors

View File

@ -7,6 +7,12 @@ LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Struct<'a>(self: &'a Struct, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-struct-async.rs:22:9 --> $DIR/ref-struct-async.rs:22:9
@ -17,6 +23,12 @@ LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Struct<'a>(self: Box<&'a Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-struct-async.rs:28:9 --> $DIR/ref-struct-async.rs:28:9
@ -27,6 +39,12 @@ LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Struct<'a>(self: Pin<&'a Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-struct-async.rs:34:9 --> $DIR/ref-struct-async.rs:34:9
@ -37,6 +55,12 @@ LL | async fn box_box_ref_Struct(self: Box<Box<&Struct>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Struct<'a>(self: Box<Box<&'a Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/ref-struct-async.rs:40:9 --> $DIR/ref-struct-async.rs:40:9
@ -47,6 +71,12 @@ LL | async fn box_pin_Struct(self: Box<Pin<&Struct>>, f: &u32) -> &u32 {
| this parameter and the return type are declared with different lifetimes... | this parameter and the return type are declared with different lifetimes...
LL | f LL | f
| ^ ...but data from `f` is returned here | ^ ...but data from `f` is returned here
|
= note: each elided lifetime in input position becomes a distinct lifetime
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_Struct<'a>(self: Box<Pin<&'a Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 5 previous errors error: aborting due to 5 previous errors

View File

@ -7,6 +7,11 @@ LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn ref_Struct<'a>(self: &'a Struct, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-struct-async.rs:22:9 --> $DIR/ref-struct-async.rs:22:9
@ -17,6 +22,11 @@ LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_ref_Struct<'a>(self: Box<&'a Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-struct-async.rs:28:9 --> $DIR/ref-struct-async.rs:28:9
@ -27,6 +37,11 @@ LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn pin_ref_Struct<'a>(self: Pin<&'a Struct>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-struct-async.rs:34:9 --> $DIR/ref-struct-async.rs:34:9
@ -37,6 +52,11 @@ LL | async fn box_box_ref_Struct(self: Box<Box<&Struct>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_box_ref_Struct<'a>(self: Box<Box<&'a Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/ref-struct-async.rs:40:9 --> $DIR/ref-struct-async.rs:40:9
@ -47,6 +67,11 @@ LL | async fn box_pin_Struct(self: Box<Pin<&Struct>>, f: &u32) -> &u32 {
| let's call the lifetime of this reference `'2` | let's call the lifetime of this reference `'2`
LL | f LL | f
| ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` | ^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter and update trait if needed
|
LL | async fn box_pin_Struct<'a>(self: Box<Pin<&'a Struct>>, f: &'a u32) -> &u32 {
| ++++ ++ ++
error: aborting due to 5 previous errors error: aborting due to 5 previous errors