From cb4e99b68809a17db5624aabbdf9189225333d85 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 28 Sep 2011 14:37:28 -0700 Subject: [PATCH] Don't allow vectors of pinned kinds Vectors of pinned kinds can't be safe because most interesting uses of vector perform copies --- src/comp/middle/kind.rs | 10 ++++++++++ src/test/compile-fail/vec-res-add.rs | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/test/compile-fail/vec-res-add.rs diff --git a/src/comp/middle/kind.rs b/src/comp/middle/kind.rs index f4c23d3d4d72..da908f55429b 100644 --- a/src/comp/middle/kind.rs +++ b/src/comp/middle/kind.rs @@ -189,6 +189,9 @@ fn need_shared_or_pinned_ctor(tcx: ty::ctxt, a: @ast::expr, descr: str) { ast::expr_tup(_) { true } + ast::expr_vec(exprs, _) { + true + } _ { false } } } @@ -262,6 +265,13 @@ fn check_expr(tcx: ty::ctxt, e: @ast::expr) { need_shared_or_pinned_ctor(tcx, expr, "tuple parameter"); } } + ast::expr_vec(exprs, _) { + // Putting pinned things into vectors is pretty useless since vector + // addition can't work (it's a copy) + for expr in exprs { + need_expr_kind(tcx, expr, ast::kind_shared, "vector element"); + } + } _ { } } } diff --git a/src/test/compile-fail/vec-res-add.rs b/src/test/compile-fail/vec-res-add.rs new file mode 100644 index 000000000000..9389d793f716 --- /dev/null +++ b/src/test/compile-fail/vec-res-add.rs @@ -0,0 +1,11 @@ +// error-pattern:mismatched kinds + +resource r(i: int) { +} + +fn main() { + // This can't make sense as it would copy the resources + let i <- [r(0)]; + let j <- [r(1)]; + let k = i + j; +} \ No newline at end of file