about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-12-12 00:02:26 -0800
committerAlex Crichton <alex@alexcrichton.com>2013-12-14 22:56:33 -0800
commit6747d0738a88e7a94171ec7b3f42c837352bc5be (patch)
treee4c3d977e230937ec91a09b4ac8c9d3e63c18fb6
parent0f6537fed4417134d72200ab3d46b124a4f2a34c (diff)
downloadrust-6747d0738a88e7a94171ec7b3f42c837352bc5be.tar.gz
rust-6747d0738a88e7a94171ec7b3f42c837352bc5be.zip
Handle more cases in the heap lints
-rw-r--r--src/librustc/middle/lint.rs18
-rw-r--r--src/test/compile-fail/lint-heap-memory.rs16
-rw-r--r--src/test/debug-info/borrowed-struct.rs1
-rw-r--r--src/test/debug-info/box.rs1
-rw-r--r--src/test/debug-info/boxed-struct.rs1
-rw-r--r--src/test/debug-info/destructured-local.rs1
-rw-r--r--src/test/debug-info/generic-method-on-generic-struct.rs2
-rw-r--r--src/test/debug-info/managed-enum.rs2
-rw-r--r--src/test/debug-info/method-on-enum.rs1
-rw-r--r--src/test/debug-info/method-on-generic-struct.rs2
-rw-r--r--src/test/debug-info/method-on-struct.rs2
-rw-r--r--src/test/debug-info/method-on-trait.rs2
-rw-r--r--src/test/debug-info/method-on-tuple-struct.rs2
-rw-r--r--src/test/debug-info/self-in-default-method.rs2
-rw-r--r--src/test/debug-info/self-in-generic-default-method.rs2
-rw-r--r--src/test/debug-info/var-captured-in-nested-closure.rs1
-rw-r--r--src/test/debug-info/var-captured-in-stack-closure.rs1
-rw-r--r--src/test/pretty/block-disambig.rs2
18 files changed, 54 insertions, 5 deletions
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index feee3583f71..5128f90a0a5 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -770,9 +770,21 @@ fn check_heap_type(cx: &Context, span: Span, ty: ty::t) {
         let mut n_uniq = 0;
         ty::fold_ty(cx.tcx, ty, |t| {
             match ty::get(t).sty {
-              ty::ty_box(_) => n_box += 1,
-              ty::ty_uniq(_) => n_uniq += 1,
-              _ => ()
+                ty::ty_box(_) | ty::ty_estr(ty::vstore_box) |
+                ty::ty_evec(_, ty::vstore_box) |
+                ty::ty_trait(_, _, ty::BoxTraitStore, _, _) => {
+                    n_box += 1;
+                }
+                ty::ty_uniq(_) | ty::ty_estr(ty::vstore_uniq) |
+                ty::ty_evec(_, ty::vstore_uniq) |
+                ty::ty_trait(_, _, ty::UniqTraitStore, _, _) => {
+                    n_uniq += 1;
+                }
+                ty::ty_closure(ref c) if c.sigil == ast::OwnedSigil => {
+                    n_uniq += 1;
+                }
+
+                _ => ()
             };
             t
         });
diff --git a/src/test/compile-fail/lint-heap-memory.rs b/src/test/compile-fail/lint-heap-memory.rs
index b550c227898..c02da1beeb7 100644
--- a/src/test/compile-fail/lint-heap-memory.rs
+++ b/src/test/compile-fail/lint-heap-memory.rs
@@ -19,6 +19,20 @@ struct Foo {
 struct Bar { x: ~int } //~ ERROR type uses owned
 
 fn main() {
-    let _x : Bar = Bar {x : ~10};
+    let _x : Bar = Bar {x : ~10}; //~ ERROR type uses owned
+
+    @2; //~ ERROR type uses managed
+    @[1]; //~ ERROR type uses managed
+    //~^ ERROR type uses managed
+    fn f(_: @Clone) {} //~ ERROR type uses managed
+    @""; //~ ERROR type uses managed
+    //~^ ERROR type uses managed
+
+    ~2; //~ ERROR type uses owned
+    ~[1]; //~ ERROR type uses owned
+    //~^ ERROR type uses owned
+    fn g(_: ~Clone) {} //~ ERROR type uses owned
+    ~""; //~ ERROR type uses owned
     //~^ ERROR type uses owned
+    proc() {}; //~ ERROR type uses owned
 }
diff --git a/src/test/debug-info/borrowed-struct.rs b/src/test/debug-info/borrowed-struct.rs
index 42f7ffd8777..85b6fd03a27 100644
--- a/src/test/debug-info/borrowed-struct.rs
+++ b/src/test/debug-info/borrowed-struct.rs
@@ -43,6 +43,7 @@
 // debugger:print *unique_val_interior_ref_2
 // check:$10 = 26.5
 
+#[feature(managed_boxes)];
 #[allow(unused_variable)];
 
 struct SomeStruct {
diff --git a/src/test/debug-info/box.rs b/src/test/debug-info/box.rs
index 60ff5f789a8..b760126207b 100644
--- a/src/test/debug-info/box.rs
+++ b/src/test/debug-info/box.rs
@@ -22,6 +22,7 @@
 // debugger:print d->val
 // check:$4 = false
 
+#[feature(managed_boxes)];
 #[allow(unused_variable)];
 
 fn main() {
diff --git a/src/test/debug-info/boxed-struct.rs b/src/test/debug-info/boxed-struct.rs
index 47c9bd469d4..5a7eacb3eea 100644
--- a/src/test/debug-info/boxed-struct.rs
+++ b/src/test/debug-info/boxed-struct.rs
@@ -25,6 +25,7 @@
 // debugger:print managed_dtor->val
 // check:$4 = {x = 33, y = 333, z = 3333, w = 33333}
 
+#[feature(managed_boxes)];
 #[allow(unused_variable)];
 
 struct StructWithSomePadding {
diff --git a/src/test/debug-info/destructured-local.rs b/src/test/debug-info/destructured-local.rs
index cd17906623e..16498952f28 100644
--- a/src/test/debug-info/destructured-local.rs
+++ b/src/test/debug-info/destructured-local.rs
@@ -123,6 +123,7 @@
 // debugger:print *nn
 // check:$43 = 56
 
+#[feature(managed_boxes)];
 #[allow(unused_variable)];
 
 struct Struct {
diff --git a/src/test/debug-info/generic-method-on-generic-struct.rs b/src/test/debug-info/generic-method-on-generic-struct.rs
index 8eafef5ab10..80f2031b92e 100644
--- a/src/test/debug-info/generic-method-on-generic-struct.rs
+++ b/src/test/debug-info/generic-method-on-generic-struct.rs
@@ -94,6 +94,8 @@
 // check:$21 = {-16, 16.5}
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct Struct<T> {
     x: T
 }
diff --git a/src/test/debug-info/managed-enum.rs b/src/test/debug-info/managed-enum.rs
index 7be42872570..8c94f2ea970 100644
--- a/src/test/debug-info/managed-enum.rs
+++ b/src/test/debug-info/managed-enum.rs
@@ -23,7 +23,7 @@
 // check:$3 = {-9747455}
 
 #[allow(unused_variable)];
-#[feature(struct_variant)];
+#[feature(struct_variant, managed_boxes)];
 
 // The first element is to ensure proper alignment, irrespective of the machines word size. Since
 // the size of the discriminant value is machine dependent, this has be taken into account when
diff --git a/src/test/debug-info/method-on-enum.rs b/src/test/debug-info/method-on-enum.rs
index c7e60289b22..622786fcb53 100644
--- a/src/test/debug-info/method-on-enum.rs
+++ b/src/test/debug-info/method-on-enum.rs
@@ -94,6 +94,7 @@
 // check:$21 = -16
 // debugger:continue
 
+#[feature(managed_boxes)];
 #[feature(struct_variant)];
 
 enum Enum {
diff --git a/src/test/debug-info/method-on-generic-struct.rs b/src/test/debug-info/method-on-generic-struct.rs
index e4524aaffd2..99ed66cc03b 100644
--- a/src/test/debug-info/method-on-generic-struct.rs
+++ b/src/test/debug-info/method-on-generic-struct.rs
@@ -94,6 +94,8 @@
 // check:$21 = -16
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct Struct<T> {
     x: T
 }
diff --git a/src/test/debug-info/method-on-struct.rs b/src/test/debug-info/method-on-struct.rs
index 654f1db559b..9c2afadaef3 100644
--- a/src/test/debug-info/method-on-struct.rs
+++ b/src/test/debug-info/method-on-struct.rs
@@ -94,6 +94,8 @@
 // check:$21 = -16
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct Struct {
     x: int
 }
diff --git a/src/test/debug-info/method-on-trait.rs b/src/test/debug-info/method-on-trait.rs
index e6e024323c3..6b67dcc18a9 100644
--- a/src/test/debug-info/method-on-trait.rs
+++ b/src/test/debug-info/method-on-trait.rs
@@ -94,6 +94,8 @@
 // check:$21 = -16
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct Struct {
     x: int
 }
diff --git a/src/test/debug-info/method-on-tuple-struct.rs b/src/test/debug-info/method-on-tuple-struct.rs
index 0d19cf21514..46177664a11 100644
--- a/src/test/debug-info/method-on-tuple-struct.rs
+++ b/src/test/debug-info/method-on-tuple-struct.rs
@@ -94,6 +94,8 @@
 // check:$21 = -16
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct TupleStruct(int, f64);
 
 impl TupleStruct {
diff --git a/src/test/debug-info/self-in-default-method.rs b/src/test/debug-info/self-in-default-method.rs
index d1b275c9ec0..f9726c5329b 100644
--- a/src/test/debug-info/self-in-default-method.rs
+++ b/src/test/debug-info/self-in-default-method.rs
@@ -94,6 +94,8 @@
 // check:$21 = -16
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct Struct {
     x: int
 }
diff --git a/src/test/debug-info/self-in-generic-default-method.rs b/src/test/debug-info/self-in-generic-default-method.rs
index f09953487bc..1b1e0ccf652 100644
--- a/src/test/debug-info/self-in-generic-default-method.rs
+++ b/src/test/debug-info/self-in-generic-default-method.rs
@@ -94,6 +94,8 @@
 // check:$21 = {-16, 16.5}
 // debugger:continue
 
+#[feature(managed_boxes)];
+
 struct Struct {
     x: int
 }
diff --git a/src/test/debug-info/var-captured-in-nested-closure.rs b/src/test/debug-info/var-captured-in-nested-closure.rs
index c10697df899..1032356689f 100644
--- a/src/test/debug-info/var-captured-in-nested-closure.rs
+++ b/src/test/debug-info/var-captured-in-nested-closure.rs
@@ -49,6 +49,7 @@
 // check:$14 = 8
 // debugger:continue
 
+#[feature(managed_boxes)];
 #[allow(unused_variable)];
 
 struct Struct {
diff --git a/src/test/debug-info/var-captured-in-stack-closure.rs b/src/test/debug-info/var-captured-in-stack-closure.rs
index cbbb8cbbb12..53287a8511b 100644
--- a/src/test/debug-info/var-captured-in-stack-closure.rs
+++ b/src/test/debug-info/var-captured-in-stack-closure.rs
@@ -28,6 +28,7 @@
 // debugger:print managed->val
 // check:$6 = 7
 
+#[feature(managed_boxes)];
 #[allow(unused_variable)];
 
 struct Struct {
diff --git a/src/test/pretty/block-disambig.rs b/src/test/pretty/block-disambig.rs
index 5cc8f6e6edc..8d6eaef8b34 100644
--- a/src/test/pretty/block-disambig.rs
+++ b/src/test/pretty/block-disambig.rs
@@ -12,6 +12,8 @@
 // previously ambiguous (e.g. 'if true { } *val;' gets parsed as a
 // binop)
 
+#[feature(managed_boxes)];
+
 fn test1() { let val = @0; { } *val; }
 
 fn test2() -> int { let val = @0; { } *val }