Negative coverage: access_permitted / access_permitted / premise if match access.kind { AccessKind::Write => check_place_writable(&state, &access.place.to_place_expression()), AccessKind::Read \| AccessKind::Move => check_place_initialized(&state, &access.place.to_place_expression()), }
Premise at line 874. Observed failure causes: if_false.
access_permitted| Line | Coverage | Source |
|---|---|---|
| 874 | 15 | (if match access.kind { AccessKind::Write => check_place_writable(&state, &access.place.to_place_expression()), AccessKind::Read | AccessKind::Move => check_place_initialized(&state, &access.place.to_place_expression()), }) |
| 878 | 24 | (access_permitted_by_loans(env, assumptions, state, access, places_live_after_access) => state) |
| ──────── ("access_permitted") | ||
| 880 | 103 | (access_permitted(env, assumptions, state, access, places_live_after_access) => state) |
15 tests failed proving this premise:
Source location: src/test_util.rs:464 (all coverage from this test)
#[test]
fn borrowck_err_checks_rustc_err_once() {
let before = rustc_runs();
FormalityTest::new(MOVED)
.rustc_err(expect_test::expect![[r#"
error[E0382]: use of moved value: `x`
--> lib.rs
|
6 | let mut x: Datum = Datum { value: 0_u32 };
| ----- move occurs because `x` has type `Datum`, which does not implement the `Copy` trait
7 | let mut y: Datum = x;
| - value moved here
8 | let mut z: Datum = x;
| ^ value used here after move
|
note: if `Datum` implemented `Clone`, you could clone the value
--> lib.rs
|
1 | pub struct Datum {
| ^^^^^^^^^^^^^^^^ consider implementing `Clone` for this type
...
7 | let mut y: Datum = x;
| - you could clone this value
For more information about this error, try `rustc --explain E0382`.
error: could not compile `Foo` (lib) due to 1 previous error
"#]])
.borrowck_err(BorrowCheckFailure::All, expect_test::expect![[r#"
the rule "access_permitted" at (nll.rs) failed because
condition evaluated to false: `match access.kind
{
AccessKind::Write =>
check_place_writable(&state, &access.place.to_place_expression()),
AccessKind::Read | AccessKind::Move =>
check_place_initialized(&state, &access.place.to_place_expression()),
}`"#]]);
assert_eq!(rustc_runs() - before, 1);
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "let"nll.rs:189borrow_check_expr_has_ty failednll.rs:350args
rule "block"nll.rs:363borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: src/test_util.rs:479 (all coverage from this test)
#[test]
#[should_panic(expected = "expected `rustc` to succeed but it failed")]
fn borrowck_err_enforces_rustc_ok() {
FormalityTest::new(MOVED).rustc_ok().borrowck_err(
BorrowCheckFailure::All,
expect_test::expect![[r#"
the rule "access_permitted" at (nll.rs) failed because
condition evaluated to false: `match access.kind
{
AccessKind::Write =>
check_place_writable(&state, &access.place.to_place_expression()),
AccessKind::Read | AccessKind::Move =>
check_place_initialized(&state, &access.place.to_place_expression()),
}`"#]],
);
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "let"nll.rs:189borrow_check_expr_has_ty failednll.rs:350args
rule "block"nll.rs:363borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:124 (all coverage from this test)
fn foo() -> u32 {
let x: u32;
return x;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "return"nll.rs:282borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:172 (all coverage from this test)
fn foo() -> Datum {
let x: Datum = Datum { value: 0_u32 };
let y: Datum = x;
let z: Datum = x;
return z;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "let"nll.rs:189borrow_check_expr_has_ty failednll.rs:350args
rule "block"nll.rs:363borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:240 (all coverage from this test)
fn foo() -> u32 {
let x: u32;
if true {
x = 1_u32;
} else {
}
return x;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "return"nll.rs:282borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:342 (all coverage from this test)
fn foo() -> u32 {
let x: u32;
if true {
x = 1_u32;
}
return x;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "return"nll.rs:282borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:393 (all coverage from this test)
fn foo() -> Datum {
let x: Datum = Datum { value: 0_u32 };
if true {
let y: Datum = x;
}
let z: Datum = x;
return z;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "let"nll.rs:189borrow_check_expr_has_ty failednll.rs:350args
rule "block"nll.rs:363borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:446 (all coverage from this test)
fn foo() -> u32 {
let x: Pair;
x.first = 1_u32;
return 0_u32;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "expr"nll.rs:232borrow_check_expr failednll.rs:371args
rule "assign"nll.rs:416access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:532 (all coverage from this test)
fn foo() -> u32 {
let x: Pair = Pair {
first: Datum { value: 1_u32 },
second: Datum { value: 2_u32 },
};
let a: Datum = x.first;
let b: Pair = x;
return 0_u32;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "let"nll.rs:189borrow_check_expr_has_ty failednll.rs:350args
rule "block"nll.rs:363borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:580 (all coverage from this test)
fn foo() -> Datum {
let x: Pair = Pair {
first: Datum { value: 1_u32 },
second: Datum { value: 2_u32 },
};
let a: Datum = x.first;
let b: Datum = x.first;
return b;
}
Failed proof tree
check_all_crates failedmod.rs:42args
rule "check all prefixes"mod.rs:54check_crate failedmod.rs:61args
rule "check crate"mod.rs:74check_crate_item failedmod.rs:179rule "free fn"mod.rs:207check_free_fn failedfns.rs:14args
rule "check free fn"fns.rs:24check_fn failedfns.rs:31args
rule "check fn"fns.rs:54check_fn_body failedfns.rs:61args
rule "expr fn body"fns.rs:89borrow_check failednll.rs:124args
rule "borrow_check"nll.rs:135borrow_check_block failednll.rs:142rule "basic block"nll.rs:157borrow_check_statement failednll.rs:174args
rule "let"nll.rs:189borrow_check_expr_has_ty failednll.rs:350args
rule "block"nll.rs:363borrow_check_expr failednll.rs:371args
rule "place"nll.rs:547access_permitted failednll.rs:862args
rule "access_permitted"nll.rs:874 (failed: if_false)
Source location: tests/borrowck.rs:628 (all coverage from this test)
fn foo() -> Datum {
let x: Pair = Pair {
first: Datum { value: 1_u32 },
second: Datum { value: 2_u32 },
};
let a: Pair = x;
let b: Datum = x.first;
return b;
}
Proof trees omitted for the remaining 5 tests; each one is on its test’s page in Coverage by test.
Source location: tests/borrowck.rs:672 (all coverage from this test)
fn foo() -> u32 {
let x: Outer = Outer {
foo: Inner { bar: 1_u32 },
};
let a: Inner = x.foo;
let b: u32 = x.foo.bar;
return b;
}
Source location: tests/borrowck.rs:2301 (all coverage from this test)
fn foo() -> u32 {
let x: u32;
return x;
}
Source location: tests/borrowck.rs:3030 (all coverage from this test)
fn foo() -> i32 {
exists<'r0, 'r1> {
let x: i32 = 0_i32;
let r: &'r0 i32;
'a: loop {
r; // this *may* read from `y` in a previous iteration
let y: i32 = 0_i32;
r = &'r1 y;
continue 'a;
}
}
}
Source location: tests/borrowck.rs:5096 (all coverage from this test)
fn foo() -> () {
let x: u32;
x += 1_u32;
}