From 1dc13e4ad4a140ae1ac4d84e13411c7406196926 Mon Sep 17 00:00:00 2001 From: Piotr Jawniak Date: Sun, 1 Jun 2014 14:16:11 +0200 Subject: [PATCH] Fix deriving Encodable trait for unit structs Closes #14021 --- src/libsyntax/ext/deriving/encodable.rs | 8 +++++++ src/test/run-pass/issue-14021.rs | 29 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/test/run-pass/issue-14021.rs diff --git a/src/libsyntax/ext/deriving/encodable.rs b/src/libsyntax/ext/deriving/encodable.rs index d6b7e84b535..4f92dff0c59 100644 --- a/src/libsyntax/ext/deriving/encodable.rs +++ b/src/libsyntax/ext/deriving/encodable.rs @@ -175,6 +175,14 @@ fn encodable_substructure(cx: &mut ExtCtxt, trait_span: Span, stmts.push(cx.stmt_expr(call)); } + // unit structs have no fields and need to return Ok() + if stmts.is_empty() { + let ret_ok = cx.expr(trait_span, + ExprRet(Some(cx.expr_ok(trait_span, + cx.expr_lit(trait_span, LitNil))))); + stmts.push(cx.stmt_expr(ret_ok)); + } + let blk = cx.lambda_stmts_1(trait_span, stmts, blkarg); cx.expr_method_call(trait_span, encoder, diff --git a/src/test/run-pass/issue-14021.rs b/src/test/run-pass/issue-14021.rs new file mode 100644 index 00000000000..f25a1fcdab6 --- /dev/null +++ b/src/test/run-pass/issue-14021.rs @@ -0,0 +1,29 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +extern crate serialize; + +use serialize::{Encodable, Decodable}; +use serialize::json; + +#[deriving(Encodable, Decodable, PartialEq, Show)] +struct UnitLikeStruct; + +pub fn main() { + let obj = UnitLikeStruct; + let json_str: String = json::Encoder::str_encode(&obj); + + let json_object = json::from_str(json_str.as_slice()); + let mut decoder = json::Decoder::new(json_object.unwrap()); + let mut decoded_obj: UnitLikeStruct = Decodable::decode(&mut decoder).unwrap(); + + assert_eq!(obj, decoded_obj); +}