diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc/hir/lowering/expr.rs index 9dcecedd97cae..34f247b19db10 100644 --- a/src/librustc/hir/lowering/expr.rs +++ b/src/librustc/hir/lowering/expr.rs @@ -89,9 +89,14 @@ impl LoweringContext<'_> { hir::MatchSource::Normal, ), ExprKind::Async(capture_clause, closure_node_id, ref block) => { - self.make_async_expr(capture_clause, closure_node_id, None, block.span, |this| { - this.with_new_scopes(|this| this.lower_block_expr(block)) - }) + self.make_async_expr( + capture_clause, + closure_node_id, + None, + block.span, + hir::AsyncGeneratorKind::Block, + |this| this.with_new_scopes(|this| this.lower_block_expr(block)), + ) } ExprKind::Await(ref expr) => self.lower_expr_await(e.span, expr), ExprKind::Closure( @@ -440,6 +445,7 @@ impl LoweringContext<'_> { closure_node_id: NodeId, ret_ty: Option>, span: Span, + async_gen_kind: hir::AsyncGeneratorKind, body: impl FnOnce(&mut LoweringContext<'_>) -> hir::Expr, ) -> hir::ExprKind { let capture_clause = self.lower_capture_clause(capture_clause); @@ -453,7 +459,7 @@ impl LoweringContext<'_> { }; let decl = self.lower_fn_decl(&ast_decl, None, /* impl trait allowed */ false, None); let body_id = self.lower_fn_body(&ast_decl, |this| { - this.generator_kind = Some(hir::GeneratorKind::Async); + this.generator_kind = Some(hir::GeneratorKind::Async(async_gen_kind)); body(this) }); @@ -505,7 +511,7 @@ impl LoweringContext<'_> { /// ``` fn lower_expr_await(&mut self, await_span: Span, expr: &Expr) -> hir::ExprKind { match self.generator_kind { - Some(hir::GeneratorKind::Async) => {}, + Some(hir::GeneratorKind::Async(_)) => {}, Some(hir::GeneratorKind::Gen) | None => { let mut err = struct_span_err!( @@ -710,7 +716,7 @@ impl LoweringContext<'_> { Movability::Static => hir::GeneratorMovability::Static, }) }, - Some(hir::GeneratorKind::Async) => { + Some(hir::GeneratorKind::Async(_)) => { bug!("non-`async` closure body turned `async` during lowering"); }, None => { @@ -769,10 +775,12 @@ impl LoweringContext<'_> { None }; let async_body = this.make_async_expr( - capture_clause, closure_id, async_ret_ty, body.span, - |this| { - this.with_new_scopes(|this| this.lower_expr(body)) - } + capture_clause, + closure_id, + async_ret_ty, + body.span, + hir::AsyncGeneratorKind::Closure, + |this| this.with_new_scopes(|this| this.lower_expr(body)), ); this.expr(fn_decl_span, async_body, ThinVec::new()) }); @@ -988,7 +996,7 @@ impl LoweringContext<'_> { fn lower_expr_yield(&mut self, span: Span, opt_expr: Option<&Expr>) -> hir::ExprKind { match self.generator_kind { Some(hir::GeneratorKind::Gen) => {}, - Some(hir::GeneratorKind::Async) => { + Some(hir::GeneratorKind::Async(_)) => { span_err!( self.sess, span, diff --git a/src/librustc/hir/lowering/item.rs b/src/librustc/hir/lowering/item.rs index 7159db736a711..548a2fedfff6d 100644 --- a/src/librustc/hir/lowering/item.rs +++ b/src/librustc/hir/lowering/item.rs @@ -1222,7 +1222,11 @@ impl LoweringContext<'_> { } let async_expr = this.make_async_expr( - CaptureBy::Value, closure_id, None, body.span, + CaptureBy::Value, + closure_id, + None, + body.span, + hir::AsyncGeneratorKind::Fn, |this| { // Create a block from the user's function body: let user_body = this.lower_block_expr(body); diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index 9ae661f0952a4..1a84889513d64 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -1362,21 +1362,49 @@ impl Body { } /// The type of source expression that caused this generator to be created. -// Not `IsAsync` because we want to eventually add support for `AsyncGen` #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, HashStable, RustcEncodable, RustcDecodable, Hash, Debug, Copy)] pub enum GeneratorKind { - /// An `async` block or function. - Async, + /// An explicit `async` block or the body of an async function. + Async(AsyncGeneratorKind), + /// A generator literal created via a `yield` inside a closure. Gen, } impl fmt::Display for GeneratorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + GeneratorKind::Async(k) => fmt::Display::fmt(k, f), + GeneratorKind::Gen => f.write_str("generator"), + } + } +} + +/// In the case of a generator created as part of an async construct, +/// which kind of async construct caused it to be created? +/// +/// This helps error messages but is also used to drive coercions in +/// type-checking (see #60424). +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, HashStable, + RustcEncodable, RustcDecodable, Hash, Debug, Copy)] +pub enum AsyncGeneratorKind { + /// An explicit `async` block written by the user. + Block, + + /// An explicit `async` block written by the user. + Closure, + + /// The `async` block generated as the body of an async function. + Fn, +} + +impl fmt::Display for AsyncGeneratorKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(match self { - GeneratorKind::Async => "`async` object", - GeneratorKind::Gen => "generator", + AsyncGeneratorKind::Block => "`async` block", + AsyncGeneratorKind::Closure => "`async` closure body", + AsyncGeneratorKind::Fn => "`async fn` body", }) } } @@ -1758,6 +1786,7 @@ pub struct Destination { pub enum GeneratorMovability { /// May contain self-references, `!Unpin`. Static, + /// Must not contain self-references, `Unpin`. Movable, } diff --git a/src/librustc/infer/mod.rs b/src/librustc/infer/mod.rs index b06b63455ba4b..a7ad62d5f7062 100644 --- a/src/librustc/infer/mod.rs +++ b/src/librustc/infer/mod.rs @@ -1307,6 +1307,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } } + /// Resolve any type variables found in `value` -- but only one + /// level. So, if the variable `?X` is bound to some type + /// `Foo`, then this would return `Foo` (but `?Y` may + /// itself be bound to a type). + /// + /// Useful when you only need to inspect the outermost level of + /// the type and don't care about nested types (or perhaps you + /// will be resolving them as well, e.g. in a loop). pub fn shallow_resolve(&self, value: T) -> T where T: TypeFoldable<'tcx>, @@ -1567,6 +1575,9 @@ impl<'a, 'tcx> ShallowResolver<'a, 'tcx> { ShallowResolver { infcx } } + /// If `typ` is a type variable of some kind, resolve it one level + /// (but do not resolve types found in the result). If `typ` is + /// not a type variable, just return it unmodified. pub fn shallow_resolve(&mut self, typ: Ty<'tcx>) -> Ty<'tcx> { match typ.kind { ty::Infer(ty::TyVar(v)) => { diff --git a/src/librustc_typeck/check/closure.rs b/src/librustc_typeck/check/closure.rs index bdf8f3b1d4ae6..162555cd3ce4c 100644 --- a/src/librustc_typeck/check/closure.rs +++ b/src/librustc_typeck/check/closure.rs @@ -337,7 +337,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ) -> ClosureSignatures<'tcx> { debug!("sig_of_closure_no_expectation()"); - let bound_sig = self.supplied_sig_of_closure(expr_def_id, decl); + let bound_sig = self.supplied_sig_of_closure(expr_def_id, decl, body); self.closure_sigs(expr_def_id, body, bound_sig) } @@ -490,7 +490,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // // (See comment on `sig_of_closure_with_expectation` for the // meaning of these letters.) - let supplied_sig = self.supplied_sig_of_closure(expr_def_id, decl); + let supplied_sig = self.supplied_sig_of_closure(expr_def_id, decl, body); debug!( "check_supplied_sig_against_expectation: supplied_sig={:?}", @@ -591,14 +591,31 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { &self, expr_def_id: DefId, decl: &hir::FnDecl, + body: &hir::Body, ) -> ty::PolyFnSig<'tcx> { let astconv: &dyn AstConv<'_> = self; + debug!( + "supplied_sig_of_closure(decl={:?}, body.generator_kind={:?})", + decl, + body.generator_kind, + ); + // First, convert the types that the user supplied (if any). let supplied_arguments = decl.inputs.iter().map(|a| astconv.ast_ty_to_ty(a)); let supplied_return = match decl.output { hir::Return(ref output) => astconv.ast_ty_to_ty(&output), - hir::DefaultReturn(_) => astconv.ty_infer(None, decl.output.span()), + hir::DefaultReturn(_) => match body.generator_kind { + // In the case of the async block that we create for a function body, + // we expect the return type of the block to match that of the enclosing + // function. + Some(hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Fn)) => { + debug!("supplied_sig_of_closure: closure is async fn body"); + self.deduce_future_output_from_obligations(expr_def_id) + } + + _ => astconv.ty_infer(None, decl.output.span()), + } }; let result = ty::Binder::bind(self.tcx.mk_fn_sig( @@ -620,6 +637,117 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { result } + /// Invoked when we are translating the generator that results + /// from desugaring an `async fn`. Returns the "sugared" return + /// type of the `async fn` -- that is, the return type that the + /// user specified. The "desugared" return type is a `impl + /// Future`, so we do this by searching through the + /// obligations to extract the `T`. + fn deduce_future_output_from_obligations( + &self, + expr_def_id: DefId, + ) -> Ty<'tcx> { + debug!("deduce_future_output_from_obligations(expr_def_id={:?})", expr_def_id); + + let ret_coercion = + self.ret_coercion + .as_ref() + .unwrap_or_else(|| span_bug!( + self.tcx.def_span(expr_def_id), + "async fn generator outside of a fn" + )); + + // In practice, the return type of the surrounding function is + // always a (not yet resolved) inference variable, because it + // is the hidden type for an `impl Trait` that we are going to + // be inferring. + let ret_ty = ret_coercion.borrow().expected_ty(); + let ret_ty = self.inh.infcx.shallow_resolve(ret_ty); + let ret_vid = match ret_ty.kind { + ty::Infer(ty::TyVar(ret_vid)) => ret_vid, + _ => { + span_bug!( + self.tcx.def_span(expr_def_id), + "async fn generator return type not an inference variable" + ) + } + }; + + // Search for a pending obligation like + // + // `::Output = T` + // + // where R is the return type we are expecting. This type `T` + // will be our output. + let output_ty = self.obligations_for_self_ty(ret_vid) + .find_map(|(_, obligation)| { + if let ty::Predicate::Projection(ref proj_predicate) = obligation.predicate { + self.deduce_future_output_from_projection( + obligation.cause.span, + proj_predicate + ) + } else { + None + } + }) + .unwrap(); + + debug!("deduce_future_output_from_obligations: output_ty={:?}", output_ty); + output_ty + } + + /// Given a projection like + /// + /// `::Output = T` + /// + /// where `X` is some type that has no late-bound regions, returns + /// `Some(T)`. If the projection is for some other trait, returns + /// `None`. + fn deduce_future_output_from_projection( + &self, + cause_span: Span, + predicate: &ty::PolyProjectionPredicate<'tcx>, + ) -> Option> { + debug!("deduce_future_output_from_projection(predicate={:?})", predicate); + + // We do not expect any bound regions in our predicate, so + // skip past the bound vars. + let predicate = match predicate.no_bound_vars() { + Some(p) => p, + None => { + debug!("deduce_future_output_from_projection: has late-bound regions"); + return None; + } + }; + + // Check that this is a projection from the `Future` trait. + let trait_ref = predicate.projection_ty.trait_ref(self.tcx); + let future_trait = self.tcx.lang_items().future_trait().unwrap(); + if trait_ref.def_id != future_trait { + debug!("deduce_future_output_from_projection: not a future"); + return None; + } + + // The `Future` trait has only one associted item, `Output`, + // so check that this is what we see. + let output_assoc_item = self.tcx.associated_items(future_trait).nth(0).unwrap().def_id; + if output_assoc_item != predicate.projection_ty.item_def_id { + span_bug!( + cause_span, + "projecting associated item `{:?}` from future, which is not Output `{:?}`", + predicate.projection_ty.item_def_id, + output_assoc_item, + ); + } + + // Extract the type from the projection. Note that there can + // be no bound variables in this type because the "self type" + // does not have any regions in it. + let output_ty = self.resolve_vars_if_possible(&predicate.ty); + debug!("deduce_future_output_from_projection: output_ty={:?}", output_ty); + Some(output_ty) + } + /// Converts the types that the user supplied, in case that doing /// so should yield an error, but returns back a signature where /// all parameters are of type `TyErr`. diff --git a/src/librustc_typeck/check/generator_interior.rs b/src/librustc_typeck/check/generator_interior.rs index 4608eb51df74e..c40d11503a302 100644 --- a/src/librustc_typeck/check/generator_interior.rs +++ b/src/librustc_typeck/check/generator_interior.rs @@ -55,7 +55,7 @@ impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> { expr_and_pat_count: 0, source: match self.kind { // Guess based on the kind of the current generator. hir::GeneratorKind::Gen => hir::YieldSource::Yield, - hir::GeneratorKind::Async => hir::YieldSource::Await, + hir::GeneratorKind::Async(_) => hir::YieldSource::Await, }, })); diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 720d31310a13d..b1de54c692d2b 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -562,7 +562,19 @@ pub struct FnCtxt<'a, 'tcx> { // if type checking is run in parallel. err_count_on_creation: usize, + /// If `Some`, this stores coercion information for returned + /// expressions. If `None`, this is in a context where return is + /// inappropriate, such as a const expression. + /// + /// This is a `RefCell`, which means that we + /// can track all the return expressions and then use them to + /// compute a useful coercion from the set, similar to a match + /// expression or other branching context. You can use methods + /// like `expected_ty` to access the declared return type (if + /// any). ret_coercion: Option>>, + + /// First span of a return site that we find. Used in error messages. ret_coercion_span: RefCell>, yield_ty: Option>, @@ -4534,7 +4546,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let item_id = self.tcx().hir().get_parent_node(self.body_id); if let Some(body_id) = self.tcx().hir().maybe_body_owned_by(item_id) { let body = self.tcx().hir().body(body_id); - if let Some(hir::GeneratorKind::Async) = body.generator_kind { + if let Some(hir::GeneratorKind::Async(_)) = body.generator_kind { let sp = expr.span; // Check for `Future` implementations by constructing a predicate to // prove: `::Output == U` diff --git a/src/test/ui/async-await/async-block-control-flow-static-semantics.rs b/src/test/ui/async-await/async-block-control-flow-static-semantics.rs index 753a4e491550f..971d447633481 100644 --- a/src/test/ui/async-await/async-block-control-flow-static-semantics.rs +++ b/src/test/ui/async-await/async-block-control-flow-static-semantics.rs @@ -20,7 +20,7 @@ fn return_targets_async_block_not_fn() -> u8 { } async fn return_targets_async_block_not_async_fn() -> u8 { - //~^ ERROR type mismatch resolving + //~^ ERROR mismatched types let block = async { return 0u8; }; diff --git a/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr b/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr index c36caa5586fb0..a9b0e7ae7795d 100644 --- a/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr +++ b/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr @@ -39,6 +39,22 @@ LL | let _: &dyn Future = █ found type `()` = note: required for the cast to the object type `dyn std::future::Future` +error[E0308]: mismatched types + --> $DIR/async-block-control-flow-static-semantics.rs:22:58 + | +LL | async fn return_targets_async_block_not_async_fn() -> u8 { + | __________________________________________________________^ +LL | | +LL | | let block = async { +LL | | return 0u8; +... | +LL | | +LL | | } + | |_^ expected u8, found () + | + = note: expected type `u8` + found type `()` + error[E0271]: type mismatch resolving `::Output == ()` --> $DIR/async-block-control-flow-static-semantics.rs:27:39 | @@ -49,16 +65,6 @@ LL | let _: &dyn Future = █ found type `()` = note: required for the cast to the object type `dyn std::future::Future` -error[E0271]: type mismatch resolving `::Output == u8` - --> $DIR/async-block-control-flow-static-semantics.rs:22:55 - | -LL | async fn return_targets_async_block_not_async_fn() -> u8 { - | ^^ expected (), found u8 - | - = note: expected type `()` - found type `u8` - = note: the return type of a function must have a statically known size - error[E0308]: mismatched types --> $DIR/async-block-control-flow-static-semantics.rs:48:44 | diff --git a/src/test/ui/async-await/async-error-span.rs b/src/test/ui/async-await/async-error-span.rs index dec3ac0f68554..28132c9789c67 100644 --- a/src/test/ui/async-await/async-error-span.rs +++ b/src/test/ui/async-await/async-error-span.rs @@ -9,7 +9,7 @@ fn get_future() -> impl Future { } async fn foo() { - let a; //~ ERROR type inside `async` object must be known in this context + let a; //~ ERROR type inside `async fn` body must be known in this context get_future().await; } diff --git a/src/test/ui/async-await/async-error-span.stderr b/src/test/ui/async-await/async-error-span.stderr index 47441f5e4efce..b551b99587dd9 100644 --- a/src/test/ui/async-await/async-error-span.stderr +++ b/src/test/ui/async-await/async-error-span.stderr @@ -1,10 +1,10 @@ -error[E0698]: type inside `async` object must be known in this context +error[E0698]: type inside `async fn` body must be known in this context --> $DIR/async-error-span.rs:12:9 | LL | let a; | ^ cannot infer type | -note: the type is part of the `async` object because of this `await` +note: the type is part of the `async fn` body because of this `await` --> $DIR/async-error-span.rs:13:5 | LL | get_future().await; diff --git a/src/test/ui/async-await/issues/issue-63388-1.rs b/src/test/ui/async-await/issues/issue-63388-1.rs index 3cde5de219880..baecf49c798e2 100644 --- a/src/test/ui/async-await/issues/issue-63388-1.rs +++ b/src/test/ui/async-await/issues/issue-63388-1.rs @@ -9,9 +9,9 @@ trait Foo {} impl Xyz { async fn do_sth<'a>( &'a self, foo: &dyn Foo - ) -> &dyn Foo //~ ERROR lifetime mismatch + ) -> &dyn Foo { - foo + foo //~ ERROR lifetime mismatch } } diff --git a/src/test/ui/async-await/issues/issue-63388-1.stderr b/src/test/ui/async-await/issues/issue-63388-1.stderr index a54cadb0cd251..2917fa9ccb7f2 100644 --- a/src/test/ui/async-await/issues/issue-63388-1.stderr +++ b/src/test/ui/async-await/issues/issue-63388-1.stderr @@ -1,12 +1,13 @@ error[E0623]: lifetime mismatch - --> $DIR/issue-63388-1.rs:12:10 + --> $DIR/issue-63388-1.rs:14:9 | LL | &'a self, foo: &dyn Foo | -------- this parameter and the return type are declared with different lifetimes... LL | ) -> &dyn Foo - | ^^^^^^^^ - | | - | ...but data from `foo` is returned here + | -------- +LL | { +LL | foo + | ^^^ ...but data from `foo` is returned here error: aborting due to previous error diff --git a/src/test/ui/async-await/issues/issue-63388-2.stderr b/src/test/ui/async-await/issues/issue-63388-2.stderr index 1edeb3d549389..5099297fbeb19 100644 --- a/src/test/ui/async-await/issues/issue-63388-2.stderr +++ b/src/test/ui/async-await/issues/issue-63388-2.stderr @@ -11,8 +11,9 @@ error: cannot infer an appropriate lifetime | LL | foo: &dyn Foo, bar: &'a dyn Foo | ^^^ ...but this borrow... -LL | ) -> &dyn Foo - | -------- this return type evaluates to the `'static` lifetime... +... +LL | foo + | --- this return type evaluates to the `'static` lifetime... | note: ...can't outlive the lifetime '_ as defined on the method body at 11:14 --> $DIR/issue-63388-2.rs:11:14 @@ -21,8 +22,8 @@ LL | foo: &dyn Foo, bar: &'a dyn Foo | ^ help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime '_ as defined on the method body at 11:14 | -LL | ) -> &dyn Foo + '_ - | ^^^^^^^^^^^^^ +LL | foo + '_ + | error: aborting due to 2 previous errors diff --git a/src/test/ui/async-await/return-ty-raw-ptr-coercion.rs b/src/test/ui/async-await/return-ty-raw-ptr-coercion.rs new file mode 100644 index 0000000000000..9fe0869cad6c0 --- /dev/null +++ b/src/test/ui/async-await/return-ty-raw-ptr-coercion.rs @@ -0,0 +1,25 @@ +// Check that we apply unsizing coercions based on the return type. +// +// Also serves as a regression test for #60424. +// +// edition:2018 +// check-pass + +#![allow(warnings)] + +use std::fmt::Debug; + +const TMP: u32 = 22; + +// Coerce from `&u32` to `*const u32` +fn raw_pointer_coercion() { + fn sync_example() -> *const u32 { + &TMP + } + + async fn async_example() -> *const u32 { + &TMP + } +} + +fn main() {} diff --git a/src/test/ui/async-await/return-ty-unsize-coercion.rs b/src/test/ui/async-await/return-ty-unsize-coercion.rs new file mode 100644 index 0000000000000..93832ef7eddb5 --- /dev/null +++ b/src/test/ui/async-await/return-ty-unsize-coercion.rs @@ -0,0 +1,45 @@ +// Check that we apply unsizing coercions based on the return type. +// +// Also serves as a regression test for #60424. +// +// edition:2018 +// check-pass + +#![allow(warnings)] + +use std::fmt::Debug; + +// Unsizing coercion from `Box<&'static str>` to `Box`. +fn unsize_trait_coercion() { + fn sync_example() -> Box { + Box::new("asdf") + } + + async fn async_example() -> Box { + Box::new("asdf") + } +} + +// Unsizing coercion from `Box<[u32; N]>` to `Box<[32]>`. +fn unsize_slice_coercion() { + fn sync_example() -> Box<[u32]> { + Box::new([0]) + } + + async fn async_example() -> Box<[u32]> { + Box::new([0]) + } +} + +// Unsizing coercion from `&[&str; 1]` to `&[&str]` +fn unsize_slice_str_coercion() { + fn sync_example() -> &'static [&'static str] { + &["hi"] + } + + async fn async_example() -> &'static [&'static str] { + &["hi"] + } +} + +fn main() {} diff --git a/src/test/ui/async-await/unresolved_type_param.rs b/src/test/ui/async-await/unresolved_type_param.rs index d8ea87d2775bd..2876f9fea0e00 100644 --- a/src/test/ui/async-await/unresolved_type_param.rs +++ b/src/test/ui/async-await/unresolved_type_param.rs @@ -7,9 +7,9 @@ async fn bar() -> () {} async fn foo() { bar().await; - //~^ ERROR type inside `async` object must be known in this context + //~^ ERROR type inside `async fn` body must be known in this context //~| NOTE cannot infer type for `T` - //~| NOTE the type is part of the `async` object because of this `await` + //~| NOTE the type is part of the `async fn` body because of this `await` //~| NOTE in this expansion of desugaring of `await` } fn main() {} diff --git a/src/test/ui/async-await/unresolved_type_param.stderr b/src/test/ui/async-await/unresolved_type_param.stderr index f3090a2b980e8..c7866fc774415 100644 --- a/src/test/ui/async-await/unresolved_type_param.stderr +++ b/src/test/ui/async-await/unresolved_type_param.stderr @@ -1,10 +1,10 @@ -error[E0698]: type inside `async` object must be known in this context +error[E0698]: type inside `async fn` body must be known in this context --> $DIR/unresolved_type_param.rs:9:5 | LL | bar().await; | ^^^ cannot infer type for `T` | -note: the type is part of the `async` object because of this `await` +note: the type is part of the `async fn` body because of this `await` --> $DIR/unresolved_type_param.rs:9:5 | LL | bar().await; diff --git a/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.nll.stderr b/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.nll.stderr index e53d91c360489..7eec31d36e39e 100644 --- a/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.nll.stderr +++ b/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.nll.stderr @@ -7,19 +7,19 @@ LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f } = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:8:50 + --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:8:52 | LL | async fn a(self: Pin<&Foo>, f: &Foo) -> &Foo { f } - | - ^^^^^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + | - ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` | | | lifetime `'_` defined here | lifetime `'_` defined here error: lifetime may not live long enough - --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:11:73 + --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:11:75 | LL | async fn c(self: Pin<&Self>, f: &Foo, g: &Foo) -> (Pin<&Foo>, &Foo) { (self, f) } - | - ^^^^^^^^^^^^^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + | - ^^^^^^^^^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` | | | lifetime `'_` defined here | lifetime `'_` defined here @@ -33,12 +33,11 @@ LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg } = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:62 + --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:64 | LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg } - | -- - ^^^^^^^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'a` - | | | - | | lifetime `'_` defined here + | -- - lifetime `'_` defined here ^^^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'a` + | | | lifetime `'a` defined here error: aborting due to 5 previous errors diff --git a/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.stderr b/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.stderr index 57ad026bdcf97..e3c261576e61e 100644 --- a/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.stderr +++ b/src/test/ui/self/arbitrary_self_types_pin_lifetime_mismatch-async.stderr @@ -1,28 +1,25 @@ error[E0623]: lifetime mismatch - --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:8:45 + --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:8:52 | 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... error[E0623]: lifetime mismatch - --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:11:55 + --> $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) } - | ----- ^^^^^^^^^^^^^^^^^ - | | | - | | ...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... error[E0623]: lifetime mismatch - --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:58 + --> $DIR/arbitrary_self_types_pin_lifetime_mismatch-async.rs:17:64 | LL | async fn bar<'a>(self: Alias<&Self>, arg: &'a ()) -> &() { arg } - | ----- ^^^ - | | | - | | ...but data from `arg` is returned here + | ----- --- ^^^ ...but data from `arg` is returned here + | | | this parameter and the return type are declared with different lifetimes... error: aborting due to 3 previous errors diff --git a/src/test/ui/self/elision/lt-ref-self-async.nll.stderr b/src/test/ui/self/elision/lt-ref-self-async.nll.stderr index 998178dde1df1..b4f8ff6001d60 100644 --- a/src/test/ui/self/elision/lt-ref-self-async.nll.stderr +++ b/src/test/ui/self/elision/lt-ref-self-async.nll.stderr @@ -7,16 +7,15 @@ LL | async fn ref_self(&self, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#23r error: lifetime may not live long enough - --> $DIR/lt-ref-self-async.rs:13:47 - | -LL | async fn ref_self(&self, f: &u32) -> &u32 { - | _______________________-_______________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/lt-ref-self-async.rs:14:9 + | +LL | async fn ref_self(&self, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/lt-ref-self-async.rs:19:48 @@ -27,16 +26,15 @@ LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#23r error: lifetime may not live long enough - --> $DIR/lt-ref-self-async.rs:19:53 - | -LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { - | _____________________________-_______________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/lt-ref-self-async.rs:20:9 + | +LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/lt-ref-self-async.rs:23:57 @@ -47,16 +45,15 @@ LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#23r error: lifetime may not live long enough - --> $DIR/lt-ref-self-async.rs:23:62 - | -LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { - | _____________________________________-________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/lt-ref-self-async.rs:24:9 + | +LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/lt-ref-self-async.rs:27:57 @@ -67,16 +64,15 @@ LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#23r error: lifetime may not live long enough - --> $DIR/lt-ref-self-async.rs:27:62 - | -LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { - | _____________________________________-________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/lt-ref-self-async.rs:28:9 + | +LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/lt-ref-self-async.rs:31:66 @@ -87,16 +83,15 @@ LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#23r error: lifetime may not live long enough - --> $DIR/lt-ref-self-async.rs:31:71 - | -LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - | _____________________________________________-_________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/lt-ref-self-async.rs:32:9 + | +LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/lt-ref-self-async.rs:35:62 @@ -107,16 +102,15 @@ LL | async fn box_pin_Self(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#23r error: lifetime may not live long enough - --> $DIR/lt-ref-self-async.rs:35:67 - | -LL | async fn box_pin_Self(self: Box>, f: &u32) -> &u32 { - | _________________________________________-_________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/lt-ref-self-async.rs:36:9 + | +LL | async fn box_pin_Self(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error: aborting due to 12 previous errors diff --git a/src/test/ui/self/elision/lt-ref-self-async.rs b/src/test/ui/self/elision/lt-ref-self-async.rs index e3ca0c2e2dd9d..5aba7cfcf296e 100644 --- a/src/test/ui/self/elision/lt-ref-self-async.rs +++ b/src/test/ui/self/elision/lt-ref-self-async.rs @@ -11,29 +11,29 @@ impl<'a> Struct<'a> { // Test using `&self` sugar: async fn ref_self(&self, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } // Test using `&Self` explicitly: async fn ref_Self(self: &Self, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_pin_Self(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } } diff --git a/src/test/ui/self/elision/lt-ref-self-async.stderr b/src/test/ui/self/elision/lt-ref-self-async.stderr index 2bc64bdf1f7a2..6b668d9f1f655 100644 --- a/src/test/ui/self/elision/lt-ref-self-async.stderr +++ b/src/test/ui/self/elision/lt-ref-self-async.stderr @@ -1,56 +1,62 @@ error[E0623]: lifetime mismatch - --> $DIR/lt-ref-self-async.rs:13:42 + --> $DIR/lt-ref-self-async.rs:14:9 | LL | async fn ref_self(&self, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/lt-ref-self-async.rs:19:48 + --> $DIR/lt-ref-self-async.rs:20:9 | LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/lt-ref-self-async.rs:23:57 + --> $DIR/lt-ref-self-async.rs:24:9 | LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/lt-ref-self-async.rs:27:57 + --> $DIR/lt-ref-self-async.rs:28:9 | LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/lt-ref-self-async.rs:31:66 + --> $DIR/lt-ref-self-async.rs:32:9 | LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/lt-ref-self-async.rs:35:62 + --> $DIR/lt-ref-self-async.rs:36:9 | LL | async fn box_pin_Self(self: Box>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error: aborting due to 6 previous errors diff --git a/src/test/ui/self/elision/ref-mut-self-async.nll.stderr b/src/test/ui/self/elision/ref-mut-self-async.nll.stderr index 97bc80509dfea..b6f2b63f093b1 100644 --- a/src/test/ui/self/elision/ref-mut-self-async.nll.stderr +++ b/src/test/ui/self/elision/ref-mut-self-async.nll.stderr @@ -7,16 +7,15 @@ LL | async fn ref_self(&mut self, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-self-async.rs:13:51 - | -LL | async fn ref_self(&mut self, f: &u32) -> &u32 { - | _______________________-___________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-mut-self-async.rs:14:9 + | +LL | async fn ref_self(&mut self, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-self-async.rs:19:52 @@ -27,16 +26,15 @@ LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-self-async.rs:19:57 - | -LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 { - | _____________________________-___________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-mut-self-async.rs:20:9 + | +LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-self-async.rs:23:61 @@ -47,16 +45,15 @@ LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-self-async.rs:23:66 - | -LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 { - | _____________________________________-____________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-mut-self-async.rs:24:9 + | +LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-self-async.rs:27:61 @@ -67,16 +64,15 @@ LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-self-async.rs:27:66 - | -LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 { - | _____________________________________-____________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-mut-self-async.rs:28:9 + | +LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-self-async.rs:31:70 @@ -87,16 +83,15 @@ LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-self-async.rs:31:75 - | -LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - | _____________________________________________-_____________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-mut-self-async.rs:32:9 + | +LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-self-async.rs:35:70 @@ -107,16 +102,15 @@ LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-self-async.rs:35:75 - | -LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { - | _____________________________________________-_____________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-mut-self-async.rs:36:9 + | +LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error: aborting due to 12 previous errors diff --git a/src/test/ui/self/elision/ref-mut-self-async.rs b/src/test/ui/self/elision/ref-mut-self-async.rs index 2ca14800a7556..b8eb416d90432 100644 --- a/src/test/ui/self/elision/ref-mut-self-async.rs +++ b/src/test/ui/self/elision/ref-mut-self-async.rs @@ -10,30 +10,30 @@ struct Struct { } impl Struct { // Test using `&mut self` sugar: - async fn ref_self(&mut self, f: &u32) -> &u32 { //~ ERROR lifetime mismatch - f + async fn ref_self(&mut self, f: &u32) -> &u32 { + f //~ ERROR lifetime mismatch } // Test using `&mut Self` explicitly: async fn ref_Self(self: &mut Self, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } } diff --git a/src/test/ui/self/elision/ref-mut-self-async.stderr b/src/test/ui/self/elision/ref-mut-self-async.stderr index 39a1b30ca5329..29fbec9fa7ae0 100644 --- a/src/test/ui/self/elision/ref-mut-self-async.stderr +++ b/src/test/ui/self/elision/ref-mut-self-async.stderr @@ -1,56 +1,62 @@ error[E0623]: lifetime mismatch - --> $DIR/ref-mut-self-async.rs:13:46 + --> $DIR/ref-mut-self-async.rs:14:9 | LL | async fn ref_self(&mut self, f: &u32) -> &u32 { - | --------- ^^^^ - | | | - | | ...but data from `f` is returned here + | --------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-self-async.rs:19:52 + --> $DIR/ref-mut-self-async.rs:20:9 | LL | async fn ref_Self(self: &mut Self, f: &u32) -> &u32 { - | --------- ^^^^ - | | | - | | ...but data from `f` is returned here + | --------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-self-async.rs:23:61 + --> $DIR/ref-mut-self-async.rs:24:9 | LL | async fn box_ref_Self(self: Box<&mut Self>, f: &u32) -> &u32 { - | --------- ^^^^ - | | | - | | ...but data from `f` is returned here + | --------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-self-async.rs:27:61 + --> $DIR/ref-mut-self-async.rs:28:9 | LL | async fn pin_ref_Self(self: Pin<&mut Self>, f: &u32) -> &u32 { - | --------- ^^^^ - | | | - | | ...but data from `f` is returned here + | --------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-self-async.rs:31:70 + --> $DIR/ref-mut-self-async.rs:32:9 | LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - | --------- ^^^^ - | | | - | | ...but data from `f` is returned here + | --------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-self-async.rs:35:70 + --> $DIR/ref-mut-self-async.rs:36:9 | LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { - | --------- ^^^^ - | | | - | | ...but data from `f` is returned here + | --------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error: aborting due to 6 previous errors diff --git a/src/test/ui/self/elision/ref-mut-struct-async.nll.stderr b/src/test/ui/self/elision/ref-mut-struct-async.nll.stderr index 2905a022e5d6e..fa78543bd87ab 100644 --- a/src/test/ui/self/elision/ref-mut-struct-async.nll.stderr +++ b/src/test/ui/self/elision/ref-mut-struct-async.nll.stderr @@ -7,16 +7,15 @@ LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-struct-async.rs:13:61 + --> $DIR/ref-mut-struct-async.rs:14:9 | -LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 { - | _______________________________-_____________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-struct-async.rs:17:65 @@ -27,16 +26,15 @@ LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-struct-async.rs:17:70 + --> $DIR/ref-mut-struct-async.rs:18:9 | -LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 { - | _______________________________________-______________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-struct-async.rs:21:65 @@ -47,16 +45,15 @@ LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-struct-async.rs:21:70 + --> $DIR/ref-mut-struct-async.rs:22:9 | -LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 { - | _______________________________________-______________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-struct-async.rs:25:74 @@ -67,16 +64,15 @@ LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-struct-async.rs:25:79 + --> $DIR/ref-mut-struct-async.rs:26:9 | -LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { - | _______________________________________________-_______________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-mut-struct-async.rs:29:74 @@ -87,16 +83,15 @@ LL | async fn box_pin_ref_Struct(self: Box>, f: &u32) -> &u = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-mut-struct-async.rs:29:79 + --> $DIR/ref-mut-struct-async.rs:30:9 | -LL | async fn box_pin_ref_Struct(self: Box>, f: &u32) -> &u32 { - | _______________________________________________-_______________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn box_pin_ref_Struct(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error: aborting due to 10 previous errors diff --git a/src/test/ui/self/elision/ref-mut-struct-async.rs b/src/test/ui/self/elision/ref-mut-struct-async.rs index a671116de2543..1822a9a468b0e 100644 --- a/src/test/ui/self/elision/ref-mut-struct-async.rs +++ b/src/test/ui/self/elision/ref-mut-struct-async.rs @@ -11,23 +11,23 @@ impl Struct { // Test using `&mut Struct` explicitly: async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_pin_ref_Struct(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } } diff --git a/src/test/ui/self/elision/ref-mut-struct-async.stderr b/src/test/ui/self/elision/ref-mut-struct-async.stderr index fe4a636ada668..46591bfc9580f 100644 --- a/src/test/ui/self/elision/ref-mut-struct-async.stderr +++ b/src/test/ui/self/elision/ref-mut-struct-async.stderr @@ -1,47 +1,52 @@ error[E0623]: lifetime mismatch - --> $DIR/ref-mut-struct-async.rs:13:56 + --> $DIR/ref-mut-struct-async.rs:14:9 | LL | async fn ref_Struct(self: &mut Struct, f: &u32) -> &u32 { - | ----------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-struct-async.rs:17:65 + --> $DIR/ref-mut-struct-async.rs:18:9 | LL | async fn box_ref_Struct(self: Box<&mut Struct>, f: &u32) -> &u32 { - | ----------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-struct-async.rs:21:65 + --> $DIR/ref-mut-struct-async.rs:22:9 | LL | async fn pin_ref_Struct(self: Pin<&mut Struct>, f: &u32) -> &u32 { - | ----------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-struct-async.rs:25:74 + --> $DIR/ref-mut-struct-async.rs:26:9 | LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { - | ----------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-mut-struct-async.rs:29:74 + --> $DIR/ref-mut-struct-async.rs:30:9 | LL | async fn box_pin_ref_Struct(self: Box>, f: &u32) -> &u32 { - | ----------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error: aborting due to 5 previous errors diff --git a/src/test/ui/self/elision/ref-self-async.nll.stderr b/src/test/ui/self/elision/ref-self-async.nll.stderr index 0eee56654f7d1..88fd2101bc619 100644 --- a/src/test/ui/self/elision/ref-self-async.nll.stderr +++ b/src/test/ui/self/elision/ref-self-async.nll.stderr @@ -7,16 +7,15 @@ LL | async fn ref_self(&self, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:22:47 - | -LL | async fn ref_self(&self, f: &u32) -> &u32 { - | _______________________-_______________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:23:9 + | +LL | async fn ref_self(&self, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-self-async.rs:28:48 @@ -27,16 +26,15 @@ LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:28:53 - | -LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { - | _____________________________-_______________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:29:9 + | +LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-self-async.rs:32:57 @@ -47,16 +45,15 @@ LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:32:62 - | -LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { - | _____________________________________-________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:33:9 + | +LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-self-async.rs:36:57 @@ -67,16 +64,15 @@ LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:36:62 - | -LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { - | _____________________________________-________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:37:9 + | +LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-self-async.rs:40:66 @@ -87,16 +83,15 @@ LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:40:71 - | -LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - | _____________________________________________-_________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:41:9 + | +LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-self-async.rs:44:66 @@ -107,16 +102,15 @@ LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:44:71 - | -LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { - | _____________________________________________-_________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:45:9 + | +LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-self-async.rs:48:69 @@ -127,16 +121,15 @@ LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-self-async.rs:48:73 - | -LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 { - | ____________________________________________-____________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` + --> $DIR/ref-self-async.rs:49:9 + | +LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error: aborting due to 14 previous errors diff --git a/src/test/ui/self/elision/ref-self-async.rs b/src/test/ui/self/elision/ref-self-async.rs index 06f3b127b216a..9425fbfca8f08 100644 --- a/src/test/ui/self/elision/ref-self-async.rs +++ b/src/test/ui/self/elision/ref-self-async.rs @@ -19,34 +19,34 @@ impl Deref for Wrap { impl Struct { // Test using `&self` sugar: - async fn ref_self(&self, f: &u32) -> &u32 { //~ ERROR lifetime mismatch - f + async fn ref_self(&self, f: &u32) -> &u32 { + f //~ ERROR lifetime mismatch } // Test using `&Self` explicitly: async fn ref_Self(self: &Self, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } } diff --git a/src/test/ui/self/elision/ref-self-async.stderr b/src/test/ui/self/elision/ref-self-async.stderr index 2f9e2a01e347c..c255d18936376 100644 --- a/src/test/ui/self/elision/ref-self-async.stderr +++ b/src/test/ui/self/elision/ref-self-async.stderr @@ -1,65 +1,72 @@ error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:22:42 + --> $DIR/ref-self-async.rs:23:9 | LL | async fn ref_self(&self, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:28:48 + --> $DIR/ref-self-async.rs:29:9 | LL | async fn ref_Self(self: &Self, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:32:57 + --> $DIR/ref-self-async.rs:33:9 | LL | async fn box_ref_Self(self: Box<&Self>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:36:57 + --> $DIR/ref-self-async.rs:37:9 | LL | async fn pin_ref_Self(self: Pin<&Self>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:40:66 + --> $DIR/ref-self-async.rs:41:9 | LL | async fn box_box_ref_Self(self: Box>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:44:66 + --> $DIR/ref-self-async.rs:45:9 | LL | async fn box_pin_ref_Self(self: Box>, f: &u32) -> &u32 { - | ----- ^^^^ - | | | - | | ...but data from `f` is returned here + | ----- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-self-async.rs:48:69 + --> $DIR/ref-self-async.rs:49:9 | LL | async fn wrap_ref_Self_Self(self: Wrap<&Self, Self>, f: &u8) -> &u8 { - | ----- ^^^ - | | | - | | ...but data from `f` is returned here + | ----- --- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error: aborting due to 7 previous errors diff --git a/src/test/ui/self/elision/ref-struct-async.nll.stderr b/src/test/ui/self/elision/ref-struct-async.nll.stderr index 8508e42264b4a..93fec69ec343a 100644 --- a/src/test/ui/self/elision/ref-struct-async.nll.stderr +++ b/src/test/ui/self/elision/ref-struct-async.nll.stderr @@ -7,16 +7,15 @@ LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-struct-async.rs:13:57 + --> $DIR/ref-struct-async.rs:14:9 | -LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 { - | _______________________________-_________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-struct-async.rs:17:61 @@ -27,16 +26,15 @@ LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-struct-async.rs:17:66 + --> $DIR/ref-struct-async.rs:18:9 | -LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 { - | _______________________________________-__________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-struct-async.rs:21:61 @@ -47,16 +45,15 @@ LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-struct-async.rs:21:66 + --> $DIR/ref-struct-async.rs:22:9 | -LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 { - | _______________________________________-__________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-struct-async.rs:25:70 @@ -67,16 +64,15 @@ LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-struct-async.rs:25:75 + --> $DIR/ref-struct-async.rs:26:9 | -LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { - | _______________________________________________-___________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds --> $DIR/ref-struct-async.rs:29:66 @@ -87,16 +83,15 @@ LL | async fn box_pin_Struct(self: Box>, f: &u32) -> &u32 { = note: hidden type `impl std::future::Future` captures lifetime '_#15r error: lifetime may not live long enough - --> $DIR/ref-struct-async.rs:29:71 + --> $DIR/ref-struct-async.rs:30:9 | -LL | async fn box_pin_Struct(self: Box>, f: &u32) -> &u32 { - | ___________________________________________-___________________________^ - | | | - | | lifetime `'_` defined here - | | lifetime `'_` defined here -LL | | f -LL | | } - | |_____^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` +LL | async fn box_pin_Struct(self: Box>, f: &u32) -> &u32 { + | - + | | + | lifetime `'_` defined here + | lifetime `'_` defined here +LL | f + | ^ function was supposed to return data with lifetime `'_` but it is returning data with lifetime `'_` error: aborting due to 10 previous errors diff --git a/src/test/ui/self/elision/ref-struct-async.rs b/src/test/ui/self/elision/ref-struct-async.rs index 94eaeedc734ff..64c84c4cd2eb9 100644 --- a/src/test/ui/self/elision/ref-struct-async.rs +++ b/src/test/ui/self/elision/ref-struct-async.rs @@ -11,23 +11,23 @@ impl Struct { // Test using `&Struct` explicitly: async fn ref_Struct(self: &Struct, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } async fn box_pin_Struct(self: Box>, f: &u32) -> &u32 { - f //~^ ERROR lifetime mismatch + f //~ ERROR lifetime mismatch } } diff --git a/src/test/ui/self/elision/ref-struct-async.stderr b/src/test/ui/self/elision/ref-struct-async.stderr index 222e27ebf0d97..c70facc931ec1 100644 --- a/src/test/ui/self/elision/ref-struct-async.stderr +++ b/src/test/ui/self/elision/ref-struct-async.stderr @@ -1,47 +1,52 @@ error[E0623]: lifetime mismatch - --> $DIR/ref-struct-async.rs:13:52 + --> $DIR/ref-struct-async.rs:14:9 | LL | async fn ref_Struct(self: &Struct, f: &u32) -> &u32 { - | ------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-struct-async.rs:17:61 + --> $DIR/ref-struct-async.rs:18:9 | LL | async fn box_ref_Struct(self: Box<&Struct>, f: &u32) -> &u32 { - | ------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-struct-async.rs:21:61 + --> $DIR/ref-struct-async.rs:22:9 | LL | async fn pin_ref_Struct(self: Pin<&Struct>, f: &u32) -> &u32 { - | ------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-struct-async.rs:25:70 + --> $DIR/ref-struct-async.rs:26:9 | LL | async fn box_box_ref_Struct(self: Box>, f: &u32) -> &u32 { - | ------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error[E0623]: lifetime mismatch - --> $DIR/ref-struct-async.rs:29:66 + --> $DIR/ref-struct-async.rs:30:9 | LL | async fn box_pin_Struct(self: Box>, f: &u32) -> &u32 { - | ------- ^^^^ - | | | - | | ...but data from `f` is returned here + | ------- ---- + | | | this parameter and the return type are declared with different lifetimes... +LL | f + | ^ ...but data from `f` is returned here error: aborting due to 5 previous errors