1
Fork 0

Flip spans for precise capturing syntax not capturing a ty/ct param

This commit is contained in:
Michael Goulet 2024-04-19 15:18:00 -04:00
parent 584f183dc0
commit fa0428c9d0
7 changed files with 37 additions and 28 deletions

View file

@ -580,10 +580,11 @@ fn check_opaque_precise_captures<'tcx>(tcx: TyCtxt<'tcx>, opaque_def_id: LocalDe
match param.kind { match param.kind {
ty::GenericParamDefKind::Lifetime => { ty::GenericParamDefKind::Lifetime => {
let use_span = tcx.def_span(param.def_id);
let opaque_span = tcx.def_span(opaque_def_id);
// Check if the lifetime param was captured but isn't named in the precise captures list. // Check if the lifetime param was captured but isn't named in the precise captures list.
if variances[param.index as usize] == ty::Invariant { if variances[param.index as usize] == ty::Invariant {
let param_span = if let DefKind::OpaqueTy = if let DefKind::OpaqueTy = tcx.def_kind(tcx.parent(param.def_id))
tcx.def_kind(tcx.parent(param.def_id))
&& let ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. }) && let ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. })
| ty::ReLateParam(ty::LateParamRegion { | ty::ReLateParam(ty::LateParamRegion {
bound_region: ty::BoundRegionKind::BrNamed(def_id, _), bound_region: ty::BoundRegionKind::BrNamed(def_id, _),
@ -591,16 +592,22 @@ fn check_opaque_precise_captures<'tcx>(tcx: TyCtxt<'tcx>, opaque_def_id: LocalDe
}) = *tcx }) = *tcx
.map_opaque_lifetime_to_parent_lifetime(param.def_id.expect_local()) .map_opaque_lifetime_to_parent_lifetime(param.def_id.expect_local())
{ {
Some(tcx.def_span(def_id))
} else {
None
};
// FIXME(precise_capturing): Structured suggestion for this would be useful
tcx.dcx().emit_err(errors::LifetimeNotCaptured { tcx.dcx().emit_err(errors::LifetimeNotCaptured {
use_span: tcx.def_span(param.def_id), opaque_span,
param_span, use_span,
opaque_span: tcx.def_span(opaque_def_id), param_span: tcx.def_span(def_id),
}); });
} else {
// If the `use_span` is actually just the param itself, then we must
// have not duplicated the lifetime but captured the original.
// The "effective" `use_span` will be the span of the opaque itself,
// and the param span will be the def span of the param.
tcx.dcx().emit_err(errors::LifetimeNotCaptured {
opaque_span,
use_span: opaque_span,
param_span: use_span,
});
}
continue; continue;
} }
} }

View file

@ -6,9 +6,9 @@ use rustc_span::{Span, Symbol};
#[note] #[note]
pub struct ParamNotCaptured { pub struct ParamNotCaptured {
#[primary_span] #[primary_span]
pub param_span: Span,
#[label]
pub opaque_span: Span, pub opaque_span: Span,
#[label]
pub param_span: Span,
pub kind: &'static str, pub kind: &'static str,
} }
@ -18,7 +18,7 @@ pub struct LifetimeNotCaptured {
#[primary_span] #[primary_span]
pub use_span: Span, pub use_span: Span,
#[label(hir_analysis_param_label)] #[label(hir_analysis_param_label)]
pub param_span: Option<Span>, pub param_span: Span,
#[label] #[label]
pub opaque_span: Span, pub opaque_span: Span,
} }

View file

@ -31,8 +31,8 @@ impl<'a> W<'a> {
// But also make sure that we error here... // But also make sure that we error here...
impl<'a> W<'a> { impl<'a> W<'a> {
//~^ ERROR `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
fn bad2() -> impl use<> Into<<Self as Tr>::Assoc> {} fn bad2() -> impl use<> Into<<Self as Tr>::Assoc> {}
//~^ ERROR `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
} }
fn main() {} fn main() {}

View file

@ -16,13 +16,12 @@ LL | fn bad1() -> impl use<> Into<<W<'a> as Tr>::Assoc> {}
| -------------------^^---------------- lifetime captured due to being mentioned in the bounds of the `impl Trait` | -------------------^^---------------- lifetime captured due to being mentioned in the bounds of the `impl Trait`
error: `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list error: `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
--> $DIR/capture-parent-arg.rs:33:6 --> $DIR/capture-parent-arg.rs:34:18
| |
LL | impl<'a> W<'a> { LL | impl<'a> W<'a> {
| ^^ | -- this lifetime parameter is captured
LL |
LL | fn bad2() -> impl use<> Into<<Self as Tr>::Assoc> {} LL | fn bad2() -> impl use<> Into<<Self as Tr>::Assoc> {}
| ------------------------------------ lifetime captured due to being mentioned in the bounds of the `impl Trait` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime captured due to being mentioned in the bounds of the `impl Trait`
error: aborting due to 2 previous errors; 1 warning emitted error: aborting due to 2 previous errors; 1 warning emitted

View file

@ -8,10 +8,12 @@ LL | #![feature(precise_capturing)]
= note: `#[warn(incomplete_features)]` on by default = note: `#[warn(incomplete_features)]` on by default
error: `impl Trait` must mention all const parameters in scope error: `impl Trait` must mention all const parameters in scope
--> $DIR/forgot-to-capture-const.rs:4:13 --> $DIR/forgot-to-capture-const.rs:4:34
| |
LL | fn constant<const C: usize>() -> impl use<> Sized {} LL | fn constant<const C: usize>() -> impl use<> Sized {}
| ^^^^^^^^^^^^^^ ---------------- const parameter is implicitly captured by this `impl Trait` | -------------- ^^^^^^^^^^^^^^^^
| |
| const parameter is implicitly captured by this `impl Trait`
| |
= note: currently, all const parameters are required to be mentioned in the precise captures list = note: currently, all const parameters are required to be mentioned in the precise captures list

View file

@ -5,8 +5,8 @@ fn type_param<T>() -> impl use<> Sized {}
//~^ ERROR `impl Trait` must mention all type parameters in scope //~^ ERROR `impl Trait` must mention all type parameters in scope
trait Foo { trait Foo {
//~^ ERROR `impl Trait` must mention all type parameters in scope
fn bar() -> impl use<> Sized; fn bar() -> impl use<> Sized;
//~^ ERROR `impl Trait` must mention all type parameters in scope
} }
fn main() {} fn main() {}

View file

@ -8,21 +8,22 @@ LL | #![feature(precise_capturing)]
= note: `#[warn(incomplete_features)]` on by default = note: `#[warn(incomplete_features)]` on by default
error: `impl Trait` must mention all type parameters in scope error: `impl Trait` must mention all type parameters in scope
--> $DIR/forgot-to-capture-type.rs:4:15 --> $DIR/forgot-to-capture-type.rs:4:23
| |
LL | fn type_param<T>() -> impl use<> Sized {} LL | fn type_param<T>() -> impl use<> Sized {}
| ^ ---------------- type parameter is implicitly captured by this `impl Trait` | - ^^^^^^^^^^^^^^^^
| |
| type parameter is implicitly captured by this `impl Trait`
| |
= note: currently, all type parameters are required to be mentioned in the precise captures list = note: currently, all type parameters are required to be mentioned in the precise captures list
error: `impl Trait` must mention all type parameters in scope error: `impl Trait` must mention all type parameters in scope
--> $DIR/forgot-to-capture-type.rs:7:1 --> $DIR/forgot-to-capture-type.rs:8:17
| |
LL | trait Foo { LL | trait Foo {
| ^^^^^^^^^ | --------- type parameter is implicitly captured by this `impl Trait`
LL |
LL | fn bar() -> impl use<> Sized; LL | fn bar() -> impl use<> Sized;
| ---------------- type parameter is implicitly captured by this `impl Trait` | ^^^^^^^^^^^^^^^^
| |
= note: currently, all type parameters are required to be mentioned in the precise captures list = note: currently, all type parameters are required to be mentioned in the precise captures list