1
Fork 0

Rollup merge of #82370 - 0yoyoyo:update-issue-81650-point-anonymous-lifetime, r=estebank

Improve anonymous lifetime note to indicate the target span

Improvement for  #81650
Cc #81995

Message after this improvement:
(Improve note in the middle)

```
error[E0311]: the parameter type `T` may not live long enough
  --> src/main.rs:25:11
   |
24 | fn play_with<T: Animal + Send>(scope: &Scope, animal: T) {
   |              -- help: consider adding an explicit lifetime bound...: `T: 'a +`
25 |     scope.spawn(move |_| {
   |           ^^^^^
   |
note: the parameter type `T` must be valid for the anonymous lifetime defined on the function body at 24:40...
  --> src/main.rs:24:40
   |
24 | fn play_with<T: Animal + Send>(scope: &Scope, animal: T) {
   |                                        ^^^^^
note: ...so that the type `[closure@src/main.rs:25:17: 27:6]` will meet its required lifetime bounds
  --> src/main.rs:25:11
   |
25 |     scope.spawn(move |_| {
   |           ^^^^^
```

r? ``````@estebank``````
This commit is contained in:
Dylan DPC 2021-02-27 02:34:22 +01:00 committed by GitHub
commit f0c98b15cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 157 additions and 166 deletions

View file

@ -50,6 +50,7 @@ use super::region_constraints::GenericKind;
use super::{InferCtxt, RegionVariableOrigin, SubregionOrigin, TypeTrace, ValuePairs}; use super::{InferCtxt, RegionVariableOrigin, SubregionOrigin, TypeTrace, ValuePairs};
use crate::infer; use crate::infer;
use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_type;
use crate::traits::error_reporting::report_object_safety_error; use crate::traits::error_reporting::report_object_safety_error;
use crate::traits::{ use crate::traits::{
IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode, IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode,
@ -179,7 +180,14 @@ fn msg_span_from_early_bound_and_free_regions(
} }
ty::ReFree(ref fr) => match fr.bound_region { ty::ReFree(ref fr) => match fr.bound_region {
ty::BrAnon(idx) => { ty::BrAnon(idx) => {
(format!("the anonymous lifetime #{} defined on", idx + 1), tcx.hir().span(node)) if let Some((ty, _)) = find_anon_type(tcx, region, &fr.bound_region) {
("the anonymous lifetime defined on".to_string(), ty.span)
} else {
(
format!("the anonymous lifetime #{} defined on", idx + 1),
tcx.hir().span(node),
)
}
} }
_ => ( _ => (
format!("the lifetime `{}` as defined on", region), format!("the lifetime `{}` as defined on", region),

View file

@ -1,6 +1,7 @@
//! Error Reporting for Anonymous Region Lifetime Errors //! Error Reporting for Anonymous Region Lifetime Errors
//! where both the regions are anonymous. //! where both the regions are anonymous.
use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_type;
use crate::infer::error_reporting::nice_region_error::util::AnonymousParamInfo; use crate::infer::error_reporting::nice_region_error::util::AnonymousParamInfo;
use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::error_reporting::nice_region_error::NiceRegionError;
use crate::infer::lexical_region_resolve::RegionResolutionError; use crate::infer::lexical_region_resolve::RegionResolutionError;
@ -66,9 +67,9 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
let scope_def_id_sub = anon_reg_sub.def_id; let scope_def_id_sub = anon_reg_sub.def_id;
let bregion_sub = anon_reg_sub.boundregion; let bregion_sub = anon_reg_sub.boundregion;
let ty_sup = self.find_anon_type(sup, &bregion_sup)?; let ty_sup = find_anon_type(self.tcx(), sup, &bregion_sup)?;
let ty_sub = self.find_anon_type(sub, &bregion_sub)?; let ty_sub = find_anon_type(self.tcx(), sub, &bregion_sub)?;
debug!( debug!(
"try_report_anon_anon_conflict: found_param1={:?} sup={:?} br1={:?}", "try_report_anon_anon_conflict: found_param1={:?} sup={:?} br1={:?}",

View file

@ -1,4 +1,3 @@
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
use rustc_hir::Node; use rustc_hir::Node;
@ -6,7 +5,6 @@ use rustc_middle::hir::map::Map;
use rustc_middle::middle::resolve_lifetime as rl; use rustc_middle::middle::resolve_lifetime as rl;
use rustc_middle::ty::{self, Region, TyCtxt}; use rustc_middle::ty::{self, Region, TyCtxt};
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
/// This function calls the `visit_ty` method for the parameters /// This function calls the `visit_ty` method for the parameters
/// corresponding to the anonymous regions. The `nested_visitor.found_type` /// corresponding to the anonymous regions. The `nested_visitor.found_type`
/// contains the anonymous type. /// contains the anonymous type.
@ -22,29 +20,28 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
/// ``` /// ```
/// The function returns the nested type corresponding to the anonymous region /// The function returns the nested type corresponding to the anonymous region
/// for e.g., `&u8` and Vec<`&u8`. /// for e.g., `&u8` and Vec<`&u8`.
pub(super) fn find_anon_type( pub(crate) fn find_anon_type(
&self, tcx: TyCtxt<'tcx>,
region: Region<'tcx>, region: Region<'tcx>,
br: &ty::BoundRegionKind, br: &ty::BoundRegionKind,
) -> Option<(&hir::Ty<'tcx>, &hir::FnDecl<'tcx>)> { ) -> Option<(&'tcx hir::Ty<'tcx>, &'tcx hir::FnDecl<'tcx>)> {
if let Some(anon_reg) = self.tcx().is_suitable_region(region) { if let Some(anon_reg) = tcx.is_suitable_region(region) {
let hir_id = self.tcx().hir().local_def_id_to_hir_id(anon_reg.def_id); let hir_id = tcx.hir().local_def_id_to_hir_id(anon_reg.def_id);
let fndecl = match self.tcx().hir().get(hir_id) { let fndecl = match tcx.hir().get(hir_id) {
Node::Item(&hir::Item { kind: hir::ItemKind::Fn(ref m, ..), .. }) Node::Item(&hir::Item { kind: hir::ItemKind::Fn(ref m, ..), .. })
| Node::TraitItem(&hir::TraitItem { | Node::TraitItem(&hir::TraitItem {
kind: hir::TraitItemKind::Fn(ref m, ..), kind: hir::TraitItemKind::Fn(ref m, ..), ..
..
}) })
| Node::ImplItem(&hir::ImplItem { | Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Fn(ref m, ..), .. }) => {
kind: hir::ImplItemKind::Fn(ref m, ..), .. &m.decl
}) => &m.decl, }
_ => return None, _ => return None,
}; };
fndecl fndecl
.inputs .inputs
.iter() .iter()
.find_map(|arg| self.find_component_for_bound_region(arg, br)) .find_map(|arg| find_component_for_bound_region(tcx, arg, br))
.map(|ty| (ty, &**fndecl)) .map(|ty| (ty, &**fndecl))
} else { } else {
None None
@ -54,12 +51,12 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
// This method creates a FindNestedTypeVisitor which returns the type corresponding // This method creates a FindNestedTypeVisitor which returns the type corresponding
// to the anonymous region. // to the anonymous region.
fn find_component_for_bound_region( fn find_component_for_bound_region(
&self, tcx: TyCtxt<'tcx>,
arg: &'tcx hir::Ty<'tcx>, arg: &'tcx hir::Ty<'tcx>,
br: &ty::BoundRegionKind, br: &ty::BoundRegionKind,
) -> Option<&'tcx hir::Ty<'tcx>> { ) -> Option<&'tcx hir::Ty<'tcx>> {
let mut nested_visitor = FindNestedTypeVisitor { let mut nested_visitor = FindNestedTypeVisitor {
tcx: self.tcx(), tcx,
bound_region: *br, bound_region: *br,
found_type: None, found_type: None,
current_index: ty::INNERMOST, current_index: ty::INNERMOST,
@ -67,7 +64,6 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
nested_visitor.visit_ty(arg); nested_visitor.visit_ty(arg);
nested_visitor.found_type nested_visitor.found_type
} }
}
// The FindNestedTypeVisitor captures the corresponding `hir::Ty` of the // The FindNestedTypeVisitor captures the corresponding `hir::Ty` of the
// anonymous region. The example above would lead to a conflict between // anonymous region. The example above would lead to a conflict between

View file

@ -6,7 +6,7 @@ use rustc_middle::ty::{self, TyCtxt};
use rustc_span::source_map::Span; use rustc_span::source_map::Span;
mod different_lifetimes; mod different_lifetimes;
mod find_anon_type; pub mod find_anon_type;
mod named_anon_conflict; mod named_anon_conflict;
mod placeholder_error; mod placeholder_error;
mod static_impl_trait; mod static_impl_trait;

View file

@ -1,5 +1,6 @@
//! Error Reporting for Anonymous Region Lifetime Errors //! Error Reporting for Anonymous Region Lifetime Errors
//! where one region is named and the other is anonymous. //! where one region is named and the other is anonymous.
use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_type;
use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::error_reporting::nice_region_error::NiceRegionError;
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder};
use rustc_hir::intravisit::Visitor; use rustc_hir::intravisit::Visitor;
@ -74,7 +75,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
return None; return None;
} }
if let Some((_, fndecl)) = self.find_anon_type(anon, &br) { if let Some((_, fndecl)) = find_anon_type(self.tcx(), anon, &br) {
if self.is_self_anon(is_first, scope_def_id) { if self.is_self_anon(is_first, scope_def_id) {
return None; return None;
} }

View file

@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for autoref due to conflictin
LL | self.a(); LL | self.a();
| ^ | ^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 3:5... note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 3:10...
--> $DIR/issue-16683.rs:3:5 --> $DIR/issue-16683.rs:3:10
| |
LL | fn b(&self) { LL | fn b(&self) {
| ^^^^^^^^^^^ | ^^^^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/issue-16683.rs:4:9 --> $DIR/issue-16683.rs:4:9
| |

View file

@ -6,11 +6,11 @@ LL | fn bar(self: &mut Foo) {
| |
= note: expected struct `Foo<'a>` = note: expected struct `Foo<'a>`
found struct `Foo<'_>` found struct `Foo<'_>`
note: the anonymous lifetime #2 defined on the method body at 6:5... note: the anonymous lifetime defined on the method body at 6:23...
--> $DIR/issue-17740.rs:6:5 --> $DIR/issue-17740.rs:6:23
| |
LL | fn bar(self: &mut Foo) { LL | fn bar(self: &mut Foo) {
| ^^^^^^^^^^^^^^^^^^^^^^ | ^^^
note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 5:7 note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 5:7
--> $DIR/issue-17740.rs:5:7 --> $DIR/issue-17740.rs:5:7
| |
@ -30,11 +30,11 @@ note: the lifetime `'a` as defined on the impl at 5:7...
| |
LL | impl <'a> Foo<'a>{ LL | impl <'a> Foo<'a>{
| ^^ | ^^
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 6:5 note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 6:23
--> $DIR/issue-17740.rs:6:5 --> $DIR/issue-17740.rs:6:23
| |
LL | fn bar(self: &mut Foo) { LL | fn bar(self: &mut Foo) {
| ^^^^^^^^^^^^^^^^^^^^^^ | ^^^
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for autoref due to conflictin
LL | self.foo(); LL | self.foo();
| ^^^ | ^^^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 6:5... note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 6:12...
--> $DIR/issue-17758.rs:6:5 --> $DIR/issue-17758.rs:6:12
| |
LL | fn bar(&self) { LL | fn bar(&self) {
| ^^^^^^^^^^^^^ | ^^^^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/issue-17758.rs:7:9 --> $DIR/issue-17758.rs:7:9
| |

View file

@ -6,11 +6,11 @@ LL | fn say(self: &Pair<&str, isize>) {
| |
= note: expected struct `Pair<&str, _>` = note: expected struct `Pair<&str, _>`
found struct `Pair<&str, _>` found struct `Pair<&str, _>`
note: the anonymous lifetime #2 defined on the method body at 8:5... note: the anonymous lifetime defined on the method body at 8:24...
--> $DIR/issue-17905-2.rs:8:5 --> $DIR/issue-17905-2.rs:8:24
| |
LL | fn say(self: &Pair<&str, isize>) { LL | fn say(self: &Pair<&str, isize>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'_` as defined on the impl at 5:5 note: ...does not necessarily outlive the lifetime `'_` as defined on the impl at 5:5
--> $DIR/issue-17905-2.rs:5:5 --> $DIR/issue-17905-2.rs:5:5
| |
@ -30,11 +30,11 @@ note: the lifetime `'_` as defined on the impl at 5:5...
| |
LL | &str, LL | &str,
| ^ | ^
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 8:5 note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 8:24
--> $DIR/issue-17905-2.rs:8:5 --> $DIR/issue-17905-2.rs:8:24
| |
LL | fn say(self: &Pair<&str, isize>) { LL | fn say(self: &Pair<&str, isize>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` d
LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) { LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the method body at 28:5... note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 28:58...
--> $DIR/issue-20831-debruijn.rs:28:5 --> $DIR/issue-20831-debruijn.rs:28:58
| |
LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) { LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...but the lifetime must also be valid for the lifetime `'a` as defined on the impl at 26:6... note: ...but the lifetime must also be valid for the lifetime `'a` as defined on the impl at 26:6...
--> $DIR/issue-20831-debruijn.rs:26:6 --> $DIR/issue-20831-debruijn.rs:26:6
| |

View file

@ -6,11 +6,11 @@ LL | fn select(&self) -> BufferViewHandle<R>;
| |
= note: expected type `Resources<'_>` = note: expected type `Resources<'_>`
found type `Resources<'a>` found type `Resources<'a>`
note: the anonymous lifetime #1 defined on the method body at 5:5... note: the anonymous lifetime defined on the method body at 5:15...
--> $DIR/issue-27942.rs:5:5 --> $DIR/issue-27942.rs:5:15
| |
LL | fn select(&self) -> BufferViewHandle<R>; LL | fn select(&self) -> BufferViewHandle<R>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^
note: ...does not necessarily outlive the lifetime `'a` as defined on the trait at 3:18 note: ...does not necessarily outlive the lifetime `'a` as defined on the trait at 3:18
--> $DIR/issue-27942.rs:3:18 --> $DIR/issue-27942.rs:3:18
| |
@ -30,11 +30,11 @@ note: the lifetime `'a` as defined on the trait at 3:18...
| |
LL | pub trait Buffer<'a, R: Resources<'a>> { LL | pub trait Buffer<'a, R: Resources<'a>> {
| ^^ | ^^
note: ...does not necessarily outlive the anonymous lifetime #1 defined on the method body at 5:5 note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 5:15
--> $DIR/issue-27942.rs:5:5 --> $DIR/issue-27942.rs:5:15
| |
LL | fn select(&self) -> BufferViewHandle<R>; LL | fn select(&self) -> BufferViewHandle<R>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -9,11 +9,11 @@ note: ...the reference is valid for the lifetime `'_` as defined on the impl at
| |
LL | impl Foo<'_, '_> { LL | impl Foo<'_, '_> {
| ^^ | ^^
note: ...but the borrowed content is only valid for the anonymous lifetime #2 defined on the method body at 13:5 note: ...but the borrowed content is only valid for the anonymous lifetime defined on the method body at 13:31
--> $DIR/issue-52742.rs:13:5 --> $DIR/issue-52742.rs:13:31
| |
LL | fn take_bar(&mut self, b: Bar<'_>) { LL | fn take_bar(&mut self, b: Bar<'_>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^
error: aborting due to previous error error: aborting due to previous error

View file

@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'s` d
LL | Foo { bar } LL | Foo { bar }
| ^^^ | ^^^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 8:5... note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 8:17...
--> $DIR/issue-55394.rs:8:5 --> $DIR/issue-55394.rs:8:17
| |
LL | fn new(bar: &mut Bar) -> Self { LL | fn new(bar: &mut Bar) -> Self {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/issue-55394.rs:9:15 --> $DIR/issue-55394.rs:9:15
| |

View file

@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` d
LL | C { f: b } LL | C { f: b }
| ^ | ^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 16:5... note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 16:24...
--> $DIR/type-alias-free-regions.rs:16:5 --> $DIR/type-alias-free-regions.rs:16:24
| |
LL | fn from_box(b: Box<B>) -> Self { LL | fn from_box(b: Box<B>) -> Self {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^
note: ...so that the expression is assignable note: ...so that the expression is assignable
--> $DIR/type-alias-free-regions.rs:17:16 --> $DIR/type-alias-free-regions.rs:17:16
| |
@ -35,11 +35,11 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
LL | C { f: Box::new(b.0) } LL | C { f: Box::new(b.0) }
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 26:5... note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 26:23...
--> $DIR/type-alias-free-regions.rs:26:5 --> $DIR/type-alias-free-regions.rs:26:23
| |
LL | fn from_tuple(b: (B,)) -> Self { LL | fn from_tuple(b: (B,)) -> Self {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^
note: ...so that the expression is assignable note: ...so that the expression is assignable
--> $DIR/type-alias-free-regions.rs:27:25 --> $DIR/type-alias-free-regions.rs:27:25
| |

View file

@ -6,11 +6,11 @@ LL | self.f = b;
| |
= note: expected struct `Box<Box<&'a isize>>` = note: expected struct `Box<Box<&'a isize>>`
found struct `Box<Box<&isize>>` found struct `Box<Box<&isize>>`
note: the anonymous lifetime #2 defined on the method body at 21:5... note: the anonymous lifetime defined on the method body at 21:36...
--> $DIR/regions-infer-paramd-indirect.rs:21:5 --> $DIR/regions-infer-paramd-indirect.rs:21:36
| |
LL | fn set_f_bad(&mut self, b: Box<B>) { LL | fn set_f_bad(&mut self, b: Box<B>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^
note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 16:6 note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 16:6
--> $DIR/regions-infer-paramd-indirect.rs:16:6 --> $DIR/regions-infer-paramd-indirect.rs:16:6
| |

View file

@ -7,11 +7,11 @@ LL | | t.test();
LL | | }); LL | | });
| |______^ | |______^
| |
note: the parameter type `T` must be valid for the anonymous lifetime #2 defined on the function body at 19:1... note: the parameter type `T` must be valid for the anonymous lifetime defined on the function body at 19:24...
--> $DIR/missing-lifetimes-in-signature-2.rs:19:1 --> $DIR/missing-lifetimes-in-signature-2.rs:19:24
| |
LL | fn func<T: Test>(foo: &Foo, t: T) { LL | fn func<T: Test>(foo: &Foo, t: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^
error: aborting due to previous error error: aborting due to previous error

View file

@ -6,11 +6,11 @@ LL | fn func<T: Test>(foo: &Foo, t: T) {
LL | foo.bar(move |_| { LL | foo.bar(move |_| {
| ^^^ | ^^^
| |
note: the parameter type `T` must be valid for the anonymous lifetime #2 defined on the function body at 19:1... note: the parameter type `T` must be valid for the anonymous lifetime defined on the function body at 19:24...
--> $DIR/missing-lifetimes-in-signature-2.rs:19:1 --> $DIR/missing-lifetimes-in-signature-2.rs:19:24
| |
LL | fn func<T: Test>(foo: &Foo, t: T) { LL | fn func<T: Test>(foo: &Foo, t: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^
note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature-2.rs:20:13: 23:6]` will meet its required lifetime bounds note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature-2.rs:20:13: 23:6]` will meet its required lifetime bounds
--> $DIR/missing-lifetimes-in-signature-2.rs:20:9 --> $DIR/missing-lifetimes-in-signature-2.rs:20:9
| |

View file

@ -25,14 +25,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 25:1... note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 25:26...
--> $DIR/missing-lifetimes-in-signature.rs:25:1 --> $DIR/missing-lifetimes-in-signature.rs:25:26
| |
LL | / fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
LL | | | ^^^^^^
LL | | where
LL | | G: Get<T>
| |_____________^
error[E0311]: the parameter type `G` may not live long enough error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:47:45 --> $DIR/missing-lifetimes-in-signature.rs:47:45
@ -40,14 +37,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 47:1... note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 47:34...
--> $DIR/missing-lifetimes-in-signature.rs:47:1 --> $DIR/missing-lifetimes-in-signature.rs:47:34
| |
LL | / fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
LL | | | ^^^^^^
LL | | where
LL | | G: Get<T>
| |_____________^
error[E0311]: the parameter type `G` may not live long enough error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:59:58 --> $DIR/missing-lifetimes-in-signature.rs:59:58
@ -55,11 +49,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the method body at 59:5... note: the parameter type `G` must be valid for the anonymous lifetime defined on the method body at 59:47...
--> $DIR/missing-lifetimes-in-signature.rs:59:5 --> $DIR/missing-lifetimes-in-signature.rs:59:47
| |
LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^
error[E0311]: the parameter type `G` may not live long enough error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:68:45 --> $DIR/missing-lifetimes-in-signature.rs:68:45
@ -67,14 +61,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
| ^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 68:1... note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 68:34...
--> $DIR/missing-lifetimes-in-signature.rs:68:1 --> $DIR/missing-lifetimes-in-signature.rs:68:34
| |
LL | / fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
LL | | | ^^^^^^
LL | | where
LL | | G: Get<T>
| |_____________^
error[E0621]: explicit lifetime required in the type of `dest` error[E0621]: explicit lifetime required in the type of `dest`
--> $DIR/missing-lifetimes-in-signature.rs:73:5 --> $DIR/missing-lifetimes-in-signature.rs:73:5

View file

@ -33,14 +33,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 25:1... note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 25:26...
--> $DIR/missing-lifetimes-in-signature.rs:25:1 --> $DIR/missing-lifetimes-in-signature.rs:25:26
| |
LL | / fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
LL | | | ^^^^^^
LL | | where
LL | | G: Get<T>
| |_____________^
note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:30:5: 32:6]` will meet its required lifetime bounds note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:30:5: 32:6]` will meet its required lifetime bounds
--> $DIR/missing-lifetimes-in-signature.rs:25:37 --> $DIR/missing-lifetimes-in-signature.rs:25:37
| |
@ -57,14 +54,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 47:1... note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 47:34...
--> $DIR/missing-lifetimes-in-signature.rs:47:1 --> $DIR/missing-lifetimes-in-signature.rs:47:34
| |
LL | / fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
LL | | | ^^^^^^
LL | | where
LL | | G: Get<T>
| |_____________^
note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:52:5: 54:6]` will meet its required lifetime bounds note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:52:5: 54:6]` will meet its required lifetime bounds
--> $DIR/missing-lifetimes-in-signature.rs:47:45 --> $DIR/missing-lifetimes-in-signature.rs:47:45
| |
@ -81,11 +75,11 @@ error[E0311]: the parameter type `G` may not live long enough
LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the method body at 59:5... note: the parameter type `G` must be valid for the anonymous lifetime defined on the method body at 59:47...
--> $DIR/missing-lifetimes-in-signature.rs:59:5 --> $DIR/missing-lifetimes-in-signature.rs:59:47
| |
LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^
note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:61:9: 63:10]` will meet its required lifetime bounds note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:61:9: 63:10]` will meet its required lifetime bounds
--> $DIR/missing-lifetimes-in-signature.rs:59:58 --> $DIR/missing-lifetimes-in-signature.rs:59:58
| |

View file

@ -33,11 +33,11 @@ LL | fn dummy2(self: &Bar<T>) {}
| |
= note: expected reference `&'a Bar<T>` = note: expected reference `&'a Bar<T>`
found reference `&Bar<T>` found reference `&Bar<T>`
note: the anonymous lifetime #1 defined on the method body at 37:5... note: the anonymous lifetime defined on the method body at 37:21...
--> $DIR/ufcs-explicit-self-bad.rs:37:5 --> $DIR/ufcs-explicit-self-bad.rs:37:21
| |
LL | fn dummy2(self: &Bar<T>) {} LL | fn dummy2(self: &Bar<T>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^
note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 35:6 note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 35:6
--> $DIR/ufcs-explicit-self-bad.rs:35:6 --> $DIR/ufcs-explicit-self-bad.rs:35:6
| |
@ -57,11 +57,11 @@ note: the lifetime `'a` as defined on the impl at 35:6...
| |
LL | impl<'a, T> SomeTrait for &'a Bar<T> { LL | impl<'a, T> SomeTrait for &'a Bar<T> {
| ^^ | ^^
note: ...does not necessarily outlive the anonymous lifetime #1 defined on the method body at 37:5 note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 37:21
--> $DIR/ufcs-explicit-self-bad.rs:37:5 --> $DIR/ufcs-explicit-self-bad.rs:37:21
| |
LL | fn dummy2(self: &Bar<T>) {} LL | fn dummy2(self: &Bar<T>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^
error[E0308]: mismatched `self` parameter type error[E0308]: mismatched `self` parameter type
--> $DIR/ufcs-explicit-self-bad.rs:39:21 --> $DIR/ufcs-explicit-self-bad.rs:39:21
@ -71,11 +71,11 @@ LL | fn dummy3(self: &&Bar<T>) {}
| |
= note: expected reference `&'a Bar<T>` = note: expected reference `&'a Bar<T>`
found reference `&Bar<T>` found reference `&Bar<T>`
note: the anonymous lifetime #2 defined on the method body at 39:5... note: the anonymous lifetime defined on the method body at 39:22...
--> $DIR/ufcs-explicit-self-bad.rs:39:5 --> $DIR/ufcs-explicit-self-bad.rs:39:22
| |
LL | fn dummy3(self: &&Bar<T>) {} LL | fn dummy3(self: &&Bar<T>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^
note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 35:6 note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 35:6
--> $DIR/ufcs-explicit-self-bad.rs:35:6 --> $DIR/ufcs-explicit-self-bad.rs:35:6
| |
@ -95,11 +95,11 @@ note: the lifetime `'a` as defined on the impl at 35:6...
| |
LL | impl<'a, T> SomeTrait for &'a Bar<T> { LL | impl<'a, T> SomeTrait for &'a Bar<T> {
| ^^ | ^^
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 39:5 note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 39:22
--> $DIR/ufcs-explicit-self-bad.rs:39:5 --> $DIR/ufcs-explicit-self-bad.rs:39:22
| |
LL | fn dummy3(self: &&Bar<T>) {} LL | fn dummy3(self: &&Bar<T>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^
error: aborting due to 7 previous errors error: aborting due to 7 previous errors