From 60603703eaec6944341608f54f46661099a2423b Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Wed, 20 Jun 2012 20:08:25 -0700 Subject: [PATCH] handle moves in let initializers and allow moves from unsafe ptrs Related to issue #2657, but this is not a complete fix. --- src/rustc/middle/borrowck/check_loans.rs | 16 ++++++++++++++++ src/test/compile-fail/borrowck-issue-2657-1.rs | 9 +++++++++ src/test/compile-fail/borrowck-issue-2657-2.rs | 14 ++++++++++++++ .../borrowck-move-from-unsafe-ptr.rs | 7 +++++++ .../run-pass/borrowck-move-from-unsafe-ptr-ok.rs | 11 +++++++++++ 5 files changed, 57 insertions(+) create mode 100644 src/test/compile-fail/borrowck-issue-2657-1.rs create mode 100644 src/test/compile-fail/borrowck-issue-2657-2.rs create mode 100644 src/test/compile-fail/borrowck-move-from-unsafe-ptr.rs create mode 100644 src/test/run-pass/borrowck-move-from-unsafe-ptr-ok.rs diff --git a/src/rustc/middle/borrowck/check_loans.rs b/src/rustc/middle/borrowck/check_loans.rs index 572be4f2ac7..bae0f4648d2 100644 --- a/src/rustc/middle/borrowck/check_loans.rs +++ b/src/rustc/middle/borrowck/check_loans.rs @@ -47,6 +47,7 @@ fn check_loans(bccx: borrowck_ctxt, mut declared_purity: ast::impure_fn, mut fn_args: @[]}); let vt = visit::mk_vt(@{visit_expr: check_loans_in_expr, + visit_local: check_loans_in_local, visit_block: check_loans_in_block, visit_fn: check_loans_in_fn with *visit::default_visitor()}); @@ -419,6 +420,9 @@ fn check_move_out_from_cmt(cmt: cmt) { // rvalues, I guess. cat_special(sk_static_item) { } + cat_deref(_, _, unsafe_ptr) { + } + // Nothing else. _ { self.bccx.span_err( @@ -542,6 +546,18 @@ fn check_loans_in_fn(fk: visit::fn_kind, decl: ast::fn_decl, body: ast::blk, #debug["purity on exit=%?", copy self.declared_purity]; } +fn check_loans_in_local(local: @ast::local, + &&self: check_loan_ctxt, + vt: visit::vt) { + alt local.node.init { + some({op: ast::init_move, expr: expr}) { + self.check_move_out(expr); + } + some({op: ast::init_assign, _}) | none {} + } + visit::visit_local(local, self, vt); +} + fn check_loans_in_expr(expr: @ast::expr, &&self: check_loan_ctxt, vt: visit::vt) { diff --git a/src/test/compile-fail/borrowck-issue-2657-1.rs b/src/test/compile-fail/borrowck-issue-2657-1.rs new file mode 100644 index 00000000000..00c579dc45e --- /dev/null +++ b/src/test/compile-fail/borrowck-issue-2657-1.rs @@ -0,0 +1,9 @@ +fn main() { +let x = some(~1); +alt x { //! NOTE loan of immutable local variable granted here + some(y) { + let _a <- x; //! ERROR moving out of immutable local variable prohibited due to outstanding loan + } + _ {} +} +} diff --git a/src/test/compile-fail/borrowck-issue-2657-2.rs b/src/test/compile-fail/borrowck-issue-2657-2.rs new file mode 100644 index 00000000000..c9e94331ab0 --- /dev/null +++ b/src/test/compile-fail/borrowck-issue-2657-2.rs @@ -0,0 +1,14 @@ +//xfail-test + +// this should be illegal but borrowck is not handling +// pattern bindings correctly right now + +fn main() { +let x = some(~1); +alt x { + some(y) { + let b <- y; + } + _ {} +} +} diff --git a/src/test/compile-fail/borrowck-move-from-unsafe-ptr.rs b/src/test/compile-fail/borrowck-move-from-unsafe-ptr.rs new file mode 100644 index 00000000000..03fbb6b975c --- /dev/null +++ b/src/test/compile-fail/borrowck-move-from-unsafe-ptr.rs @@ -0,0 +1,7 @@ +fn foo(x: *~int) -> ~int { + let y <- *x; //! ERROR dereference of unsafe pointer requires unsafe function or block + ret y; +} + +fn main() { +} \ No newline at end of file diff --git a/src/test/run-pass/borrowck-move-from-unsafe-ptr-ok.rs b/src/test/run-pass/borrowck-move-from-unsafe-ptr-ok.rs new file mode 100644 index 00000000000..ef0803c00d0 --- /dev/null +++ b/src/test/run-pass/borrowck-move-from-unsafe-ptr-ok.rs @@ -0,0 +1,11 @@ +// just make sure this compiles: + +fn bar(x: *~int) -> ~int { + unsafe { + let y <- *x; + ret y; + } +} + +fn main() { +} \ No newline at end of file -- GitLab