use spans in TypeTest rather than mir::Location
Spans are independent of the body being borrow-checked, so they don't need remapping when promoting type-tests and they yield more specific error spans inside bodies of closures/inline consts.
This commit is contained in:
parent
df668b9fb9
commit
02f78fdb94
@ -181,7 +181,7 @@ pub(crate) fn report_region_errors(&mut self, nll_errors: RegionErrors<'tcx>) {
|
|||||||
// Try to convert the lower-bound region into something named we can print for the user.
|
// Try to convert the lower-bound region into something named we can print for the user.
|
||||||
let lower_bound_region = self.to_error_region(type_test.lower_bound);
|
let lower_bound_region = self.to_error_region(type_test.lower_bound);
|
||||||
|
|
||||||
let type_test_span = type_test.locations.span(&self.body);
|
let type_test_span = type_test.span;
|
||||||
|
|
||||||
if let Some(lower_bound_region) = lower_bound_region {
|
if let Some(lower_bound_region) = lower_bound_region {
|
||||||
let generic_ty = type_test.generic_kind.to_ty(self.infcx.tcx);
|
let generic_ty = type_test.generic_kind.to_ty(self.infcx.tcx);
|
||||||
|
@ -214,8 +214,8 @@ pub struct TypeTest<'tcx> {
|
|||||||
/// The region `'x` that the type must outlive.
|
/// The region `'x` that the type must outlive.
|
||||||
pub lower_bound: RegionVid,
|
pub lower_bound: RegionVid,
|
||||||
|
|
||||||
/// Where did this constraint arise and why?
|
/// The span to blame.
|
||||||
pub locations: Locations,
|
pub span: Span,
|
||||||
|
|
||||||
/// A test which, if met by the region `'x`, proves that this type
|
/// A test which, if met by the region `'x`, proves that this type
|
||||||
/// constraint is satisfied.
|
/// constraint is satisfied.
|
||||||
@ -870,13 +870,13 @@ fn check_type_tests(
|
|||||||
if deduplicate_errors.insert((
|
if deduplicate_errors.insert((
|
||||||
erased_generic_kind,
|
erased_generic_kind,
|
||||||
type_test.lower_bound,
|
type_test.lower_bound,
|
||||||
type_test.locations,
|
type_test.span,
|
||||||
)) {
|
)) {
|
||||||
debug!(
|
debug!(
|
||||||
"check_type_test: reporting error for erased_generic_kind={:?}, \
|
"check_type_test: reporting error for erased_generic_kind={:?}, \
|
||||||
lower_bound_region={:?}, \
|
lower_bound_region={:?}, \
|
||||||
type_test.locations={:?}",
|
type_test.span={:?}",
|
||||||
erased_generic_kind, type_test.lower_bound, type_test.locations,
|
erased_generic_kind, type_test.lower_bound, type_test.span,
|
||||||
);
|
);
|
||||||
|
|
||||||
errors_buffer.push(RegionErrorKind::TypeTestError { type_test: type_test.clone() });
|
errors_buffer.push(RegionErrorKind::TypeTestError { type_test: type_test.clone() });
|
||||||
@ -919,7 +919,7 @@ fn try_promote_type_test(
|
|||||||
) -> bool {
|
) -> bool {
|
||||||
let tcx = infcx.tcx;
|
let tcx = infcx.tcx;
|
||||||
|
|
||||||
let TypeTest { generic_kind, lower_bound, locations, verify_bound: _ } = type_test;
|
let TypeTest { generic_kind, lower_bound, span: _, verify_bound: _ } = type_test;
|
||||||
|
|
||||||
let generic_ty = generic_kind.to_ty(tcx);
|
let generic_ty = generic_kind.to_ty(tcx);
|
||||||
let Some(subject) = self.try_promote_type_test_subject(infcx, generic_ty) else {
|
let Some(subject) = self.try_promote_type_test_subject(infcx, generic_ty) else {
|
||||||
@ -947,7 +947,7 @@ fn try_promote_type_test(
|
|||||||
propagated_outlives_requirements.push(ClosureOutlivesRequirement {
|
propagated_outlives_requirements.push(ClosureOutlivesRequirement {
|
||||||
subject,
|
subject,
|
||||||
outlived_free_region: static_r,
|
outlived_free_region: static_r,
|
||||||
blame_span: locations.span(body),
|
blame_span: type_test.span,
|
||||||
category: ConstraintCategory::Boring,
|
category: ConstraintCategory::Boring,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -999,7 +999,7 @@ fn try_promote_type_test(
|
|||||||
let requirement = ClosureOutlivesRequirement {
|
let requirement = ClosureOutlivesRequirement {
|
||||||
subject,
|
subject,
|
||||||
outlived_free_region: upper_bound,
|
outlived_free_region: upper_bound,
|
||||||
blame_span: locations.span(body),
|
blame_span: type_test.span,
|
||||||
category: ConstraintCategory::Boring,
|
category: ConstraintCategory::Boring,
|
||||||
};
|
};
|
||||||
debug!("try_promote_type_test: pushing {:#?}", requirement);
|
debug!("try_promote_type_test: pushing {:#?}", requirement);
|
||||||
|
@ -169,10 +169,7 @@ fn convert(
|
|||||||
.type_must_outlive(origin, t1, r2, constraint_category);
|
.type_must_outlive(origin, t1, r2, constraint_category);
|
||||||
}
|
}
|
||||||
|
|
||||||
GenericArgKind::Const(_) => {
|
GenericArgKind::Const(_) => unreachable!(),
|
||||||
// Consts cannot outlive one another, so we
|
|
||||||
// don't need to handle any relations here.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +199,7 @@ fn verify_to_type_test(
|
|||||||
verify_bound: VerifyBound<'tcx>,
|
verify_bound: VerifyBound<'tcx>,
|
||||||
) -> TypeTest<'tcx> {
|
) -> TypeTest<'tcx> {
|
||||||
let lower_bound = self.to_region_vid(region);
|
let lower_bound = self.to_region_vid(region);
|
||||||
TypeTest { generic_kind, lower_bound, locations: self.locations, verify_bound }
|
TypeTest { generic_kind, lower_bound, span: self.span, verify_bound }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_region_vid(&mut self, r: ty::Region<'tcx>) -> ty::RegionVid {
|
fn to_region_vid(&mut self, r: ty::Region<'tcx>) -> ty::RegionVid {
|
||||||
|
@ -583,7 +583,6 @@ fn sanitize_promoted(&mut self, promoted_body: &'b Body<'tcx>, location: Locatio
|
|||||||
// modify their locations.
|
// modify their locations.
|
||||||
let all_facts = &mut None;
|
let all_facts = &mut None;
|
||||||
let mut constraints = Default::default();
|
let mut constraints = Default::default();
|
||||||
let mut type_tests = Default::default();
|
|
||||||
let mut liveness_constraints =
|
let mut liveness_constraints =
|
||||||
LivenessValues::new(Rc::new(RegionValueElements::new(&promoted_body)));
|
LivenessValues::new(Rc::new(RegionValueElements::new(&promoted_body)));
|
||||||
// Don't try to add borrow_region facts for the promoted MIR
|
// Don't try to add borrow_region facts for the promoted MIR
|
||||||
@ -594,7 +593,6 @@ fn sanitize_promoted(&mut self, promoted_body: &'b Body<'tcx>, location: Locatio
|
|||||||
&mut this.cx.borrowck_context.constraints.outlives_constraints,
|
&mut this.cx.borrowck_context.constraints.outlives_constraints,
|
||||||
&mut constraints,
|
&mut constraints,
|
||||||
);
|
);
|
||||||
mem::swap(&mut this.cx.borrowck_context.constraints.type_tests, &mut type_tests);
|
|
||||||
mem::swap(
|
mem::swap(
|
||||||
&mut this.cx.borrowck_context.constraints.liveness_constraints,
|
&mut this.cx.borrowck_context.constraints.liveness_constraints,
|
||||||
&mut liveness_constraints,
|
&mut liveness_constraints,
|
||||||
@ -615,13 +613,6 @@ fn sanitize_promoted(&mut self, promoted_body: &'b Body<'tcx>, location: Locatio
|
|||||||
swap_constraints(self);
|
swap_constraints(self);
|
||||||
|
|
||||||
let locations = location.to_locations();
|
let locations = location.to_locations();
|
||||||
|
|
||||||
// Use location of promoted const in collected constraints
|
|
||||||
for type_test in type_tests.iter() {
|
|
||||||
let mut type_test = type_test.clone();
|
|
||||||
type_test.locations = locations;
|
|
||||||
self.cx.borrowck_context.constraints.type_tests.push(type_test)
|
|
||||||
}
|
|
||||||
for constraint in constraints.outlives().iter() {
|
for constraint in constraints.outlives().iter() {
|
||||||
let mut constraint = constraint.clone();
|
let mut constraint = constraint.clone();
|
||||||
constraint.locations = locations;
|
constraint.locations = locations;
|
||||||
|
@ -14,11 +14,11 @@ pub struct VTable {
|
|||||||
impl VTable {
|
impl VTable {
|
||||||
pub fn new<T>() -> &'static Self {
|
pub fn new<T>() -> &'static Self {
|
||||||
const {
|
const {
|
||||||
//~^ ERROR the parameter type `T` may not live long enough
|
|
||||||
//~| ERROR the parameter type `T` may not live long enough
|
|
||||||
&VTable {
|
&VTable {
|
||||||
layout: Layout::new::<T>(),
|
layout: Layout::new::<T>(),
|
||||||
type_id: TypeId::of::<T>(),
|
type_id: TypeId::of::<T>(),
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
|
//~| ERROR the parameter type `T` may not live long enough
|
||||||
drop_in_place: unsafe {
|
drop_in_place: unsafe {
|
||||||
transmute::<unsafe fn(*mut T), unsafe fn(*mut ())>(drop_in_place::<T>)
|
transmute::<unsafe fn(*mut T), unsafe fn(*mut ())>(drop_in_place::<T>)
|
||||||
},
|
},
|
||||||
|
@ -1,14 +1,8 @@
|
|||||||
error[E0310]: the parameter type `T` may not live long enough
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/issue-102117.rs:16:9
|
--> $DIR/issue-102117.rs:19:26
|
||||||
|
|
|
|
||||||
LL | / const {
|
LL | type_id: TypeId::of::<T>(),
|
||||||
LL | |
|
| ^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
LL | |
|
|
||||||
LL | | &VTable {
|
|
||||||
... |
|
|
||||||
LL | | }
|
|
||||||
LL | | }
|
|
||||||
| |_________^ ...so that the type `T` will meet its required lifetime bounds
|
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
@ -16,16 +10,10 @@ LL | pub fn new<T: 'static>() -> &'static Self {
|
|||||||
| +++++++++
|
| +++++++++
|
||||||
|
|
||||||
error[E0310]: the parameter type `T` may not live long enough
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/issue-102117.rs:16:9
|
--> $DIR/issue-102117.rs:19:26
|
||||||
|
|
|
|
||||||
LL | / const {
|
LL | type_id: TypeId::of::<T>(),
|
||||||
LL | |
|
| ^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
LL | |
|
|
||||||
LL | | &VTable {
|
|
||||||
... |
|
|
||||||
LL | | }
|
|
||||||
LL | | }
|
|
||||||
| |_________^ ...so that the type `T` will meet its required lifetime bounds
|
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -21,6 +21,7 @@ fn foo<T>() {
|
|||||||
//~| ERROR `T` does not live long enough
|
//~| ERROR `T` does not live long enough
|
||||||
//~| ERROR `T` does not live long enough
|
//~| ERROR `T` does not live long enough
|
||||||
//~| ERROR `T` may not live long enough
|
//~| ERROR `T` may not live long enough
|
||||||
|
//~| ERROR `T` may not live long enough
|
||||||
//
|
//
|
||||||
// FIXME: This error is bogus, but it arises because we try to validate
|
// FIXME: This error is bogus, but it arises because we try to validate
|
||||||
// that `<() as Foo<T>>::Type<'a>` is valid, which requires proving
|
// that `<() as Foo<T>>::Type<'a>` is valid, which requires proving
|
||||||
|
@ -22,6 +22,17 @@ error: `T` does not live long enough
|
|||||||
LL | let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
|
LL | let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
|
--> $DIR/issue-91139.rs:14:58
|
||||||
|
|
|
||||||
|
LL | let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
|
||||||
|
| ^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
||||||
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
||||||
|
LL | fn foo<T: 'static>() {
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
error: `T` does not live long enough
|
error: `T` does not live long enough
|
||||||
--> $DIR/issue-91139.rs:14:58
|
--> $DIR/issue-91139.rs:14:58
|
||||||
|
|
|
|
||||||
@ -57,6 +68,6 @@ error: `T` does not live long enough
|
|||||||
LL | let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
|
LL | let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0310`.
|
For more information about this error, try `rustc --explain E0310`.
|
||||||
|
@ -30,8 +30,6 @@ fn supply<'a, T>(value: T)
|
|||||||
T: Trait<'a>,
|
T: Trait<'a>,
|
||||||
{
|
{
|
||||||
establish_relationships(value, |value| {
|
establish_relationships(value, |value| {
|
||||||
//~^ ERROR the parameter type `T` may not live long enough
|
|
||||||
|
|
||||||
// This function call requires that
|
// This function call requires that
|
||||||
//
|
//
|
||||||
// (a) T: Trait<'a>
|
// (a) T: Trait<'a>
|
||||||
@ -43,6 +41,7 @@ fn supply<'a, T>(value: T)
|
|||||||
// The latter does not hold.
|
// The latter does not hold.
|
||||||
|
|
||||||
require(value);
|
require(value);
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,17 +23,10 @@ LL | | T: Trait<'a>,
|
|||||||
= note: defining type: supply::<'_#1r, T>
|
= note: defining type: supply::<'_#1r, T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/propagate-from-trait-match.rs:32:36
|
--> $DIR/propagate-from-trait-match.rs:43:9
|
||||||
|
|
|
|
||||||
LL | establish_relationships(value, |value| {
|
LL | require(value);
|
||||||
| ____________________________________^
|
| ^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
LL | |
|
|
||||||
LL | |
|
|
||||||
LL | | // This function call requires that
|
|
||||||
... |
|
|
||||||
LL | | require(value);
|
|
||||||
LL | | });
|
|
||||||
| |_____^ ...so that the type `T` will meet its required lifetime bounds
|
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -35,10 +35,10 @@ LL | || { None::<&'a &'b ()>; };
|
|||||||
= help: consider adding the following bound: `'b: 'a`
|
= help: consider adding the following bound: `'b: 'a`
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/issue-98589-closures-relate-named-regions.rs:26:5
|
--> $DIR/issue-98589-closures-relate-named-regions.rs:26:10
|
||||||
|
|
|
|
||||||
LL | || { None::<&'a T>; };
|
LL | || { None::<&'a T>; };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
@ -46,10 +46,10 @@ LL | fn test_early_type<'a: 'a, T: 'a>() {
|
|||||||
| ++++
|
| ++++
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/issue-98589-closures-relate-named-regions.rs:32:5
|
--> $DIR/issue-98589-closures-relate-named-regions.rs:32:10
|
||||||
|
|
|
|
||||||
LL | || { None::<&'a T>; };
|
LL | || { None::<&'a T>; };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -13,8 +13,8 @@ fn assert_static<T>()
|
|||||||
|
|
||||||
fn test<T>() {
|
fn test<T>() {
|
||||||
|| {
|
|| {
|
||||||
//~^ ERROR the parameter type `T` may not live long enough
|
|
||||||
assert_static::<T>();
|
assert_static::<T>();
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
error[E0310]: the parameter type `T` may not live long enough
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/issue-98693.rs:15:5
|
--> $DIR/issue-98693.rs:16:9
|
||||||
|
|
|
|
||||||
LL | / || {
|
LL | assert_static::<T>();
|
||||||
LL | |
|
| ^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
LL | | assert_static::<T>();
|
|
||||||
LL | | };
|
|
||||||
| |_____^ ...so that the type `T` will meet its required lifetime bounds
|
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0310]: the parameter type `T` may not live long enough
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/projection-implied-bounds.rs:30:18
|
--> $DIR/projection-implied-bounds.rs:30:36
|
||||||
|
|
|
|
||||||
LL | twice(value, |value_ref, item| invoke2(value_ref, item));
|
LL | twice(value, |value_ref, item| invoke2(value_ref, item));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -23,10 +23,10 @@ LL | | T: Iterator,
|
|||||||
= note: defining type: no_region::<'_#1r, T>
|
= note: defining type: no_region::<'_#1r, T>
|
||||||
|
|
||||||
error[E0309]: the associated type `<T as Iterator>::Item` may not live long enough
|
error[E0309]: the associated type `<T as Iterator>::Item` may not live long enough
|
||||||
--> $DIR/projection-no-regions-closure.rs:25:23
|
--> $DIR/projection-no-regions-closure.rs:25:31
|
||||||
|
|
|
|
||||||
LL | with_signature(x, |mut y| Box::new(y.next()))
|
LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider adding an explicit lifetime bound `<T as Iterator>::Item: 'a`...
|
= help: consider adding an explicit lifetime bound `<T as Iterator>::Item: 'a`...
|
||||||
= note: ...so that the type `<T as Iterator>::Item` will meet its required lifetime bounds
|
= note: ...so that the type `<T as Iterator>::Item` will meet its required lifetime bounds
|
||||||
@ -80,10 +80,10 @@ LL | | T: 'b + Iterator,
|
|||||||
= note: defining type: wrong_region::<'_#1r, '_#2r, T>
|
= note: defining type: wrong_region::<'_#1r, '_#2r, T>
|
||||||
|
|
||||||
error[E0309]: the associated type `<T as Iterator>::Item` may not live long enough
|
error[E0309]: the associated type `<T as Iterator>::Item` may not live long enough
|
||||||
--> $DIR/projection-no-regions-closure.rs:42:23
|
--> $DIR/projection-no-regions-closure.rs:42:31
|
||||||
|
|
|
|
||||||
LL | with_signature(x, |mut y| Box::new(y.next()))
|
LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider adding an explicit lifetime bound `<T as Iterator>::Item: 'a`...
|
= help: consider adding an explicit lifetime bound `<T as Iterator>::Item: 'a`...
|
||||||
= note: ...so that the type `<T as Iterator>::Item` will meet its required lifetime bounds
|
= note: ...so that the type `<T as Iterator>::Item` will meet its required lifetime bounds
|
||||||
|
@ -25,10 +25,10 @@ LL | | T: Anything<'b>,
|
|||||||
= note: defining type: no_relationships_late::<'_#1r, T>
|
= note: defining type: no_relationships_late::<'_#1r, T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/projection-one-region-closure.rs:45:29
|
--> $DIR/projection-one-region-closure.rs:45:39
|
||||||
|
|
|
|
||||||
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
@ -75,10 +75,10 @@ LL | | 'a: 'a,
|
|||||||
= note: defining type: no_relationships_early::<'_#1r, '_#2r, T>
|
= note: defining type: no_relationships_early::<'_#1r, '_#2r, T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/projection-one-region-closure.rs:56:29
|
--> $DIR/projection-one-region-closure.rs:56:39
|
||||||
|
|
|
|
||||||
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -24,10 +24,10 @@ LL | | T: Anything<'b, 'c>,
|
|||||||
= note: defining type: no_relationships_late::<'_#1r, '_#2r, T>
|
= note: defining type: no_relationships_late::<'_#1r, '_#2r, T>
|
||||||
|
|
||||||
error[E0309]: the associated type `<T as Anything<ReEarlyBound(0, 'b), ReEarlyBound(1, 'c)>>::AssocType` may not live long enough
|
error[E0309]: the associated type `<T as Anything<ReEarlyBound(0, 'b), ReEarlyBound(1, 'c)>>::AssocType` may not live long enough
|
||||||
--> $DIR/projection-two-region-trait-bound-closure.rs:38:29
|
--> $DIR/projection-two-region-trait-bound-closure.rs:38:39
|
||||||
|
|
|
|
||||||
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider adding an explicit lifetime bound `<T as Anything<ReEarlyBound(0, 'b), ReEarlyBound(1, 'c)>>::AssocType: 'a`...
|
= help: consider adding an explicit lifetime bound `<T as Anything<ReEarlyBound(0, 'b), ReEarlyBound(1, 'c)>>::AssocType: 'a`...
|
||||||
= note: ...so that the type `<T as Anything<ReEarlyBound(0, 'b), ReEarlyBound(1, 'c)>>::AssocType` will meet its required lifetime bounds
|
= note: ...so that the type `<T as Anything<ReEarlyBound(0, 'b), ReEarlyBound(1, 'c)>>::AssocType` will meet its required lifetime bounds
|
||||||
@ -58,10 +58,10 @@ LL | | 'a: 'a,
|
|||||||
= note: defining type: no_relationships_early::<'_#1r, '_#2r, '_#3r, T>
|
= note: defining type: no_relationships_early::<'_#1r, '_#2r, '_#3r, T>
|
||||||
|
|
||||||
error[E0309]: the associated type `<T as Anything<ReEarlyBound(1, 'b), ReEarlyBound(2, 'c)>>::AssocType` may not live long enough
|
error[E0309]: the associated type `<T as Anything<ReEarlyBound(1, 'b), ReEarlyBound(2, 'c)>>::AssocType` may not live long enough
|
||||||
--> $DIR/projection-two-region-trait-bound-closure.rs:48:29
|
--> $DIR/projection-two-region-trait-bound-closure.rs:48:39
|
||||||
|
|
|
|
||||||
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider adding an explicit lifetime bound `<T as Anything<ReEarlyBound(1, 'b), ReEarlyBound(2, 'c)>>::AssocType: 'a`...
|
= help: consider adding an explicit lifetime bound `<T as Anything<ReEarlyBound(1, 'b), ReEarlyBound(2, 'c)>>::AssocType: 'a`...
|
||||||
= note: ...so that the type `<T as Anything<ReEarlyBound(1, 'b), ReEarlyBound(2, 'c)>>::AssocType` will meet its required lifetime bounds
|
= note: ...so that the type `<T as Anything<ReEarlyBound(1, 'b), ReEarlyBound(2, 'c)>>::AssocType` will meet its required lifetime bounds
|
||||||
|
@ -44,10 +44,10 @@ LL | fn generic_fail<'a, T>(cell: Cell<&'a ()>, value: T) {
|
|||||||
= note: defining type: generic_fail::<T>
|
= note: defining type: generic_fail::<T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/ty-param-closure-approximate-lower-bound.rs:29:24
|
--> $DIR/ty-param-closure-approximate-lower-bound.rs:29:31
|
||||||
|
|
|
|
||||||
LL | twice(cell, value, |a, b| invoke(a, b));
|
LL | twice(cell, value, |a, b| invoke(a, b));
|
||||||
| ^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -23,10 +23,10 @@ LL | | T: Debug,
|
|||||||
= note: defining type: no_region::<'_#1r, T>
|
= note: defining type: no_region::<'_#1r, T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/ty-param-closure-outlives-from-return-type.rs:26:23
|
--> $DIR/ty-param-closure-outlives-from-return-type.rs:26:27
|
||||||
|
|
|
|
||||||
LL | with_signature(x, |y| y)
|
LL | with_signature(x, |y| y)
|
||||||
| ^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
| ^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
|
@ -25,13 +25,12 @@ fn require<'a, T>(_a: &Cell<&'a ()>, _b: &T)
|
|||||||
#[rustc_regions]
|
#[rustc_regions]
|
||||||
fn no_region<'a, T>(a: Cell<&'a ()>, b: T) {
|
fn no_region<'a, T>(a: Cell<&'a ()>, b: T) {
|
||||||
with_signature(a, b, |x, y| {
|
with_signature(a, b, |x, y| {
|
||||||
//~^ ERROR the parameter type `T` may not live long enough
|
|
||||||
//
|
|
||||||
// See `correct_region`, which explains the point of this
|
// See `correct_region`, which explains the point of this
|
||||||
// test. The only difference is that, in the case of this
|
// test. The only difference is that, in the case of this
|
||||||
// function, there is no where clause *anywhere*, and hence we
|
// function, there is no where clause *anywhere*, and hence we
|
||||||
// get an error (but reported by the closure creator).
|
// get an error (but reported by the closure creator).
|
||||||
require(&x, &y)
|
require(&x, &y)
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,9 +61,9 @@ fn wrong_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
|||||||
T: 'b,
|
T: 'b,
|
||||||
{
|
{
|
||||||
with_signature(a, b, |x, y| {
|
with_signature(a, b, |x, y| {
|
||||||
//~^ ERROR the parameter type `T` may not live long enough
|
|
||||||
// See `correct_region`
|
// See `correct_region`
|
||||||
require(&x, &y)
|
require(&x, &y)
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,17 +22,10 @@ LL | fn no_region<'a, T>(a: Cell<&'a ()>, b: T) {
|
|||||||
= note: defining type: no_region::<T>
|
= note: defining type: no_region::<T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:27:26
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:32:9
|
||||||
|
|
|
|
||||||
LL | with_signature(a, b, |x, y| {
|
LL | require(&x, &y)
|
||||||
| __________________________^
|
| ^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
LL | |
|
|
||||||
LL | | //
|
|
||||||
LL | | // See `correct_region`, which explains the point of this
|
|
||||||
... |
|
|
||||||
LL | | require(&x, &y)
|
|
||||||
LL | | })
|
|
||||||
| |_____^ ...so that the type `T` will meet its required lifetime bounds
|
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
@ -40,7 +33,7 @@ LL | fn no_region<'a, T: 'a>(a: Cell<&'a ()>, b: T) {
|
|||||||
| ++++
|
| ++++
|
||||||
|
|
||||||
note: external requirements
|
note: external requirements
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:43:26
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:42:26
|
||||||
|
|
|
|
||||||
LL | with_signature(a, b, |x, y| {
|
LL | with_signature(a, b, |x, y| {
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
@ -54,7 +47,7 @@ LL | with_signature(a, b, |x, y| {
|
|||||||
= note: where T: '_#2r
|
= note: where T: '_#2r
|
||||||
|
|
||||||
note: no external requirements
|
note: no external requirements
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:39:1
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:38:1
|
||||||
|
|
|
|
||||||
LL | / fn correct_region<'a, T>(a: Cell<&'a ()>, b: T)
|
LL | / fn correct_region<'a, T>(a: Cell<&'a ()>, b: T)
|
||||||
LL | | where
|
LL | | where
|
||||||
@ -64,7 +57,7 @@ LL | | T: 'a,
|
|||||||
= note: defining type: correct_region::<'_#1r, T>
|
= note: defining type: correct_region::<'_#1r, T>
|
||||||
|
|
||||||
note: external requirements
|
note: external requirements
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:64:26
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:63:26
|
||||||
|
|
|
|
||||||
LL | with_signature(a, b, |x, y| {
|
LL | with_signature(a, b, |x, y| {
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
@ -79,7 +72,7 @@ LL | with_signature(a, b, |x, y| {
|
|||||||
= note: where T: '_#2r
|
= note: where T: '_#2r
|
||||||
|
|
||||||
note: no external requirements
|
note: no external requirements
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:60:1
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:59:1
|
||||||
|
|
|
|
||||||
LL | / fn wrong_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
LL | / fn wrong_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
||||||
LL | | where
|
LL | | where
|
||||||
@ -89,15 +82,10 @@ LL | | T: 'b,
|
|||||||
= note: defining type: wrong_region::<'_#1r, T>
|
= note: defining type: wrong_region::<'_#1r, T>
|
||||||
|
|
||||||
error[E0309]: the parameter type `T` may not live long enough
|
error[E0309]: the parameter type `T` may not live long enough
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:64:26
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:65:9
|
||||||
|
|
|
|
||||||
LL | with_signature(a, b, |x, y| {
|
LL | require(&x, &y)
|
||||||
| __________________________^
|
| ^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
LL | |
|
|
||||||
LL | | // See `correct_region`
|
|
||||||
LL | | require(&x, &y)
|
|
||||||
LL | | })
|
|
||||||
| |_____^ ...so that the type `T` will meet its required lifetime bounds
|
|
||||||
|
|
|
|
||||||
help: consider adding an explicit lifetime bound...
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
|
||||||
@ -105,7 +93,7 @@ LL | T: 'b + 'a,
|
|||||||
| ++++
|
| ++++
|
||||||
|
|
||||||
note: external requirements
|
note: external requirements
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:77:26
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:76:26
|
||||||
|
|
|
|
||||||
LL | with_signature(a, b, |x, y| {
|
LL | with_signature(a, b, |x, y| {
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
@ -119,7 +107,7 @@ LL | with_signature(a, b, |x, y| {
|
|||||||
= note: where T: '_#3r
|
= note: where T: '_#3r
|
||||||
|
|
||||||
note: no external requirements
|
note: no external requirements
|
||||||
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:72:1
|
--> $DIR/ty-param-closure-outlives-from-where-clause.rs:71:1
|
||||||
|
|
|
|
||||||
LL | / fn outlives_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
LL | / fn outlives_region<'a, 'b, T>(a: Cell<&'a ()>, b: T)
|
||||||
LL | | where
|
LL | | where
|
||||||
|
Loading…
Reference in New Issue
Block a user