diff options
| author | Ben Blum <bblum@andrew.cmu.edu> | 2012-08-20 20:05:00 -0400 |
|---|---|---|
| committer | Ben Blum <bblum@andrew.cmu.edu> | 2012-08-20 20:05:00 -0400 |
| commit | c321cdbac6c4ddd9fedb89e1cc8bce1569347c5a (patch) | |
| tree | 8f9b80118f57c9e887e0d796544e67b1f18a177f | |
| parent | 849d5649ef0c113d75bf9f9b1c3ddcd9a2508e49 (diff) | |
| download | rust-c321cdbac6c4ddd9fedb89e1cc8bce1569347c5a.tar.gz rust-c321cdbac6c4ddd9fedb89e1cc8bce1569347c5a.zip | |
Disallow deconstructing destructing structs (fixes #3147)
| -rw-r--r-- | src/rustc/middle/typeck/check/alt.rs | 6 | ||||
| -rw-r--r-- | src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs | 17 |
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); +} |
