about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-09-28 14:37:28 -0700
committerBrian Anderson <banderson@mozilla.com>2011-09-28 15:35:21 -0700
commitcb4e99b68809a17db5624aabbdf9189225333d85 (patch)
tree05cb947d09288074da6f9dd6a77a98da9980b56a /src
parent14bac217b0cfc5e1640a739605e3c3d7e33525c4 (diff)
Don't allow vectors of pinned kinds
Vectors of pinned kinds can't be safe because most interesting uses of vector
perform copies
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/kind.rs10
-rw-r--r--src/test/compile-fail/vec-res-add.rs11
2 files changed, 21 insertions, 0 deletions
diff --git a/src/comp/middle/kind.rs b/src/comp/middle/kind.rs
index f4c23d3d4d7..da908f55429 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 00000000000..9389d793f71
--- /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