@@ -885,7 +885,7 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident,
885
885
e_span: span, variants: ~[ ast:: variant] ,
886
886
-d: @ast:: expr) -> @ast:: expr {
887
887
let ext_cx = cx;
888
- let arms: ~[ ast:: arm] = do vec:: from_fn( vec:: len( variants) ) |vidx| {
888
+ let mut arms: ~[ ast:: arm] = do vec:: from_fn( vec:: len( variants) ) |vidx| {
889
889
let variant = variants[ vidx] ;
890
890
let v_span = variant. span;
891
891
let v_name = variant. node. name;
@@ -925,10 +925,19 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident,
925
925
body: cx. expr_blk( body) }
926
926
} ;
927
927
928
+ let impossible_case = { pats: ~[ @{ id: cx. next_id( ) ,
929
+ node: ast:: pat_wild,
930
+ span: e_span} ] ,
931
+ guard: none,
932
+ // FIXME #3198: proper error message
933
+ body: cx. expr_blk( cx. expr( e_span,
934
+ ast:: expr_fail( none) ) ) } ;
935
+ arms += ~[ impossible_case] ;
936
+
928
937
// Generate code like:
929
938
let e_name = cx. lit_str( e_span, e_name) ;
930
939
let alt_expr = cx. expr( e_span,
931
- ast:: expr_match( #ast{ __i} , arms, ast:: alt_check ) ) ;
940
+ ast:: expr_match( #ast{ __i} , arms, ast:: alt_exhaustive ) ) ;
932
941
let var_lambda = #ast{ |__i| $( alt_expr) } ;
933
942
let read_var = #ast{ $( cx. clone( d) ) . read_enum_variant( $( var_lambda) ) } ;
934
943
let read_lambda = cx. lambda( cx. expr_blk( read_var) ) ;
0 commit comments