Reduce verbosity of capture analysis logs
Co-authored-by: Jenny Wills <wills.jenniferg@gmail.com> Co-authored-by: Aman Arora <me@aman-arora.com>
This commit is contained in:
parent
b16815b58d
commit
825e9e45d1
34 changed files with 297 additions and 909 deletions
|
@ -46,22 +46,6 @@ use rustc_span::{Span, Symbol};
|
|||
|
||||
use std::env;
|
||||
|
||||
macro_rules! log_capture_analysis {
|
||||
($fcx:expr, $closure_def_id:expr, $fmt:literal) => {
|
||||
if $fcx.should_log_capture_analysis($closure_def_id) {
|
||||
print!("For closure={:?}: ", $closure_def_id);
|
||||
println!($fmt);
|
||||
}
|
||||
};
|
||||
|
||||
($fcx:expr, $closure_def_id:expr, $fmt:literal, $($args:expr),*) => {
|
||||
if $fcx.should_log_capture_analysis($closure_def_id) {
|
||||
print!("For closure={:?}: ", $closure_def_id);
|
||||
println!($fmt, $($args),*);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// Describe the relationship between the paths of two places
|
||||
/// eg:
|
||||
/// - foo is ancestor of foo.bar.baz
|
||||
|
@ -144,9 +128,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
let mut capture_information = FxIndexMap::<Place<'tcx>, ty::CaptureInfo<'tcx>>::default();
|
||||
if self.tcx.features().capture_disjoint_fields || matches!(env::var("SG_NEW"), Ok(_)) {
|
||||
log_capture_analysis!(self, closure_def_id, "Using new-style capture analysis");
|
||||
} else {
|
||||
log_capture_analysis!(self, closure_def_id, "Using old-style capture analysis");
|
||||
if let Some(upvars) = self.tcx.upvars_mentioned(closure_def_id) {
|
||||
for (&var_hir_id, _) in upvars.iter() {
|
||||
let place = self.place_for_root_variable(local_def_id, var_hir_id);
|
||||
|
@ -182,12 +164,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
)
|
||||
.consume_body(body);
|
||||
|
||||
log_capture_analysis!(
|
||||
self,
|
||||
closure_def_id,
|
||||
"capture information: {:#?}",
|
||||
delegate.capture_information
|
||||
debug!(
|
||||
"For closure={:?}, capture_information={:#?}",
|
||||
closure_def_id, delegate.capture_information
|
||||
);
|
||||
self.log_closure_capture_info(closure_def_id, &delegate.capture_information, span);
|
||||
|
||||
if let Some(closure_substs) = infer_kind {
|
||||
// Unify the (as yet unbound) type variable in the closure
|
||||
|
@ -206,6 +187,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
|
||||
self.compute_min_captures(closure_def_id, delegate);
|
||||
self.log_closure_min_capture_info(closure_def_id, span);
|
||||
|
||||
self.set_closure_captures(closure_def_id);
|
||||
|
||||
// Now that we've analyzed the closure, we know how each
|
||||
|
@ -333,10 +316,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
}
|
||||
debug!(
|
||||
"For closure_def_id={:?}, set_closure_captures={:#?}",
|
||||
closure_def_id, closure_captures
|
||||
);
|
||||
debug!("For closure_def_id={:?}, closure_captures={:#?}", closure_def_id, closure_captures);
|
||||
debug!(
|
||||
"For closure_def_id={:?}, upvar_capture_map={:#?}",
|
||||
closure_def_id, upvar_capture_map
|
||||
|
@ -478,12 +458,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
log_capture_analysis!(
|
||||
self,
|
||||
closure_def_id,
|
||||
"min_captures={:#?}",
|
||||
root_var_min_capture_list
|
||||
);
|
||||
debug!("For closure={:?}, min_captures={:#?}", closure_def_id, root_var_min_capture_list);
|
||||
|
||||
if !root_var_min_capture_list.is_empty() {
|
||||
self.typeck_results
|
||||
|
@ -581,6 +556,46 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn log_closure_capture_info(
|
||||
&self,
|
||||
closure_def_id: rustc_hir::def_id::DefId,
|
||||
capture_information: &FxIndexMap<Place<'tcx>, ty::CaptureInfo<'tcx>>,
|
||||
closure_span: Span,
|
||||
) {
|
||||
if self.should_log_capture_analysis(closure_def_id) {
|
||||
for (place, capture_info) in capture_information {
|
||||
let capture_str = construct_capture_info_string(self.tcx, place, capture_info);
|
||||
let output_str = format!("Capturing {}", capture_str);
|
||||
|
||||
let span = capture_info.expr_id.map_or(closure_span, |e| self.tcx.hir().span(e));
|
||||
self.tcx.sess.span_err(span, &output_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn log_closure_min_capture_info(&self, closure_def_id: DefId, closure_span: Span) {
|
||||
if self.should_log_capture_analysis(closure_def_id) {
|
||||
if let Some(min_captures) =
|
||||
self.typeck_results.borrow().closure_min_captures.get(&closure_def_id)
|
||||
{
|
||||
for (_, min_captures_for_var) in min_captures {
|
||||
for capture in min_captures_for_var {
|
||||
let place = &capture.place;
|
||||
let capture_info = &capture.info;
|
||||
|
||||
let capture_str =
|
||||
construct_capture_info_string(self.tcx, place, capture_info);
|
||||
let output_str = format!("Min Capture {}", capture_str);
|
||||
|
||||
let span =
|
||||
capture_info.expr_id.map_or(closure_span, |e| self.tcx.hir().span(e));
|
||||
self.tcx.sess.span_err(span, &output_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct InferBorrowKind<'a, 'tcx> {
|
||||
|
@ -917,6 +932,37 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn construct_capture_info_string(
|
||||
tcx: TyCtxt<'_>,
|
||||
place: &Place<'tcx>,
|
||||
capture_info: &ty::CaptureInfo<'tcx>,
|
||||
) -> String {
|
||||
let variable_name = match place.base {
|
||||
PlaceBase::Upvar(upvar_id) => var_name(tcx, upvar_id.var_path.hir_id).to_string(),
|
||||
_ => bug!("Capture_information should only contain upvars"),
|
||||
};
|
||||
|
||||
let mut projections_str = String::new();
|
||||
for (i, item) in place.projections.iter().enumerate() {
|
||||
let proj = match item.kind {
|
||||
ProjectionKind::Field(a, b) => format!("({:?}, {:?})", a, b),
|
||||
ProjectionKind::Deref => String::from("Deref"),
|
||||
ProjectionKind::Index => String::from("Index"),
|
||||
ProjectionKind::Subslice => String::from("Subslice"),
|
||||
};
|
||||
if i != 0 {
|
||||
projections_str.push_str(",");
|
||||
}
|
||||
projections_str.push_str(proj.as_str());
|
||||
}
|
||||
|
||||
let capture_kind_str = match capture_info.capture_kind {
|
||||
ty::UpvarCapture::ByValue(_) => "ByValue".into(),
|
||||
ty::UpvarCapture::ByRef(borrow) => format!("{:?}", borrow.kind),
|
||||
};
|
||||
format!("{}[{}] -> {}", variable_name, projections_str, capture_kind_str)
|
||||
}
|
||||
|
||||
fn var_name(tcx: TyCtxt<'_>, var_hir_id: hir::HirId) -> Symbol {
|
||||
tcx.hir().name(var_hir_id)
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
m[0] += 10;
|
||||
//~^ ERROR: Capturing m[] -> MutBorrow
|
||||
//~^^ ERROR: Min Capture m[] -> MutBorrow
|
||||
m[1] += 40;
|
||||
};
|
||||
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing m[] -> MutBorrow
|
||||
--> $DIR/arrays-completely-captured.rs:12:9
|
||||
|
|
||||
LL | m[0] += 10;
|
||||
| ^
|
||||
|
||||
error: Min Capture m[] -> MutBorrow
|
||||
--> $DIR/arrays-completely-captured.rs:12:9
|
||||
|
|
||||
LL | m[0] += 10;
|
||||
| ^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
For closure=DefId(0:4 ~ arrays_completely_captured[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:4 ~ arrays_completely_captured[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: [i32; 5],
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ arrays_completely_captured[317d]::main), local_id: 1 };`m`;DefId(0:4 ~ arrays_completely_captured[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ arrays_completely_captured[317d]::main),
|
||||
local_id: 12,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#6r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:4 ~ arrays_completely_captured[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ arrays_completely_captured[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: [i32; 5],
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ arrays_completely_captured[317d]::main), local_id: 1 };`m`;DefId(0:4 ~ arrays_completely_captured[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ arrays_completely_captured[317d]::main),
|
||||
local_id: 12,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#6r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -16,6 +16,8 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
println!("{}", p.x);
|
||||
//~^ ERROR: Capturing p[(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture p[(0, 0)] -> ImmBorrow
|
||||
};
|
||||
|
||||
// `c` should only capture `p.x`, therefore mutating `p.y` is allowed.
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing p[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/capture-disjoint-field-struct.rs:18:24
|
||||
|
|
||||
LL | println!("{}", p.x);
|
||||
| ^^^
|
||||
|
||||
error: Min Capture p[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/capture-disjoint-field-struct.rs:18:24
|
||||
|
|
||||
LL | println!("{}", p.x);
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
For closure=DefId(0:7 ~ capture_disjoint_field_struct[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:7 ~ capture_disjoint_field_struct[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ capture_disjoint_field_struct[317d]::main), local_id: 1 };`p`;DefId(0:7 ~ capture_disjoint_field_struct[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ capture_disjoint_field_struct[317d]::main),
|
||||
local_id: 31,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:7 ~ capture_disjoint_field_struct[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ capture_disjoint_field_struct[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ capture_disjoint_field_struct[317d]::main), local_id: 1 };`p`;DefId(0:7 ~ capture_disjoint_field_struct[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ capture_disjoint_field_struct[317d]::main),
|
||||
local_id: 31,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -11,6 +11,8 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
println!("{}", t.0);
|
||||
//~^ ERROR: Capturing t[(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture t[(0, 0)] -> ImmBorrow
|
||||
};
|
||||
|
||||
// `c` only captures t.0, therefore mutating t.1 is allowed.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error[E0658]: attributes on expressions are experimental
|
||||
--> $DIR/capture-disjoint-field-tuple.rs:8:13
|
||||
--> $DIR/capture-disjoint-field-tuple.rs:10:13
|
||||
|
|
||||
LL | let c = #[rustc_capture_analysis]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -8,7 +8,7 @@ LL | let c = #[rustc_capture_analysis]
|
|||
= help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
|
||||
|
||||
warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/capture-disjoint-field-tuple.rs:1:12
|
||||
--> $DIR/capture-disjoint-field-tuple.rs:3:12
|
||||
|
|
||||
LL | #![feature(capture_disjoint_fields)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing t[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/capture-disjoint-field-tuple.rs:13:24
|
||||
|
|
||||
LL | println!("{}", t.0);
|
||||
| ^^^
|
||||
|
||||
error: Min Capture t[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/capture-disjoint-field-tuple.rs:13:24
|
||||
|
|
||||
LL | println!("{}", t.0);
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
For closure=DefId(0:4 ~ capture_disjoint_field_tuple[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:4 ~ capture_disjoint_field_tuple[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: (i32, i32),
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ capture_disjoint_field_tuple[317d]::main), local_id: 1 };`t`;DefId(0:4 ~ capture_disjoint_field_tuple[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ capture_disjoint_field_tuple[317d]::main),
|
||||
local_id: 28,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:4 ~ capture_disjoint_field_tuple[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ capture_disjoint_field_tuple[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: (i32, i32),
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ capture_disjoint_field_tuple[317d]::main), local_id: 1 };`t`;DefId(0:4 ~ capture_disjoint_field_tuple[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ capture_disjoint_field_tuple[317d]::main),
|
||||
local_id: 28,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -9,5 +9,7 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
println!("This uses new capture analyysis to capture s={}", s);
|
||||
//~^ ERROR: Capturing s[] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture s[] -> ImmBorrow
|
||||
};
|
||||
}
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing s[] -> ImmBorrow
|
||||
--> $DIR/feature-gate-capture_disjoint_fields.rs:11:69
|
||||
|
|
||||
LL | println!("This uses new capture analyysis to capture s={}", s);
|
||||
| ^
|
||||
|
||||
error: Min Capture s[] -> ImmBorrow
|
||||
--> $DIR/feature-gate-capture_disjoint_fields.rs:11:69
|
||||
|
|
||||
LL | println!("This uses new capture analyysis to capture s={}", s);
|
||||
| ^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
For closure=DefId(0:4 ~ feature_gate_capture_disjoint_fields[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:4 ~ feature_gate_capture_disjoint_fields[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: std::string::String,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ feature_gate_capture_disjoint_fields[317d]::main), local_id: 1 };`s`;DefId(0:4 ~ feature_gate_capture_disjoint_fields[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ feature_gate_capture_disjoint_fields[317d]::main),
|
||||
local_id: 52,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#50r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:4 ~ feature_gate_capture_disjoint_fields[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ feature_gate_capture_disjoint_fields[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: std::string::String,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ feature_gate_capture_disjoint_fields[317d]::main), local_id: 1 };`s`;DefId(0:4 ~ feature_gate_capture_disjoint_fields[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ feature_gate_capture_disjoint_fields[317d]::main),
|
||||
local_id: 52,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#50r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -22,9 +22,10 @@ impl Data {
|
|||
// The closure passed to filter only captures self.filter,
|
||||
// therefore mutating self.list is allowed.
|
||||
self.list.retain(
|
||||
//~^ cannot borrow `self.list` as mutable because it is also borrowed as immutable
|
||||
#[rustc_capture_analysis]
|
||||
|v| self.filter.allowed(*v),
|
||||
//~^ ERROR: Capturing self[Deref,(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture self[Deref,(0, 0)] -> ImmBorrow
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/filter-on-struct-member.rs:1:12
|
||||
--> $DIR/filter-on-struct-member.rs:3:12
|
||||
|
|
||||
LL | #![feature(capture_disjoint_fields)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -7,22 +7,17 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error[E0502]: cannot borrow `self.list` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/filter-on-struct-member.rs:22:9
|
||||
error: Capturing self[Deref,(0, 0)] -> ImmBorrow
|
||||
--> $DIR/filter-on-struct-member.rs:26:17
|
||||
|
|
||||
LL | self.list.retain(
|
||||
| ^ ------ immutable borrow later used by call
|
||||
| _________|
|
||||
| |
|
||||
LL | |
|
||||
LL | | #[rustc_capture_analysis]
|
||||
LL | | |v| self.filter.allowed(*v),
|
||||
| | --- ---- first borrow occurs due to use of `self` in closure
|
||||
| | |
|
||||
| | immutable borrow occurs here
|
||||
LL | | );
|
||||
| |_________^ mutable borrow occurs here
|
||||
LL | |v| self.filter.allowed(*v),
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Min Capture self[Deref,(0, 0)] -> ImmBorrow
|
||||
--> $DIR/filter-on-struct-member.rs:26:17
|
||||
|
|
||||
LL | |v| self.filter.allowed(*v),
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0502`.
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
For closure=DefId(0:12 ~ filter_on_struct_member[317d]::{impl#1}::update::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:12 ~ filter_on_struct_member[317d]::{impl#1}::update::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: &mut Data,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:11 ~ filter_on_struct_member[317d]::{impl#1}::update), local_id: 1 };`self`;DefId(0:12 ~ filter_on_struct_member[317d]::{impl#1}::update::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: Data,
|
||||
kind: Deref,
|
||||
},
|
||||
Projection {
|
||||
ty: Filter,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:11 ~ filter_on_struct_member[317d]::{impl#1}::update),
|
||||
local_id: 13,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#7r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:12 ~ filter_on_struct_member[317d]::{impl#1}::update::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:11 ~ filter_on_struct_member[317d]::{impl#1}::update),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: &mut Data,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:11 ~ filter_on_struct_member[317d]::{impl#1}::update), local_id: 1 };`self`;DefId(0:12 ~ filter_on_struct_member[317d]::{impl#1}::update::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: Data,
|
||||
kind: Deref,
|
||||
},
|
||||
Projection {
|
||||
ty: Filter,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:11 ~ filter_on_struct_member[317d]::{impl#1}::update),
|
||||
local_id: 13,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#7r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -23,6 +23,8 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
let wp = &w.p;
|
||||
//~^ ERROR: Capturing w[(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture w[(0, 0)] -> ImmBorrow
|
||||
println!("{}", wp.x);
|
||||
};
|
||||
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing w[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/multilevel-path-1.rs:25:19
|
||||
|
|
||||
LL | let wp = &w.p;
|
||||
| ^^^
|
||||
|
||||
error: Min Capture w[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/multilevel-path-1.rs:25:19
|
||||
|
|
||||
LL | let wp = &w.p;
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
For closure=DefId(0:9 ~ multilevel_path_1[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:9 ~ multilevel_path_1[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Wrapper,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:8 ~ multilevel_path_1[317d]::main), local_id: 1 };`w`;DefId(0:9 ~ multilevel_path_1[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: Point,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:8 ~ multilevel_path_1[317d]::main),
|
||||
local_id: 20,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#37r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:9 ~ multilevel_path_1[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:8 ~ multilevel_path_1[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Wrapper,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:8 ~ multilevel_path_1[317d]::main), local_id: 1 };`w`;DefId(0:9 ~ multilevel_path_1[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: Point,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:8 ~ multilevel_path_1[317d]::main),
|
||||
local_id: 20,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#37r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -20,6 +20,8 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
println!("{}", w.p.x);
|
||||
//~^ ERROR: Capturing w[(0, 0),(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture w[(0, 0),(0, 0)] -> ImmBorrow
|
||||
};
|
||||
|
||||
// `c` only captures `w.p.x`, therefore it's safe to mutate `w.p.y`.
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing w[(0, 0),(0, 0)] -> ImmBorrow
|
||||
--> $DIR/multilevel-path-2.rs:22:24
|
||||
|
|
||||
LL | println!("{}", w.p.x);
|
||||
| ^^^^^
|
||||
|
||||
error: Min Capture w[(0, 0),(0, 0)] -> ImmBorrow
|
||||
--> $DIR/multilevel-path-2.rs:22:24
|
||||
|
|
||||
LL | println!("{}", w.p.x);
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
For closure=DefId(0:9 ~ multilevel_path_2[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:9 ~ multilevel_path_2[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Wrapper,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:8 ~ multilevel_path_2[317d]::main), local_id: 1 };`w`;DefId(0:9 ~ multilevel_path_2[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: Point,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:8 ~ multilevel_path_2[317d]::main),
|
||||
local_id: 35,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:9 ~ multilevel_path_2[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:8 ~ multilevel_path_2[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Wrapper,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:8 ~ multilevel_path_2[317d]::main), local_id: 1 };`w`;DefId(0:9 ~ multilevel_path_2[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: Point,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:8 ~ multilevel_path_2[317d]::main),
|
||||
local_id: 35,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -22,10 +22,18 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
println!("{}", p.x);
|
||||
//~^ ERROR: Capturing p[(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture p[(0, 0)] -> ImmBorrow
|
||||
let incr = 10;
|
||||
let mut c2 = #[rustc_capture_analysis]
|
||||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| p.y += incr;
|
||||
//~^ ERROR: Capturing p[(1, 0)] -> MutBorrow
|
||||
//~^^ ERROR: Capturing incr[] -> ImmBorrow
|
||||
//~^^^ ERROR: Min Capture p[(1, 0)] -> MutBorrow
|
||||
//~^^^^ ERROR: Min Capture incr[] -> ImmBorrow
|
||||
//~^^^^^ ERROR: Capturing p[(1, 0)] -> MutBorrow
|
||||
//~^^^^^^ ERROR: Min Capture p[(1, 0)] -> MutBorrow
|
||||
c2();
|
||||
println!("{}", p.y);
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error[E0658]: attributes on expressions are experimental
|
||||
--> $DIR/nested-closure.rs:19:18
|
||||
--> $DIR/nested-closure.rs:21:18
|
||||
|
|
||||
LL | let mut c1 = #[rustc_capture_analysis]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -8,7 +8,7 @@ LL | let mut c1 = #[rustc_capture_analysis]
|
|||
= help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: attributes on expressions are experimental
|
||||
--> $DIR/nested-closure.rs:24:22
|
||||
--> $DIR/nested-closure.rs:28:22
|
||||
|
|
||||
LL | let mut c2 = #[rustc_capture_analysis]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -17,7 +17,7 @@ LL | let mut c2 = #[rustc_capture_analysis]
|
|||
= help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
|
||||
|
||||
warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/nested-closure.rs:1:12
|
||||
--> $DIR/nested-closure.rs:3:12
|
||||
|
|
||||
LL | #![feature(capture_disjoint_fields)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -25,6 +25,54 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
error: Capturing p[(1, 0)] -> MutBorrow
|
||||
--> $DIR/nested-closure.rs:30:12
|
||||
|
|
||||
LL | || p.y += incr;
|
||||
| ^^^
|
||||
|
||||
error: Capturing incr[] -> ImmBorrow
|
||||
--> $DIR/nested-closure.rs:30:19
|
||||
|
|
||||
LL | || p.y += incr;
|
||||
| ^^^^
|
||||
|
||||
error: Min Capture p[(1, 0)] -> MutBorrow
|
||||
--> $DIR/nested-closure.rs:30:12
|
||||
|
|
||||
LL | || p.y += incr;
|
||||
| ^^^
|
||||
|
||||
error: Min Capture incr[] -> ImmBorrow
|
||||
--> $DIR/nested-closure.rs:30:19
|
||||
|
|
||||
LL | || p.y += incr;
|
||||
| ^^^^
|
||||
|
||||
error: Capturing p[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/nested-closure.rs:24:24
|
||||
|
|
||||
LL | println!("{}", p.x);
|
||||
| ^^^
|
||||
|
||||
error: Capturing p[(1, 0)] -> MutBorrow
|
||||
--> $DIR/nested-closure.rs:30:12
|
||||
|
|
||||
LL | || p.y += incr;
|
||||
| ^^^
|
||||
|
||||
error: Min Capture p[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/nested-closure.rs:24:24
|
||||
|
|
||||
LL | println!("{}", p.x);
|
||||
| ^^^
|
||||
|
||||
error: Min Capture p[(1, 0)] -> MutBorrow
|
||||
--> $DIR/nested-closure.rs:30:12
|
||||
|
|
||||
LL | || p.y += incr;
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 10 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,221 +0,0 @@
|
|||
For closure=DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 1 };`p`;DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
1,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 70,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#109r),
|
||||
),
|
||||
},
|
||||
Place {
|
||||
base_ty: i32,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 5 };`incr`;DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 72,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#110r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 1 };`p`;DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
1,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 70,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#109r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 5,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: i32,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 5 };`incr`;DefId(0:8 ~ nested_closure[317d]::main::{closure#0}::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 72,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#110r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
For closure=DefId(0:7 ~ nested_closure[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:7 ~ nested_closure[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 1 };`p`;DefId(0:7 ~ nested_closure[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 37,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#114r),
|
||||
),
|
||||
},
|
||||
Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 1 };`p`;DefId(0:7 ~ nested_closure[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
1,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 70,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#115r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:7 ~ nested_closure[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 1 };`p`;DefId(0:7 ~ nested_closure[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 37,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#114r),
|
||||
),
|
||||
},
|
||||
},
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:6 ~ nested_closure[317d]::main), local_id: 1 };`p`;DefId(0:7 ~ nested_closure[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
1,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:6 ~ nested_closure[317d]::main),
|
||||
local_id: 70,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#115r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -24,5 +24,7 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
println!("{}", pent.points[5].x);
|
||||
//~^ ERROR: Capturing pent[(0, 0)] -> ImmBorrow
|
||||
//~^^ ERROR: Min Capture pent[(0, 0)] -> ImmBorrow
|
||||
};
|
||||
}
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing pent[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/path-with-array-access.rs:26:24
|
||||
|
|
||||
LL | println!("{}", pent.points[5].x);
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: Min Capture pent[(0, 0)] -> ImmBorrow
|
||||
--> $DIR/path-with-array-access.rs:26:24
|
||||
|
|
||||
LL | println!("{}", pent.points[5].x);
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
For closure=DefId(0:10 ~ path_with_array_access[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:10 ~ path_with_array_access[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Pentagon,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:9 ~ path_with_array_access[317d]::main), local_id: 6 };`pent`;DefId(0:10 ~ path_with_array_access[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: [Point; 5],
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:9 ~ path_with_array_access[317d]::main),
|
||||
local_id: 83,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#34r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:10 ~ path_with_array_access[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:9 ~ path_with_array_access[317d]::main),
|
||||
local_id: 6,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Pentagon,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:9 ~ path_with_array_access[317d]::main), local_id: 6 };`pent`;DefId(0:10 ~ path_with_array_access[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: [Point; 5],
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:9 ~ path_with_array_access[317d]::main),
|
||||
local_id: 83,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#34r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -26,7 +26,10 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
p.x += 10;
|
||||
//~^ ERROR: Capturing p[(0, 0)] -> MutBorrow
|
||||
//~^^ ERROR: Min Capture p[] -> MutBorrow
|
||||
println!("{:?}", p);
|
||||
//~^ ERROR: Capturing p[] -> ImmBorrow
|
||||
};
|
||||
|
||||
c();
|
||||
|
|
|
@ -16,6 +16,24 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing p[(0, 0)] -> MutBorrow
|
||||
--> $DIR/simple-struct-min-capture.rs:28:9
|
||||
|
|
||||
LL | p.x += 10;
|
||||
| ^^^
|
||||
|
||||
error: Capturing p[] -> ImmBorrow
|
||||
--> $DIR/simple-struct-min-capture.rs:31:26
|
||||
|
|
||||
LL | println!("{:?}", p);
|
||||
| ^
|
||||
|
||||
error: Min Capture p[] -> MutBorrow
|
||||
--> $DIR/simple-struct-min-capture.rs:28:9
|
||||
|
|
||||
LL | p.x += 10;
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 4 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
For closure=DefId(0:4 ~ simple_struct_min_capture[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:4 ~ simple_struct_min_capture[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main), local_id: 1 };`p`;DefId(0:4 ~ simple_struct_min_capture[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: i32,
|
||||
kind: Field(
|
||||
0,
|
||||
0,
|
||||
),
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main),
|
||||
local_id: 15,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#34r),
|
||||
),
|
||||
},
|
||||
Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main), local_id: 1 };`p`;DefId(0:4 ~ simple_struct_min_capture[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main),
|
||||
local_id: 35,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(ImmBorrow, '_#35r),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:4 ~ simple_struct_min_capture[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: Point,
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main), local_id: 1 };`p`;DefId(0:4 ~ simple_struct_min_capture[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ simple_struct_min_capture[317d]::main),
|
||||
local_id: 15,
|
||||
},
|
||||
),
|
||||
capture_kind: ByRef(
|
||||
UpvarBorrow(MutBorrow, '_#34r),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
|
@ -19,6 +19,8 @@ fn main() {
|
|||
//~^ ERROR: attributes on expressions are experimental
|
||||
|| {
|
||||
let [a, b, .., e] = arr;
|
||||
//~^ ERROR: Capturing arr[Index] -> ByValue
|
||||
//~^^ ERROR: Min Capture arr[] -> ByValue
|
||||
assert_eq!(a, "A");
|
||||
assert_eq!(b, "B");
|
||||
assert_eq!(e, "E");
|
||||
|
|
|
@ -16,6 +16,18 @@ LL | #![feature(capture_disjoint_fields)]
|
|||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
error: Capturing arr[Index] -> ByValue
|
||||
--> $DIR/slice-pat.rs:21:33
|
||||
|
|
||||
LL | let [a, b, .., e] = arr;
|
||||
| ^^^
|
||||
|
||||
error: Min Capture arr[] -> ByValue
|
||||
--> $DIR/slice-pat.rs:21:33
|
||||
|
|
||||
LL | let [a, b, .., e] = arr;
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
For closure=DefId(0:5 ~ slice_pat[317d]::main::{closure#0}): Using new-style capture analysis
|
||||
For closure=DefId(0:5 ~ slice_pat[317d]::main::{closure#0}): capture information: {
|
||||
Place {
|
||||
base_ty: [std::string::String; 5],
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ slice_pat[317d]::main), local_id: 1 };`arr`;DefId(0:5 ~ slice_pat[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [
|
||||
Projection {
|
||||
ty: std::string::String,
|
||||
kind: Index,
|
||||
},
|
||||
],
|
||||
}: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ slice_pat[317d]::main),
|
||||
local_id: 179,
|
||||
},
|
||||
),
|
||||
capture_kind: ByValue(
|
||||
Some(
|
||||
$DIR/slice-pat.rs:21:33: 21:36 (#0),
|
||||
),
|
||||
),
|
||||
},
|
||||
}
|
||||
For closure=DefId(0:5 ~ slice_pat[317d]::main::{closure#0}): min_captures={
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ slice_pat[317d]::main),
|
||||
local_id: 1,
|
||||
}: [
|
||||
CapturedPlace {
|
||||
place: Place {
|
||||
base_ty: [std::string::String; 5],
|
||||
base: Upvar(
|
||||
UpvarId(HirId { owner: DefId(0:3 ~ slice_pat[317d]::main), local_id: 1 };`arr`;DefId(0:5 ~ slice_pat[317d]::main::{closure#0})),
|
||||
),
|
||||
projections: [],
|
||||
},
|
||||
info: CaptureInfo {
|
||||
expr_id: Some(
|
||||
HirId {
|
||||
owner: DefId(0:3 ~ slice_pat[317d]::main),
|
||||
local_id: 179,
|
||||
},
|
||||
),
|
||||
capture_kind: ByValue(
|
||||
Some(
|
||||
$DIR/slice-pat.rs:21:33: 21:36 (#0),
|
||||
),
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
Loading…
Add table
Reference in a new issue