diff --git a/src/comp/middle/kind.rs b/src/comp/middle/kind.rs index c5e8991f804..f4c23d3d4d7 100644 --- a/src/comp/middle/kind.rs +++ b/src/comp/middle/kind.rs @@ -183,6 +183,12 @@ fn need_shared_or_pinned_ctor(tcx: ty::ctxt, a: @ast::expr, descr: str) { ast::expr_rec(_, _) { true } + ast::expr_unary(ast::uniq(_), _) { + true + } + ast::expr_tup(_) { + true + } _ { false } } } @@ -266,14 +272,12 @@ fn check_stmt(tcx: ty::ctxt, stmt: @ast::stmt) { for (let_style, local) in locals { alt local.node.init { option::some({op: ast::init_assign., expr}) { - need_expr_kind(tcx, expr, - ast::kind_shared, - "local initializer"); + need_shared_or_pinned_ctor(tcx, expr, + "local initializer"); } option::some({op: ast::init_move., expr}) { - // FIXME: Should be as above but moving may be the - // only way available currently to assign a resource - // to a local. + need_shared_or_pinned_ctor(tcx, expr, + "local initializer"); } option::none. { /* fall through */ } } diff --git a/src/test/compile-fail/resource-let.rs b/src/test/compile-fail/resource-let.rs deleted file mode 100644 index a20aa639c15..00000000000 --- a/src/test/compile-fail/resource-let.rs +++ /dev/null @@ -1,12 +0,0 @@ -// error-pattern: mismatched kind - -resource r(b: bool) { -} - -fn main() { - // Kind analysis considers this a copy, which isn't strictly true, - // but for many assignment initializers could be. To actually - // assign a resource to a local we can still use a move - // initializer. - let i = r(true); -} \ No newline at end of file diff --git a/src/test/compile-fail/unique-pinned-nocopy-2.rs b/src/test/compile-fail/unique-pinned-nocopy-2.rs deleted file mode 100644 index 71de1196238..00000000000 --- a/src/test/compile-fail/unique-pinned-nocopy-2.rs +++ /dev/null @@ -1,8 +0,0 @@ -// error-pattern: mismatched kind - -resource r(b: bool) { -} - -fn main() { - let i = ~r(true); -} \ No newline at end of file diff --git a/src/test/run-pass/resource-assign-is-not-copy.rs b/src/test/run-pass/resource-assign-is-not-copy.rs new file mode 100644 index 00000000000..bf77ab2bcef --- /dev/null +++ b/src/test/run-pass/resource-assign-is-not-copy.rs @@ -0,0 +1,7 @@ +resource r(i: int) { +} + +fn main() { + // Even though this looks like a copy, it's guaranteed not to be + let a = r(0); +} \ No newline at end of file diff --git a/src/test/run-pass/unique-pinned-nocopy-2.rs b/src/test/run-pass/unique-pinned-nocopy-2.rs new file mode 100644 index 00000000000..92b86ad0d34 --- /dev/null +++ b/src/test/run-pass/unique-pinned-nocopy-2.rs @@ -0,0 +1,11 @@ +resource r(i: @mutable int) { + *i = *i + 1; +} + +fn main() { + let i = @mutable 0; + { + let j = ~r(i); + } + assert *i == 1; +} \ No newline at end of file