diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-08-08 10:43:44 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-08-14 22:13:25 -0700 |
| commit | 6d68658b9a9705d2e4c517d12705a2f64f20e378 (patch) | |
| tree | d674f95445aa4156f120166fbef4b834d530282e /src/libsyntax/ext | |
| parent | 9f01acacf94b119da674e8f70b828cb4a5fa6485 (diff) | |
Make autoserialize not generate alt checks
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/auto_serialize.rs | 13 |
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)); |
