Disallow deconstructing destructing structs (fixes #3147)
This commit is contained in:
@@ -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.
|
// Index the class fields.
|
||||||
let field_map = std::map::box_str_hash();
|
let field_map = std::map::box_str_hash();
|
||||||
for class_fields.eachi |i, class_field| {
|
for class_fields.eachi |i, class_field| {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user