Skip to content

Commit a3d2882

Browse files
committed
fixup auto_serialize's treatment of nullary variants
1 parent e702d20 commit a3d2882

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

src/libstd/prettyprint.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ impl of serializer for writer {
7171
f();
7272
}
7373

74-
fn emit_enum_variant(v_name: str, _v_id: uint, _sz: uint, f: fn()) {
74+
fn emit_enum_variant(v_name: str, _v_id: uint, sz: uint, f: fn()) {
7575
self.write_str(v_name);
76-
self.write_str("(");
76+
if sz > 0u { self.write_str("("); }
7777
f();
78-
self.write_str(")");
78+
if sz > 0u { self.write_str(")"); }
7979
}
8080

8181
fn emit_enum_variant_arg(idx: uint, f: fn()) {

src/rustc/syntax/ext/auto_serialize.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -816,9 +816,16 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: str,
816816
#ast{ $(d).read_enum_variant_arg($(idx), $(body)) }
817817
};
818818

819-
let body =
820-
cx.expr(v_span, ast::expr_call(
821-
cx.var_ref(v_span, v_name), arg_exprs, false));
819+
let body = {
820+
if vec::is_empty(tys) {
821+
// for a nullary variant v, do "v"
822+
cx.var_ref(v_span, v_name)
823+
} else {
824+
// for an n-ary variant v, do "v(a_1, ..., a_n)"
825+
cx.expr(v_span, ast::expr_call(
826+
cx.var_ref(v_span, v_name), arg_exprs, false))
827+
}
828+
};
822829

823830
{pats: [@{id: cx.next_id(),
824831
node: ast::pat_lit(cx.lit_uint(v_span, vidx)),

src/test/run-pass/auto_serialize.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ enum quark<T> {
7272
#[auto_serialize]
7373
type uint_quark = quark<uint>;
7474

75+
#[auto_serialize]
76+
enum c_like { a, b, c }
77+
7578
fn main() {
7679

7780
test_ser_and_deser(plus(@minus(@val(3u), @val(10u)),
@@ -117,4 +120,16 @@ fn main() {
117120
serialize_uint_quark(_, _),
118121
deserialize_uint_quark(_),
119122
serialize_uint_quark(_, _));
123+
124+
test_ser_and_deser(a,
125+
"a",
126+
serialize_c_like(_, _),
127+
deserialize_c_like(_),
128+
serialize_c_like(_, _));
129+
130+
test_ser_and_deser(b,
131+
"b",
132+
serialize_c_like(_, _),
133+
deserialize_c_like(_),
134+
serialize_c_like(_, _));
120135
}

0 commit comments

Comments
 (0)