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); +}