about summary refs log tree commit diff
path: root/src/libsyntax/ext
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-08-08 10:43:44 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-08-14 22:13:25 -0700
commit6d68658b9a9705d2e4c517d12705a2f64f20e378 (patch)
treed674f95445aa4156f120166fbef4b834d530282e /src/libsyntax/ext
parent9f01acacf94b119da674e8f70b828cb4a5fa6485 (diff)
Make autoserialize not generate alt checks
Diffstat (limited to 'src/libsyntax/ext')
-rw-r--r--src/libsyntax/ext/auto_serialize.rs13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/libsyntax/ext/auto_serialize.rs b/src/libsyntax/ext/auto_serialize.rs
index c93dccda034..1fc77bae8bf 100644
--- a/src/libsyntax/ext/auto_serialize.rs
+++ b/src/libsyntax/ext/auto_serialize.rs
@@ -885,7 +885,7 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident,
               e_span: span, variants: ~[ast::variant],
               -d: @ast::expr) -> @ast::expr {
     let ext_cx = cx;
-    let arms: ~[ast::arm] = do vec::from_fn(vec::len(variants)) |vidx| {
+    let mut arms: ~[ast::arm] = do vec::from_fn(vec::len(variants)) |vidx| {
         let variant = variants[vidx];
         let v_span = variant.span;
         let v_name = variant.node.name;
@@ -925,10 +925,19 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident,
          body: cx.expr_blk(body)}
     };
 
+    let impossible_case = {pats: ~[@{id: cx.next_id(),
+                                     node: ast::pat_wild,
+                                     span: e_span}],
+                        guard: none,
+                        // FIXME #3198: proper error message
+                           body: cx.expr_blk(cx.expr(e_span,
+                                                     ast::expr_fail(none)))};
+    arms += ~[impossible_case];
+
     // Generate code like:
     let e_name = cx.lit_str(e_span, e_name);
     let alt_expr = cx.expr(e_span,
-                           ast::expr_match(#ast{__i}, arms, ast::alt_check));
+                   ast::expr_match(#ast{__i}, arms, ast::alt_exhaustive));
     let var_lambda = #ast{ |__i| $(alt_expr) };
     let read_var = #ast{ $(cx.clone(d)).read_enum_variant($(var_lambda)) };
     let read_lambda = cx.lambda(cx.expr_blk(read_var));