diff --git a/src/libstd/prettyprint.rs b/src/libstd/prettyprint.rs index 10d971ff0f20..497ed8f0c063 100644 --- a/src/libstd/prettyprint.rs +++ b/src/libstd/prettyprint.rs @@ -71,11 +71,11 @@ impl of serializer for writer { f(); } - fn emit_enum_variant(v_name: str, _v_id: uint, _sz: uint, f: fn()) { + fn emit_enum_variant(v_name: str, _v_id: uint, sz: uint, f: fn()) { self.write_str(v_name); - self.write_str("("); + if sz > 0u { self.write_str("("); } f(); - self.write_str(")"); + if sz > 0u { self.write_str(")"); } } fn emit_enum_variant_arg(idx: uint, f: fn()) { diff --git a/src/rustc/syntax/ext/auto_serialize.rs b/src/rustc/syntax/ext/auto_serialize.rs index 44db1b1e1018..23a5b18fe7ff 100644 --- a/src/rustc/syntax/ext/auto_serialize.rs +++ b/src/rustc/syntax/ext/auto_serialize.rs @@ -816,9 +816,16 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: str, #ast{ $(d).read_enum_variant_arg($(idx), $(body)) } }; - let body = - cx.expr(v_span, ast::expr_call( - cx.var_ref(v_span, v_name), arg_exprs, false)); + let body = { + if vec::is_empty(tys) { + // for a nullary variant v, do "v" + cx.var_ref(v_span, v_name) + } else { + // for an n-ary variant v, do "v(a_1, ..., a_n)" + cx.expr(v_span, ast::expr_call( + cx.var_ref(v_span, v_name), arg_exprs, false)) + } + }; {pats: [@{id: cx.next_id(), node: ast::pat_lit(cx.lit_uint(v_span, vidx)), diff --git a/src/test/run-pass/auto_serialize.rs b/src/test/run-pass/auto_serialize.rs index eabe25697d94..59557465932a 100644 --- a/src/test/run-pass/auto_serialize.rs +++ b/src/test/run-pass/auto_serialize.rs @@ -72,6 +72,9 @@ enum quark { #[auto_serialize] type uint_quark = quark; +#[auto_serialize] +enum c_like { a, b, c } + fn main() { test_ser_and_deser(plus(@minus(@val(3u), @val(10u)), @@ -117,4 +120,16 @@ fn main() { serialize_uint_quark(_, _), deserialize_uint_quark(_), serialize_uint_quark(_, _)); + + test_ser_and_deser(a, + "a", + serialize_c_like(_, _), + deserialize_c_like(_), + serialize_c_like(_, _)); + + test_ser_and_deser(b, + "b", + serialize_c_like(_, _), + deserialize_c_like(_), + serialize_c_like(_, _)); } \ No newline at end of file