Revert "Auto merge of #91403 - cjgillot:inherit-async, r=oli-obk"
This reverts commit3cfa4def7c
, reversing changes made to5d8767cb22
.
This commit is contained in:
parent
30b3f35c42
commit
86d17b98f2
34 changed files with 281 additions and 227 deletions
|
@ -1659,12 +1659,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
|
|
||||||
// When we create the opaque type for this async fn, it is going to have
|
// When we create the opaque type for this async fn, it is going to have
|
||||||
// to capture all the lifetimes involved in the signature (including in the
|
// to capture all the lifetimes involved in the signature (including in the
|
||||||
// return type). This is done by:
|
// return type). This is done by introducing lifetime parameters for:
|
||||||
//
|
//
|
||||||
// - making the opaque type inherit all lifetime parameters from its parent;
|
// - all the explicitly declared lifetimes from the impl and function itself;
|
||||||
// - make all the elided lifetimes in the fn arguments into parameters;
|
// - all the elided lifetimes in the fn arguments;
|
||||||
// - manually introducing parameters on the opaque type for elided
|
// - all the elided lifetimes in the return type.
|
||||||
// lifetimes in the return type.
|
|
||||||
//
|
//
|
||||||
// So for example in this snippet:
|
// So for example in this snippet:
|
||||||
//
|
//
|
||||||
|
@ -1680,14 +1679,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
// we would create an opaque type like:
|
// we would create an opaque type like:
|
||||||
//
|
//
|
||||||
// ```
|
// ```
|
||||||
// type Foo<'a>::bar<'b, '0, '1>::Bar<'2> = impl Future<Output = &'2 u32>;
|
// type Bar<'a, 'b, '0, '1, '2> = impl Future<Output = &'2 u32>;
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
// and we would then desugar `bar` to the equivalent of:
|
// and we would then desugar `bar` to the equivalent of:
|
||||||
//
|
//
|
||||||
// ```rust
|
// ```rust
|
||||||
// impl<'a> Foo<'a> {
|
// impl<'a> Foo<'a> {
|
||||||
// fn bar<'b, '0, '1>(&'0 self, x: &'b Vec<f64>, y: &'1 str) -> Bar<'_>
|
// fn bar<'b, '0, '1>(&'0 self, x: &'b Vec<f64>, y: &'1 str) -> Bar<'a, 'b, '0, '1, '_>
|
||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
|
@ -1695,7 +1694,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
// this is because the elided lifetimes from the return type
|
// this is because the elided lifetimes from the return type
|
||||||
// should be figured out using the ordinary elision rules, and
|
// should be figured out using the ordinary elision rules, and
|
||||||
// this desugaring achieves that.
|
// this desugaring achieves that.
|
||||||
let mut lifetime_params = Vec::new();
|
|
||||||
|
debug!("lower_async_fn_ret_ty: in_scope_lifetimes={:#?}", self.in_scope_lifetimes);
|
||||||
|
debug!("lower_async_fn_ret_ty: lifetimes_to_define={:#?}", self.lifetimes_to_define);
|
||||||
|
|
||||||
|
// Calculate all the lifetimes that should be captured
|
||||||
|
// by the opaque type. This should include all in-scope
|
||||||
|
// lifetime parameters, including those defined in-band.
|
||||||
|
//
|
||||||
|
// `lifetime_params` is a vector of tuple (span, parameter name, lifetime name).
|
||||||
|
|
||||||
|
// Input lifetime like `'a` or `'1`:
|
||||||
|
let mut lifetime_params: Vec<_> = self
|
||||||
|
.in_scope_lifetimes
|
||||||
|
.iter()
|
||||||
|
.cloned()
|
||||||
|
.map(|name| (name.ident().span, name, hir::LifetimeName::Param(name)))
|
||||||
|
.chain(
|
||||||
|
self.lifetimes_to_define
|
||||||
|
.iter()
|
||||||
|
.map(|&(span, name)| (span, name, hir::LifetimeName::Param(name))),
|
||||||
|
)
|
||||||
|
.collect();
|
||||||
|
|
||||||
self.with_hir_id_owner(opaque_ty_node_id, |this| {
|
self.with_hir_id_owner(opaque_ty_node_id, |this| {
|
||||||
// We have to be careful to get elision right here. The
|
// We have to be careful to get elision right here. The
|
||||||
// idea is that we create a lifetime parameter for each
|
// idea is that we create a lifetime parameter for each
|
||||||
|
@ -1714,12 +1735,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
debug!("lower_async_fn_ret_ty: future_bound={:#?}", future_bound);
|
debug!("lower_async_fn_ret_ty: future_bound={:#?}", future_bound);
|
||||||
debug!("lower_async_fn_ret_ty: lifetimes_to_define={:#?}", lifetimes_to_define);
|
debug!("lower_async_fn_ret_ty: lifetimes_to_define={:#?}", lifetimes_to_define);
|
||||||
|
|
||||||
|
lifetime_params.extend(
|
||||||
// Output lifetime like `'_`:
|
// Output lifetime like `'_`:
|
||||||
lifetime_params = lifetimes_to_define;
|
lifetimes_to_define
|
||||||
|
.into_iter()
|
||||||
|
.map(|(span, name)| (span, name, hir::LifetimeName::Implicit(false))),
|
||||||
|
);
|
||||||
debug!("lower_async_fn_ret_ty: lifetime_params={:#?}", lifetime_params);
|
debug!("lower_async_fn_ret_ty: lifetime_params={:#?}", lifetime_params);
|
||||||
|
|
||||||
let generic_params =
|
let generic_params =
|
||||||
this.arena.alloc_from_iter(lifetime_params.iter().map(|&(span, hir_name)| {
|
this.arena.alloc_from_iter(lifetime_params.iter().map(|&(span, hir_name, _)| {
|
||||||
this.lifetime_to_generic_param(span, hir_name, opaque_ty_def_id)
|
this.lifetime_to_generic_param(span, hir_name, opaque_ty_def_id)
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -1737,22 +1762,28 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
this.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
|
this.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
|
||||||
});
|
});
|
||||||
|
|
||||||
// We need to create the lifetime arguments to our opaque type.
|
// As documented above on the variable
|
||||||
// Continuing with our example, we're creating the type arguments
|
// `input_lifetimes_count`, we need to create the lifetime
|
||||||
// for the return type:
|
// arguments to our opaque type. Continuing with our example,
|
||||||
|
// we're creating the type arguments for the return type:
|
||||||
//
|
//
|
||||||
// ```
|
// ```
|
||||||
// For<'a>::bar<'b, '0, '1>::Bar<'_>
|
// Bar<'a, 'b, '0, '1, '_>
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
// For the "input" lifetime parameters are inherited automatically.
|
// For the "input" lifetime parameters, we wish to create
|
||||||
// For the "output" lifetime parameters, we just want to generate `'_`.
|
// references to the parameters themselves, including the
|
||||||
|
// "implicit" ones created from parameter types (`'a`, `'b`,
|
||||||
|
// '`0`, `'1`).
|
||||||
|
//
|
||||||
|
// For the "output" lifetime parameters, we just want to
|
||||||
|
// generate `'_`.
|
||||||
let generic_args =
|
let generic_args =
|
||||||
self.arena.alloc_from_iter(lifetime_params.into_iter().map(|(span, _)| {
|
self.arena.alloc_from_iter(lifetime_params.into_iter().map(|(span, _, name)| {
|
||||||
GenericArg::Lifetime(hir::Lifetime {
|
GenericArg::Lifetime(hir::Lifetime {
|
||||||
hir_id: self.next_id(),
|
hir_id: self.next_id(),
|
||||||
span: self.lower_span(span),
|
span: self.lower_span(span),
|
||||||
name: hir::LifetimeName::Implicit(false),
|
name,
|
||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
|
@ -2156,24 +2156,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// When in async fn, prefer errors that come from inside the closure.
|
|
||||||
if !categorized_path[i].from_closure {
|
|
||||||
let span = categorized_path.iter().find_map(|p| {
|
|
||||||
if p.from_closure
|
|
||||||
&& p.category == categorized_path[i].category
|
|
||||||
&& categorized_path[i].cause.span.contains(p.cause.span)
|
|
||||||
{
|
|
||||||
Some(p.cause.span)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if let Some(span) = span {
|
|
||||||
categorized_path[i].cause.span = span;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return categorized_path[i].clone();
|
return categorized_path[i].clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
`impl trait` return type cannot contain a projection
|
`async fn`/`impl trait` return type cannot contain a projection
|
||||||
or `Self` that references lifetimes from a parent scope.
|
or `Self` that references lifetimes from a parent scope.
|
||||||
|
|
||||||
Erroneous code example:
|
Erroneous code example:
|
||||||
|
@ -7,7 +7,7 @@ Erroneous code example:
|
||||||
struct S<'a>(&'a i32);
|
struct S<'a>(&'a i32);
|
||||||
|
|
||||||
impl<'a> S<'a> {
|
impl<'a> S<'a> {
|
||||||
fn new(i: &'a i32) -> impl Into<Self> {
|
async fn new(i: &'a i32) -> Self {
|
||||||
S(&22)
|
S(&22)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ To fix this error we need to spell out `Self` to `S<'a>`:
|
||||||
struct S<'a>(&'a i32);
|
struct S<'a>(&'a i32);
|
||||||
|
|
||||||
impl<'a> S<'a> {
|
impl<'a> S<'a> {
|
||||||
fn new(i: &'a i32) -> impl Into<S<'a>> {
|
async fn new(i: &'a i32) -> S<'a> {
|
||||||
S(&22)
|
S(&22)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -276,7 +276,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
debug!(?concrete_ty);
|
debug!(?concrete_ty);
|
||||||
|
|
||||||
let first_own_region = match opaque_defn.origin {
|
let first_own_region = match opaque_defn.origin {
|
||||||
hir::OpaqueTyOrigin::FnReturn(..) => {
|
hir::OpaqueTyOrigin::FnReturn(..) | hir::OpaqueTyOrigin::AsyncFn(..) => {
|
||||||
// We lower
|
// We lower
|
||||||
//
|
//
|
||||||
// fn foo<'l0..'ln>() -> impl Trait<'l0..'lm>
|
// fn foo<'l0..'ln>() -> impl Trait<'l0..'lm>
|
||||||
|
@ -291,7 +291,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
// These opaque type inherit all lifetime parameters from their
|
// These opaque type inherit all lifetime parameters from their
|
||||||
// parent, so we have to check them all.
|
// parent, so we have to check them all.
|
||||||
hir::OpaqueTyOrigin::AsyncFn(..) | hir::OpaqueTyOrigin::TyAlias => 0,
|
hir::OpaqueTyOrigin::TyAlias => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
// For a case like `impl Foo<'a, 'b>`, we would generate a constraint
|
// For a case like `impl Foo<'a, 'b>`, we would generate a constraint
|
||||||
|
|
|
@ -729,16 +729,9 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
||||||
match item.kind {
|
match item.kind {
|
||||||
hir::ItemKind::Fn(ref sig, ref generics, _) => {
|
hir::ItemKind::Fn(ref sig, ref generics, _) => {
|
||||||
self.missing_named_lifetime_spots.push(generics.into());
|
self.missing_named_lifetime_spots.push(generics.into());
|
||||||
self.visit_early_late(
|
self.visit_early_late(None, item.hir_id(), &sig.decl, generics, |this| {
|
||||||
None,
|
|
||||||
item.hir_id(),
|
|
||||||
&sig.decl,
|
|
||||||
generics,
|
|
||||||
sig.header.asyncness,
|
|
||||||
|this| {
|
|
||||||
intravisit::walk_item(this, item);
|
intravisit::walk_item(this, item);
|
||||||
},
|
});
|
||||||
);
|
|
||||||
self.missing_named_lifetime_spots.pop();
|
self.missing_named_lifetime_spots.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -856,16 +849,11 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
||||||
|
|
||||||
fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) {
|
fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) {
|
||||||
match item.kind {
|
match item.kind {
|
||||||
hir::ForeignItemKind::Fn(ref decl, _, ref generics) => self.visit_early_late(
|
hir::ForeignItemKind::Fn(ref decl, _, ref generics) => {
|
||||||
None,
|
self.visit_early_late(None, item.hir_id(), decl, generics, |this| {
|
||||||
item.hir_id(),
|
|
||||||
decl,
|
|
||||||
generics,
|
|
||||||
hir::IsAsync::NotAsync,
|
|
||||||
|this| {
|
|
||||||
intravisit::walk_foreign_item(this, item);
|
intravisit::walk_foreign_item(this, item);
|
||||||
},
|
})
|
||||||
),
|
}
|
||||||
hir::ForeignItemKind::Static(..) => {
|
hir::ForeignItemKind::Static(..) => {
|
||||||
intravisit::walk_foreign_item(self, item);
|
intravisit::walk_foreign_item(self, item);
|
||||||
}
|
}
|
||||||
|
@ -1142,7 +1130,6 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
||||||
trait_item.hir_id(),
|
trait_item.hir_id(),
|
||||||
&sig.decl,
|
&sig.decl,
|
||||||
&trait_item.generics,
|
&trait_item.generics,
|
||||||
sig.header.asyncness,
|
|
||||||
|this| intravisit::walk_trait_item(this, trait_item),
|
|this| intravisit::walk_trait_item(this, trait_item),
|
||||||
);
|
);
|
||||||
self.missing_named_lifetime_spots.pop();
|
self.missing_named_lifetime_spots.pop();
|
||||||
|
@ -1212,7 +1199,6 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
||||||
impl_item.hir_id(),
|
impl_item.hir_id(),
|
||||||
&sig.decl,
|
&sig.decl,
|
||||||
&impl_item.generics,
|
&impl_item.generics,
|
||||||
sig.header.asyncness,
|
|
||||||
|this| intravisit::walk_impl_item(this, impl_item),
|
|this| intravisit::walk_impl_item(this, impl_item),
|
||||||
);
|
);
|
||||||
self.missing_named_lifetime_spots.pop();
|
self.missing_named_lifetime_spots.pop();
|
||||||
|
@ -2173,15 +2159,11 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||||
hir_id: hir::HirId,
|
hir_id: hir::HirId,
|
||||||
decl: &'tcx hir::FnDecl<'tcx>,
|
decl: &'tcx hir::FnDecl<'tcx>,
|
||||||
generics: &'tcx hir::Generics<'tcx>,
|
generics: &'tcx hir::Generics<'tcx>,
|
||||||
asyncness: hir::IsAsync,
|
|
||||||
walk: F,
|
walk: F,
|
||||||
) where
|
) where
|
||||||
F: for<'b, 'c> FnOnce(&'b mut LifetimeContext<'c, 'tcx>),
|
F: for<'b, 'c> FnOnce(&'b mut LifetimeContext<'c, 'tcx>),
|
||||||
{
|
{
|
||||||
// Async fns need all their lifetime parameters to be early bound.
|
|
||||||
if asyncness != hir::IsAsync::Async {
|
|
||||||
insert_late_bound_lifetimes(self.map, decl, generics);
|
insert_late_bound_lifetimes(self.map, decl, generics);
|
||||||
}
|
|
||||||
|
|
||||||
// Find the start of nested early scopes, e.g., in methods.
|
// Find the start of nested early scopes, e.g., in methods.
|
||||||
let mut next_early_index = 0;
|
let mut next_early_index = 0;
|
||||||
|
|
|
@ -2409,11 +2409,16 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
let def_id = item_id.def_id.to_def_id();
|
let def_id = item_id.def_id.to_def_id();
|
||||||
|
|
||||||
match opaque_ty.kind {
|
match opaque_ty.kind {
|
||||||
hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => {
|
hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => self
|
||||||
let replace_parent_lifetimes =
|
.impl_trait_ty_to_ty(
|
||||||
matches!(origin, hir::OpaqueTyOrigin::FnReturn(..));
|
def_id,
|
||||||
self.impl_trait_ty_to_ty(def_id, lifetimes, replace_parent_lifetimes)
|
lifetimes,
|
||||||
}
|
matches!(
|
||||||
|
origin,
|
||||||
|
hir::OpaqueTyOrigin::FnReturn(..)
|
||||||
|
| hir::OpaqueTyOrigin::AsyncFn(..)
|
||||||
|
),
|
||||||
|
),
|
||||||
ref i => bug!("`impl Trait` pointed to non-opaque type?? {:#?}", i),
|
ref i => bug!("`impl Trait` pointed to non-opaque type?? {:#?}", i),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -545,8 +545,10 @@ pub(super) fn check_opaque_for_inheriting_lifetimes<'tcx>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::FnReturn(..), .. }) =
|
if let ItemKind::OpaqueTy(hir::OpaqueTy {
|
||||||
item.kind
|
origin: hir::OpaqueTyOrigin::AsyncFn(..) | hir::OpaqueTyOrigin::FnReturn(..),
|
||||||
|
..
|
||||||
|
}) = item.kind
|
||||||
{
|
{
|
||||||
let mut visitor = ProhibitOpaqueVisitor {
|
let mut visitor = ProhibitOpaqueVisitor {
|
||||||
opaque_identity_ty: tcx.mk_opaque(
|
opaque_identity_ty: tcx.mk_opaque(
|
||||||
|
@ -568,13 +570,20 @@ pub(super) fn check_opaque_for_inheriting_lifetimes<'tcx>(
|
||||||
|
|
||||||
if let Some(ty) = prohibit_opaque.break_value() {
|
if let Some(ty) = prohibit_opaque.break_value() {
|
||||||
visitor.visit_item(&item);
|
visitor.visit_item(&item);
|
||||||
|
let is_async = match item.kind {
|
||||||
|
ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => {
|
||||||
|
matches!(origin, hir::OpaqueTyOrigin::AsyncFn(..))
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
let mut err = struct_span_err!(
|
let mut err = struct_span_err!(
|
||||||
tcx.sess,
|
tcx.sess,
|
||||||
span,
|
span,
|
||||||
E0760,
|
E0760,
|
||||||
"`impl Trait` return type cannot contain a projection or `Self` that references lifetimes from \
|
"`{}` return type cannot contain a projection or `Self` that references lifetimes from \
|
||||||
a parent scope",
|
a parent scope",
|
||||||
|
if is_async { "async fn" } else { "impl Trait" },
|
||||||
);
|
);
|
||||||
|
|
||||||
for (span, name) in visitor.selftys {
|
for (span, name) in visitor.selftys {
|
||||||
|
|
|
@ -2157,7 +2157,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
|
||||||
generics
|
generics
|
||||||
}
|
}
|
||||||
ItemKind::OpaqueTy(OpaqueTy {
|
ItemKind::OpaqueTy(OpaqueTy {
|
||||||
origin: hir::OpaqueTyOrigin::FnReturn(..), ..
|
origin: hir::OpaqueTyOrigin::AsyncFn(..) | hir::OpaqueTyOrigin::FnReturn(..),
|
||||||
|
..
|
||||||
}) => {
|
}) => {
|
||||||
// return-position impl trait
|
// return-position impl trait
|
||||||
//
|
//
|
||||||
|
@ -2177,7 +2178,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
|
||||||
}
|
}
|
||||||
ItemKind::OpaqueTy(OpaqueTy {
|
ItemKind::OpaqueTy(OpaqueTy {
|
||||||
ref generics,
|
ref generics,
|
||||||
origin: hir::OpaqueTyOrigin::AsyncFn(..) | hir::OpaqueTyOrigin::TyAlias,
|
origin: hir::OpaqueTyOrigin::TyAlias,
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
// type-alias impl trait
|
// type-alias impl trait
|
||||||
|
|
|
@ -585,12 +585,7 @@ fn clean_ty_generics(
|
||||||
.params
|
.params
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|param| match param.kind {
|
.filter_map(|param| match param.kind {
|
||||||
ty::GenericParamDefKind::Lifetime => {
|
ty::GenericParamDefKind::Lifetime => Some(param.clean(cx)),
|
||||||
if param.name == kw::UnderscoreLifetime {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
Some(param.clean(cx))
|
|
||||||
}
|
|
||||||
ty::GenericParamDefKind::Type { synthetic, .. } => {
|
ty::GenericParamDefKind::Type { synthetic, .. } => {
|
||||||
if param.name == kw::SelfUpper {
|
if param.name == kw::SelfUpper {
|
||||||
assert_eq!(param.index, 0);
|
assert_eq!(param.index, 0);
|
||||||
|
|
|
@ -8,6 +8,7 @@ pub struct Foo<'a> {
|
||||||
|
|
||||||
impl<'a> Foo<'a> {
|
impl<'a> Foo<'a> {
|
||||||
pub async fn new(_bar: &'a i32) -> Self {
|
pub async fn new(_bar: &'a i32) -> Self {
|
||||||
|
//~^ ERROR `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
||||||
Foo {
|
Foo {
|
||||||
bar: &22
|
bar: &22
|
||||||
}
|
}
|
||||||
|
@ -18,7 +19,6 @@ async fn foo() {
|
||||||
let x = {
|
let x = {
|
||||||
let bar = 22;
|
let bar = 22;
|
||||||
Foo::new(&bar).await
|
Foo::new(&bar).await
|
||||||
//~^ ERROR `bar` does not live long enough [E0597]
|
|
||||||
};
|
};
|
||||||
drop(x);
|
drop(x);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,9 @@
|
||||||
error[E0597]: `bar` does not live long enough
|
error[E0760]: `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
||||||
--> $DIR/issue-61949-self-return-type.rs:20:18
|
--> $DIR/issue-61949-self-return-type.rs:10:40
|
||||||
|
|
|
|
||||||
LL | let x = {
|
LL | pub async fn new(_bar: &'a i32) -> Self {
|
||||||
| - borrow later stored here
|
| ^^^^ help: consider spelling out the type instead: `Foo<'a>`
|
||||||
LL | let bar = 22;
|
|
||||||
LL | Foo::new(&bar).await
|
|
||||||
| ^^^^ borrowed value does not live long enough
|
|
||||||
LL |
|
|
||||||
LL | };
|
|
||||||
| - `bar` dropped here while still borrowed
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0597`.
|
For more information about this error, try `rustc --explain E0760`.
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
error[E0506]: cannot assign to `*x` because it is borrowed
|
error[E0506]: cannot assign to `*x` because it is borrowed
|
||||||
--> $DIR/issue-74072-lifetime-name-annotations.rs:9:5
|
--> $DIR/issue-74072-lifetime-name-annotations.rs:9:5
|
||||||
|
|
|
|
||||||
|
LL | pub async fn async_fn(x: &mut i32) -> &i32 {
|
||||||
|
| - let's call the lifetime of this reference `'1`
|
||||||
LL | let y = &*x;
|
LL | let y = &*x;
|
||||||
| --- borrow of `*x` occurs here
|
| --- borrow of `*x` occurs here
|
||||||
LL | *x += 1;
|
LL | *x += 1;
|
||||||
| ^^^^^^^ assignment to borrowed `*x` occurs here
|
| ^^^^^^^ assignment to borrowed `*x` occurs here
|
||||||
|
LL | y
|
||||||
|
| - returning this value requires that `*x` is borrowed for `'1`
|
||||||
|
|
||||||
error[E0506]: cannot assign to `*x` because it is borrowed
|
error[E0506]: cannot assign to `*x` because it is borrowed
|
||||||
--> $DIR/issue-74072-lifetime-name-annotations.rs:16:9
|
--> $DIR/issue-74072-lifetime-name-annotations.rs:16:9
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
error[E0506]: cannot assign to `*x` because it is borrowed
|
error[E0506]: cannot assign to `*x` because it is borrowed
|
||||||
--> $DIR/issue-75785-confusing-named-region.rs:9:5
|
--> $DIR/issue-75785-confusing-named-region.rs:9:5
|
||||||
|
|
|
|
||||||
|
LL | pub async fn async_fn(x: &mut i32) -> (&i32, &i32) {
|
||||||
|
| - let's call the lifetime of this reference `'1`
|
||||||
LL | let y = &*x;
|
LL | let y = &*x;
|
||||||
| --- borrow of `*x` occurs here
|
| --- borrow of `*x` occurs here
|
||||||
LL | *x += 1;
|
LL | *x += 1;
|
||||||
| ^^^^^^^ assignment to borrowed `*x` occurs here
|
| ^^^^^^^ assignment to borrowed `*x` occurs here
|
||||||
|
LL | (&32, y)
|
||||||
|
| -------- returning this value requires that `*x` is borrowed for `'1`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,12 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/issue-63388-1.rs:14:9
|
--> $DIR/issue-63388-1.rs:14:9
|
||||||
|
|
|
|
||||||
LL | &'a self, foo: &dyn Foo
|
LL | &'a self, foo: &dyn Foo
|
||||||
| -------- -------- these two types are declared with different lifetimes...
|
| -------- this parameter and the return type are declared with different lifetimes...
|
||||||
...
|
LL | ) -> &dyn Foo
|
||||||
|
| --------
|
||||||
|
LL | {
|
||||||
LL | foo
|
LL | foo
|
||||||
| ^^^ ...but data from `foo` flows into `self` here
|
| ^^^ ...but data from `foo` is returned here
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// check-pass
|
|
||||||
// edition:2018
|
// edition:2018
|
||||||
|
|
||||||
struct S<'a>(&'a i32);
|
struct S<'a>(&'a i32);
|
||||||
|
|
||||||
impl<'a> S<'a> {
|
impl<'a> S<'a> {
|
||||||
async fn new(i: &'a i32) -> Result<Self, ()> {
|
async fn new(i: &'a i32) -> Result<Self, ()> {
|
||||||
|
//~^ ERROR: `async fn`
|
||||||
Ok(S(&22))
|
Ok(S(&22))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
11
src/test/ui/async-await/issues/issue-78600.stderr
Normal file
11
src/test/ui/async-await/issues/issue-78600.stderr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
error[E0760]: `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
||||||
|
--> $DIR/issue-78600.rs:6:33
|
||||||
|
|
|
||||||
|
LL | async fn new(i: &'a i32) -> Result<Self, ()> {
|
||||||
|
| ^^^^^^^----^^^^^
|
||||||
|
| |
|
||||||
|
| help: consider spelling out the type instead: `S<'a>`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0760`.
|
|
@ -1,13 +1,15 @@
|
||||||
error: lifetime may not live long enough
|
error: lifetime may not live long enough
|
||||||
--> $DIR/ret-impl-trait-one.rs:12:5
|
--> $DIR/ret-impl-trait-one.rs:10:85
|
||||||
|
|
|
|
||||||
LL | async fn async_ret_impl_trait3<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
LL | async fn async_ret_impl_trait3<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
||||||
| -- -- lifetime `'b` defined here
|
| ________________________________--__--_______________________________________________^
|
||||||
| |
|
| | | |
|
||||||
| lifetime `'a` defined here
|
| | | lifetime `'b` defined here
|
||||||
LL |
|
| | lifetime `'a` defined here
|
||||||
LL | (a, b)
|
LL | |
|
||||||
| ^^^^^^ function was supposed to return data with lifetime `'b` but it is returning data with lifetime `'a`
|
LL | | (a, b)
|
||||||
|
LL | | }
|
||||||
|
| |_^ function was supposed to return data with lifetime `'b` but it is returning data with lifetime `'a`
|
||||||
|
|
|
|
||||||
= help: consider adding the following bound: `'a: 'b`
|
= help: consider adding the following bound: `'a: 'b`
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,10 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ret-impl-trait-one.rs:10:65
|
--> $DIR/ret-impl-trait-one.rs:10:65
|
||||||
|
|
|
|
||||||
LL | async fn async_ret_impl_trait3<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
LL | async fn async_ret_impl_trait3<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
||||||
| ------ ------ ^^^^^^^^^^^^^^^^^^^ ...but data from `a` flows into `b` here
|
| ------ ^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| | |
|
||||||
| these two types are declared with different lifetimes...
|
| | ...but data from `a` is returned here
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
|
|
||||||
error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds
|
error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds
|
||||||
--> $DIR/ret-impl-trait-one.rs:16:65
|
--> $DIR/ret-impl-trait-one.rs:16:65
|
||||||
|
|
|
@ -10,13 +10,10 @@
|
||||||
// Even wrong cases don't cause errors because async functions are desugared with all lifetimes
|
// Even wrong cases don't cause errors because async functions are desugared with all lifetimes
|
||||||
// involved in the signature. So, we cannot predict what lifetimes are unused in async function.
|
// involved in the signature. So, we cannot predict what lifetimes are unused in async function.
|
||||||
async fn async_wrong_without_args<'a>() {}
|
async fn async_wrong_without_args<'a>() {}
|
||||||
//~^ ERROR lifetime parameter `'a` never used [unused_lifetimes]
|
|
||||||
|
|
||||||
async fn async_wrong_1_lifetime<'a>(_: &i32) {}
|
async fn async_wrong_1_lifetime<'a>(_: &i32) {}
|
||||||
//~^ ERROR lifetime parameter `'a` never used [unused_lifetimes]
|
|
||||||
|
|
||||||
async fn async_wrong_2_lifetimes<'a, 'b>(_: &'a i32, _: &i32) {}
|
async fn async_wrong_2_lifetimes<'a, 'b>(_: &'a i32, _: &i32) {}
|
||||||
//~^ ERROR lifetime parameter `'b` never used [unused_lifetimes]
|
|
||||||
|
|
||||||
async fn async_right_1_lifetime<'a>(_: &'a i32) {}
|
async fn async_right_1_lifetime<'a>(_: &'a i32) {}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
error: lifetime parameter `'a` never used
|
error: lifetime parameter `'a` never used
|
||||||
--> $DIR/unused-lifetime.rs:12:35
|
--> $DIR/unused-lifetime.rs:31:23
|
||||||
|
|
|
|
||||||
LL | async fn async_wrong_without_args<'a>() {}
|
LL | fn wrong_without_args<'a>() {}
|
||||||
| -^^- help: elide the unused lifetime
|
| -^^- help: elide the unused lifetime
|
||||||
|
|
|
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
|
@ -11,40 +11,18 @@ LL | #![deny(unused_lifetimes)]
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: lifetime parameter `'a` never used
|
error: lifetime parameter `'a` never used
|
||||||
--> $DIR/unused-lifetime.rs:15:33
|
--> $DIR/unused-lifetime.rs:33:21
|
||||||
|
|
|
||||||
LL | async fn async_wrong_1_lifetime<'a>(_: &i32) {}
|
|
||||||
| ^^-----
|
|
||||||
| |
|
|
||||||
| help: elide the unused lifetime
|
|
||||||
|
|
||||||
error: lifetime parameter `'b` never used
|
|
||||||
--> $DIR/unused-lifetime.rs:18:38
|
|
||||||
|
|
|
||||||
LL | async fn async_wrong_2_lifetimes<'a, 'b>(_: &'a i32, _: &i32) {}
|
|
||||||
| ^^-----------------
|
|
||||||
| |
|
|
||||||
| help: elide the unused lifetime
|
|
||||||
|
|
||||||
error: lifetime parameter `'a` never used
|
|
||||||
--> $DIR/unused-lifetime.rs:34:23
|
|
||||||
|
|
|
||||||
LL | fn wrong_without_args<'a>() {}
|
|
||||||
| -^^- help: elide the unused lifetime
|
|
||||||
|
|
||||||
error: lifetime parameter `'a` never used
|
|
||||||
--> $DIR/unused-lifetime.rs:36:21
|
|
||||||
|
|
|
|
||||||
LL | fn wrong_1_lifetime<'a>(_: &i32) {}
|
LL | fn wrong_1_lifetime<'a>(_: &i32) {}
|
||||||
| -^^- help: elide the unused lifetime
|
| -^^- help: elide the unused lifetime
|
||||||
|
|
||||||
error: lifetime parameter `'b` never used
|
error: lifetime parameter `'b` never used
|
||||||
--> $DIR/unused-lifetime.rs:38:26
|
--> $DIR/unused-lifetime.rs:35:26
|
||||||
|
|
|
|
||||||
LL | fn wrong_2_lifetimes<'a, 'b>(_: &'a i32, _: &i32) {}
|
LL | fn wrong_2_lifetimes<'a, 'b>(_: &'a i32, _: &i32) {}
|
||||||
| --^^
|
| --^^
|
||||||
| |
|
| |
|
||||||
| help: elide the unused lifetime
|
| help: elide the unused lifetime
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
error[E0515]: cannot return value referencing local variable `raw_lines`
|
error[E0515]: cannot return value referencing local variable `raw_lines`
|
||||||
--> $DIR/drop-with-active-borrows-2.rs:3:30
|
--> $DIR/drop-with-active-borrows-2.rs:3:5
|
||||||
|
|
|
|
||||||
LL | raw_lines.iter().map(|l| l.trim()).collect()
|
LL | raw_lines.iter().map(|l| l.trim()).collect()
|
||||||
| ---------------- ^^^^^^^^ returns a value referencing data owned by the current function
|
| ----------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
|
| returns a value referencing data owned by the current function
|
||||||
| `raw_lines` is borrowed here
|
| `raw_lines` is borrowed here
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
fn read_lines_borrowed<'a>() -> Vec<&'a str> {
|
fn read_lines_borrowed<'a>() -> Vec<&'a str> {
|
||||||
let rawLines: Vec<String> = vec!["foo ".to_string(), " bar".to_string()];
|
let rawLines: Vec<String> = vec!["foo ".to_string(), " bar".to_string()];
|
||||||
rawLines.iter().map(|l| l.trim()).collect()
|
rawLines //~ ERROR cannot return value referencing local variable `rawLines`
|
||||||
//~^ ERROR cannot return value referencing local variable `rawLines`
|
.iter().map(|l| l.trim()).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
error[E0515]: cannot return value referencing local variable `rawLines`
|
error[E0515]: cannot return value referencing local variable `rawLines`
|
||||||
--> $DIR/issue-13497-2.rs:3:29
|
--> $DIR/issue-13497-2.rs:3:5
|
||||||
|
|
|
|
||||||
LL | rawLines.iter().map(|l| l.trim()).collect()
|
LL | rawLines
|
||||||
| --------------- ^^^^^^^^ returns a value referencing data owned by the current function
|
| _____^
|
||||||
| |
|
| |_____|
|
||||||
|
| ||
|
||||||
|
LL | || .iter().map(|l| l.trim()).collect()
|
||||||
|
| ||_______________-___________________________^ returns a value referencing data owned by the current function
|
||||||
|
| |________________|
|
||||||
| `rawLines` is borrowed here
|
| `rawLines` is borrowed here
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
|
@ -20,8 +20,9 @@ error: lifetime may not live long enough
|
||||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:64
|
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:64
|
||||||
|
|
|
|
||||||
LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg }
|
LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg }
|
||||||
| -- ---- has type `Pin<&'1 Foo>` ^^^ associated function was supposed to return data with lifetime `'1` but it is returning data with lifetime `'a`
|
| -- - ^^^ associated function was supposed to return data with lifetime `'1` but it is returning data with lifetime `'a`
|
||||||
| |
|
| | |
|
||||||
|
| | let's call the lifetime of this reference `'1`
|
||||||
| lifetime `'a` defined here
|
| lifetime `'a` defined here
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
|
@ -2,25 +2,25 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:8:52
|
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:8:52
|
||||||
|
|
|
|
||||||
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f }
|
||||||
| ---- ---- ^ ...but data from `f` flows into `self` here
|
| ---- ---- ^ ...but data from `f` is returned here
|
||||||
| |
|
| |
|
||||||
| these two types are declared with different lifetimes...
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:11:82
|
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:11:82
|
||||||
|
|
|
|
||||||
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) }
|
||||||
| ----- ---- ^ ...but data from `f` flows into `self` here
|
| ---- ----------------- ^ ...but data from `f` is returned here
|
||||||
| |
|
| |
|
||||||
| these two types are declared with different lifetimes...
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:64
|
--> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:64
|
||||||
|
|
|
|
||||||
LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg }
|
LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg }
|
||||||
| ----- ------ ^^^ ...but data from `arg` flows into `self` here
|
| ------ --- ^^^ ...but data from `arg` is returned here
|
||||||
| |
|
| |
|
||||||
| these two types are declared with different lifetimes...
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,49 +2,61 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/lt-ref-self-async.rs:13:9
|
--> $DIR/lt-ref-self-async.rs:13:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_self(&self, f: &u32) -> &u32 {
|
LL | async fn ref_self(&self, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/lt-ref-self-async.rs:19:9
|
--> $DIR/lt-ref-self-async.rs:19:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
|
LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/lt-ref-self-async.rs:23:9
|
--> $DIR/lt-ref-self-async.rs:23:9
|
||||||
|
|
|
|
||||||
LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
|
LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/lt-ref-self-async.rs:27:9
|
--> $DIR/lt-ref-self-async.rs:27:9
|
||||||
|
|
|
|
||||||
LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
|
LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/lt-ref-self-async.rs:31:9
|
--> $DIR/lt-ref-self-async.rs:31:9
|
||||||
|
|
|
|
||||||
LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
|
LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/lt-ref-self-async.rs:35:9
|
--> $DIR/lt-ref-self-async.rs:35:9
|
||||||
|
|
|
|
||||||
LL | async fn box_pin_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
|
LL | async fn box_pin_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,49 +2,61 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-self-async.rs:13:9
|
--> $DIR/ref-mut-self-async.rs:13:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_self(&mut self, f: &u32) -> &u32 {
|
LL | async fn ref_self(&mut self, f: &u32) -> &u32 {
|
||||||
| --------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-self-async.rs:19:9
|
--> $DIR/ref-mut-self-async.rs:19:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 {
|
LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 {
|
||||||
| --------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-self-async.rs:23:9
|
--> $DIR/ref-mut-self-async.rs:23:9
|
||||||
|
|
|
|
||||||
LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 {
|
LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 {
|
||||||
| --------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-self-async.rs:27:9
|
--> $DIR/ref-mut-self-async.rs:27:9
|
||||||
|
|
|
|
||||||
LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 {
|
LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 {
|
||||||
| --------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-self-async.rs:31:9
|
--> $DIR/ref-mut-self-async.rs:31:9
|
||||||
|
|
|
|
||||||
LL | async fn box_box_ref_Self(self: Box<Box<&mut Self>>, f: &u32) -> &u32 {
|
LL | async fn box_box_ref_Self(self: Box<Box<&mut Self>>, f: &u32) -> &u32 {
|
||||||
| --------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-self-async.rs:35:9
|
--> $DIR/ref-mut-self-async.rs:35:9
|
||||||
|
|
|
|
||||||
LL | async fn box_pin_ref_Self(self: Box<Pin<&mut Self>>, f: &u32) -> &u32 {
|
LL | async fn box_pin_ref_Self(self: Box<Pin<&mut Self>>, f: &u32) -> &u32 {
|
||||||
| --------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,41 +2,51 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-struct-async.rs:13:9
|
--> $DIR/ref-mut-struct-async.rs:13:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 {
|
LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 {
|
||||||
| ----------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-struct-async.rs:17:9
|
--> $DIR/ref-mut-struct-async.rs:17:9
|
||||||
|
|
|
|
||||||
LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 {
|
LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 {
|
||||||
| ----------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-struct-async.rs:21:9
|
--> $DIR/ref-mut-struct-async.rs:21:9
|
||||||
|
|
|
|
||||||
LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 {
|
LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 {
|
||||||
| ----------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-struct-async.rs:25:9
|
--> $DIR/ref-mut-struct-async.rs:25:9
|
||||||
|
|
|
|
||||||
LL | async fn box_box_ref_Struct(self: Box<Box<&mut Struct>>, f: &u32) -> &u32 {
|
LL | async fn box_box_ref_Struct(self: Box<Box<&mut Struct>>, f: &u32) -> &u32 {
|
||||||
| ----------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-mut-struct-async.rs:29:9
|
--> $DIR/ref-mut-struct-async.rs:29:9
|
||||||
|
|
|
|
||||||
LL | async fn box_pin_ref_Struct(self: Box<Pin<&mut Struct>>, f: &u32) -> &u32 {
|
LL | async fn box_pin_ref_Struct(self: Box<Pin<&mut Struct>>, f: &u32) -> &u32 {
|
||||||
| ----------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,57 +2,71 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:23:9
|
--> $DIR/ref-self-async.rs:23:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_self(&self, f: &u32) -> &u32 {
|
LL | async fn ref_self(&self, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:29:9
|
--> $DIR/ref-self-async.rs:29:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
|
LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:33:9
|
--> $DIR/ref-self-async.rs:33:9
|
||||||
|
|
|
|
||||||
LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
|
LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:37:9
|
--> $DIR/ref-self-async.rs:37:9
|
||||||
|
|
|
|
||||||
LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
|
LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:41:9
|
--> $DIR/ref-self-async.rs:41:9
|
||||||
|
|
|
|
||||||
LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
|
LL | async fn box_box_ref_Self(self: Box<Box<&Self>>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:45:9
|
--> $DIR/ref-self-async.rs:45:9
|
||||||
|
|
|
|
||||||
LL | async fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
|
LL | async fn box_pin_ref_Self(self: Box<Pin<&Self>>, f: &u32) -> &u32 {
|
||||||
| ----- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-self-async.rs:49:9
|
--> $DIR/ref-self-async.rs:49:9
|
||||||
|
|
|
|
||||||
LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 {
|
LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 {
|
||||||
| ----- --- these two types are declared with different lifetimes...
|
| --- ---
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,41 +2,51 @@ error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-struct-async.rs:13:9
|
--> $DIR/ref-struct-async.rs:13:9
|
||||||
|
|
|
|
||||||
LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
||||||
| ------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-struct-async.rs:17:9
|
--> $DIR/ref-struct-async.rs:17:9
|
||||||
|
|
|
|
||||||
LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 {
|
LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 {
|
||||||
| ------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-struct-async.rs:21:9
|
--> $DIR/ref-struct-async.rs:21:9
|
||||||
|
|
|
|
||||||
LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 {
|
LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 {
|
||||||
| ------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-struct-async.rs:25:9
|
--> $DIR/ref-struct-async.rs:25:9
|
||||||
|
|
|
|
||||||
LL | async fn box_box_ref_Struct(self: Box<Box<&Struct>>, f: &u32) -> &u32 {
|
LL | async fn box_box_ref_Struct(self: Box<Box<&Struct>>, f: &u32) -> &u32 {
|
||||||
| ------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error[E0623]: lifetime mismatch
|
error[E0623]: lifetime mismatch
|
||||||
--> $DIR/ref-struct-async.rs:29:9
|
--> $DIR/ref-struct-async.rs:29:9
|
||||||
|
|
|
|
||||||
LL | async fn box_pin_Struct(self: Box<Pin<&Struct>>, f: &u32) -> &u32 {
|
LL | async fn box_pin_Struct(self: Box<Pin<&Struct>>, f: &u32) -> &u32 {
|
||||||
| ------- ---- these two types are declared with different lifetimes...
|
| ---- ----
|
||||||
|
| |
|
||||||
|
| this parameter and the return type are declared with different lifetimes...
|
||||||
LL | f
|
LL | f
|
||||||
| ^ ...but data from `f` flows into `self` here
|
| ^ ...but data from `f` is returned here
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,6 @@ fn elided_not_bound(_: &i32) -> impl Future<Output = i32> {
|
||||||
async { 42 }
|
async { 42 }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::needless_lifetimes)]
|
|
||||||
async fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> i32 { 42 }
|
async fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> i32 { 42 }
|
||||||
|
|
||||||
// should be ignored
|
// should be ignored
|
||||||
|
|
|
@ -98,7 +98,6 @@ fn elided_not_bound(_: &i32) -> impl Future<Output = i32> {
|
||||||
async { 42 }
|
async { 42 }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::needless_lifetimes)]
|
|
||||||
fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> impl Future<Output = i32> + 'a + 'b {
|
fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> impl Future<Output = i32> + 'a + 'b {
|
||||||
async { 42 }
|
async { 42 }
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ LL | fn elided(_: &i32) -> impl Future<Output = i32> + '_ { 42 }
|
||||||
| ~~~~~~
|
| ~~~~~~
|
||||||
|
|
||||||
error: this function can be simplified using the `async fn` syntax
|
error: this function can be simplified using the `async fn` syntax
|
||||||
--> $DIR/manual_async_fn.rs:102:1
|
--> $DIR/manual_async_fn.rs:101:1
|
||||||
|
|
|
|
||||||
LL | fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> impl Future<Output = i32> + 'a + 'b {
|
LL | fn explicit<'a, 'b>(_: &'a i32, _: &'b i32) -> impl Future<Output = i32> + 'a + 'b {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -18,12 +18,6 @@ error: explicit lifetimes given in parameter types where they could be elided (o
|
||||||
LL | fn in_and_out<'a>(x: &'a u8, _y: u8) -> &'a u8 {
|
LL | fn in_and_out<'a>(x: &'a u8, _y: u8) -> &'a u8 {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
|
|
||||||
--> $DIR/needless_lifetimes.rs:37:1
|
|
||||||
|
|
|
||||||
LL | async fn func<'a>(args: &[&'a str]) -> Option<&'a str> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
|
error: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration)
|
||||||
--> $DIR/needless_lifetimes.rs:56:1
|
--> $DIR/needless_lifetimes.rs:56:1
|
||||||
|
|
|
|
||||||
|
@ -198,5 +192,5 @@ error: explicit lifetimes given in parameter types where they could be elided (o
|
||||||
LL | fn lifetime_elsewhere_provided<'a>(self: Box<Self>, here: &'a ()) -> &'a () {
|
LL | fn lifetime_elsewhere_provided<'a>(self: Box<Self>, here: &'a ()) -> &'a () {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 33 previous errors
|
error: aborting due to 32 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue