about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2012-08-20 20:05:00 -0400
committerBen Blum <bblum@andrew.cmu.edu>2012-08-20 20:05:00 -0400
commitc321cdbac6c4ddd9fedb89e1cc8bce1569347c5a (patch)
tree8f9b80118f57c9e887e0d796544e67b1f18a177f
parent849d5649ef0c113d75bf9f9b1c3ddcd9a2508e49 (diff)
downloadrust-c321cdbac6c4ddd9fedb89e1cc8bce1569347c5a.tar.gz
rust-c321cdbac6c4ddd9fedb89e1cc8bce1569347c5a.zip
Disallow deconstructing destructing structs (fixes #3147)
-rw-r--r--src/rustc/middle/typeck/check/alt.rs6
-rw-r--r--src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs17
2 files changed, 23 insertions, 0 deletions
diff --git a/src/rustc/middle/typeck/check/alt.rs b/src/rustc/middle/typeck/check/alt.rs
index 82e8083a654..e99836e078b 100644
--- a/src/rustc/middle/typeck/check/alt.rs
+++ b/src/rustc/middle/typeck/check/alt.rs
@@ -270,6 +270,12 @@ fn check_pat(pcx: pat_ctxt, pat: @ast::pat, expected: ty::t) {
             }
         }
 
+        // Forbid pattern-matching structs with destructors.
+        if ty::has_dtor(tcx, class_id) {
+            tcx.sess.span_err(pat.span, ~"deconstructing struct not allowed \
+                                          in pattern (it has a destructor)");
+        }
+
         // Index the class fields.
         let field_map = std::map::box_str_hash();
         for class_fields.eachi |i, class_field| {
diff --git a/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs b/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs
new file mode 100644
index 00000000000..957d1c52e19
--- /dev/null
+++ b/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs
@@ -0,0 +1,17 @@
+struct X {
+    x: ~str;
+    drop {
+        error!("value: %s", self.x);
+    }
+}
+
+fn unwrap(+x: X) -> ~str {
+    let X { x: y } = x; //~ ERROR deconstructing struct not allowed in pattern
+    y
+}
+
+fn main() {
+    let x = X { x: ~"hello" };
+    let y = unwrap(x);
+    error!("contents: %s", y);
+}