From d8f6e9f23736f6a12dfa028d22557d1360648234 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 23 Sep 2011 16:08:30 -0700 Subject: [PATCH] Add let destructuring for unique boxes Issue #409 --- src/comp/middle/check_alt.rs | 1 + src/comp/middle/trans_alt.rs | 4 ++++ src/test/run-pass/unique-destructure.rs | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 src/test/run-pass/unique-destructure.rs diff --git a/src/comp/middle/check_alt.rs b/src/comp/middle/check_alt.rs index 6d279b4f075..52d9755108f 100644 --- a/src/comp/middle/check_alt.rs +++ b/src/comp/middle/check_alt.rs @@ -120,6 +120,7 @@ fn is_refutable(tcx: ty::ctxt, pat: @pat) -> bool { pat_wild. | pat_bind(_) { ret false; } pat_lit(_) { ret true; } pat_box(sub) { ret is_refutable(tcx, sub); } + pat_uniq(sub) { ret is_refutable(tcx, sub); } pat_rec(fields, _) { for field: field_pat in fields { if is_refutable(tcx, field.pat) { ret true; } diff --git a/src/comp/middle/trans_alt.rs b/src/comp/middle/trans_alt.rs index 6c1c2c92a0e..9afc3f6819c 100644 --- a/src/comp/middle/trans_alt.rs +++ b/src/comp/middle/trans_alt.rs @@ -656,6 +656,10 @@ fn bind_irrefutable_pat(bcx: @block_ctxt, pat: @ast::pat, val: ValueRef, [C_int(0), C_int(back::abi::box_rc_field_body)]); bcx = bind_irrefutable_pat(bcx, inner, unboxed, table, true); } + ast::pat_uniq(inner) { + let val = Load(bcx, val); + bcx = bind_irrefutable_pat(bcx, inner, val, table, true); + } ast::pat_wild. | ast::pat_lit(_) { } } ret bcx; diff --git a/src/test/run-pass/unique-destructure.rs b/src/test/run-pass/unique-destructure.rs new file mode 100644 index 00000000000..5c1a0c473bf --- /dev/null +++ b/src/test/run-pass/unique-destructure.rs @@ -0,0 +1,4 @@ +fn main() { + let ~{a, b} = ~{a: 100, b: 200}; + assert a + b == 300; +} \ No newline at end of file -- GitLab