Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add test comparing free region to bound region
suggested by arielb1
- Loading branch information
1 parent
86e7b5c
commit 4703770
Showing
2 changed files
with
128 additions
and
0 deletions.
There are no files selected for viewing
53 changes: 53 additions & 0 deletions
53
...l/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// Test a case where we setup relationships like `'x: 'a` or `'a: 'x`, | ||
// where `'x` is bound in closure type but `'a` is free. This forces | ||
// us to approximate `'x` one way or the other. | ||
|
||
// compile-flags:-Znll -Zborrowck=mir -Zverbose | ||
|
||
#![feature(rustc_attrs)] | ||
|
||
use std::cell::Cell; | ||
|
||
fn foo<'a, F>(_cell: Cell<&'a u32>, _f: F) | ||
where | ||
F: for<'x> FnOnce(Cell<&'a u32>, Cell<&'x u32>), | ||
{ | ||
} | ||
|
||
#[rustc_regions] | ||
fn case1() { | ||
let a = 0; | ||
let cell = Cell::new(&a); | ||
foo(cell, |cell_a, cell_x| { | ||
//~^ WARNING not reporting region error due to -Znll | ||
cell_a.set(cell_x.get()); // forces 'x: 'a, error in closure | ||
//~^ ERROR free region `'_#2r` does not outlive free region `'_#1r` | ||
}) | ||
} | ||
|
||
#[rustc_regions] | ||
fn case2() { | ||
let a = 0; | ||
let cell = Cell::new(&a); | ||
|
||
// As you can see in the stderr output, this closure propoagates a | ||
// requirement that `'a: 'static'. | ||
// | ||
// FIXME(#45827) However, because of shortcomings in the MIR type | ||
// checker, this does not result in errors later on (yet). | ||
foo(cell, |cell_a, cell_x| { | ||
cell_x.set(cell_a.get()); // forces 'a: 'x, implies 'a = 'static -> borrow error | ||
}) | ||
} | ||
|
||
fn main() { } |
75 changes: 75 additions & 0 deletions
75
...osure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
warning: not reporting region error due to -Znll | ||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:31:5 | ||
| | ||
31 | foo(cell, |cell_a, cell_x| { | ||
| ^^^ | ||
|
||
error: free region `'_#2r` does not outlive free region `'_#1r` | ||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:33:9 | ||
| | ||
33 | cell_a.set(cell_x.get()); // forces 'x: 'a, error in closure | ||
| ^^^^^^ | ||
|
||
note: External requirements | ||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:31:15 | ||
| | ||
31 | foo(cell, |cell_a, cell_x| { | ||
| _______________^ | ||
32 | | //~^ WARNING not reporting region error due to -Znll | ||
33 | | cell_a.set(cell_x.get()); // forces 'x: 'a, error in closure | ||
34 | | //~^ ERROR free region `'_#2r` does not outlive free region `'_#1r` | ||
35 | | }) | ||
| |_____^ | ||
| | ||
= note: defining type: DefId(0/1:12 ~ propagate_approximated_shorter_to_static_comparing_against_free[317d]::case1[0]::{{closure}}[0]) with closure substs [ | ||
i32, | ||
for<'r> extern "rust-call" fn((std::cell::Cell<&'_#1r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex { depth: 1 }, BrNamed(crate0:DefIndex(0:0), 'r)) u32>)) | ||
] | ||
= note: number of external vids: 2 | ||
|
||
note: No external requirements | ||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:28:1 | ||
| | ||
28 | / fn case1() { | ||
29 | | let a = 0; | ||
30 | | let cell = Cell::new(&a); | ||
31 | | foo(cell, |cell_a, cell_x| { | ||
... | | ||
35 | | }) | ||
36 | | } | ||
| |_^ | ||
| | ||
= note: defining type: DefId(0/0:5 ~ propagate_approximated_shorter_to_static_comparing_against_free[317d]::case1[0]) with substs [] | ||
|
||
note: External requirements | ||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:48:15 | ||
| | ||
48 | foo(cell, |cell_a, cell_x| { | ||
| _______________^ | ||
49 | | cell_x.set(cell_a.get()); // forces 'a: 'x, implies 'a = 'static -> borrow error | ||
50 | | }) | ||
| |_____^ | ||
| | ||
= note: defining type: DefId(0/1:13 ~ propagate_approximated_shorter_to_static_comparing_against_free[317d]::case2[0]::{{closure}}[0]) with closure substs [ | ||
i32, | ||
for<'r> extern "rust-call" fn((std::cell::Cell<&'_#1r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex { depth: 1 }, BrNamed(crate0:DefIndex(0:0), 'r)) u32>)) | ||
] | ||
= note: number of external vids: 2 | ||
= note: where '_#1r: '_#0r | ||
|
||
note: No external requirements | ||
--> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:39:1 | ||
| | ||
39 | / fn case2() { | ||
40 | | let a = 0; | ||
41 | | let cell = Cell::new(&a); | ||
42 | | | ||
... | | ||
50 | | }) | ||
51 | | } | ||
| |_^ | ||
| | ||
= note: defining type: DefId(0/0:6 ~ propagate_approximated_shorter_to_static_comparing_against_free[317d]::case2[0]) with substs [] | ||
|
||
error: aborting due to previous error | ||
|