diff options
| author | bors <bors@rust-lang.org> | 2018-03-27 07:16:29 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-03-27 07:16:29 +0000 |
| commit | 14ac1b5faab32d268a85dfde6c6592b7183c5864 (patch) | |
| tree | e276b99607fbb4e812cdde3857510407ccdc2f66 /src/libsyntax_ext | |
| parent | 31ae4f9fde9b23100c26e5642030128a7e1444ef (diff) | |
| parent | ad50f3389a13d74aa0088bcb39c406193b721769 (diff) | |
| download | rust-14ac1b5faab32d268a85dfde6c6592b7183c5864.tar.gz rust-14ac1b5faab32d268a85dfde6c6592b7183c5864.zip | |
Auto merge of #49279 - varkor:generated-closure-return-type, r=alexcrichton
Fix implicit closure return type generation for libsyntax The `lambda` function for constructing closures in libsyntax was explicitly setting the return type to `_`, which resulted in incorrect corresponding syntax (as `|| -> _ x` is not valid, without the enclosing brackets). This meant the generated code, when printed, was invalid. I also took the opportunity to slightly improve the generated code for the `RustcEncodable::encode` method for unit structs. Fixes #42213.
Diffstat (limited to 'src/libsyntax_ext')
| -rw-r--r-- | src/libsyntax_ext/deriving/encodable.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax_ext/deriving/generic/mod.rs | 2 |
2 files changed, 6 insertions, 6 deletions
diff --git a/src/libsyntax_ext/deriving/encodable.rs b/src/libsyntax_ext/deriving/encodable.rs index 743f22b6b31..88baa22e7fa 100644 --- a/src/libsyntax_ext/deriving/encodable.rs +++ b/src/libsyntax_ext/deriving/encodable.rs @@ -228,13 +228,13 @@ fn encodable_substructure(cx: &mut ExtCtxt, } // unit structs have no fields and need to return Ok() - if stmts.is_empty() { + let blk = if stmts.is_empty() { let ok = cx.expr_ok(trait_span, cx.expr_tuple(trait_span, vec![])); - let ret_ok = cx.expr(trait_span, ExprKind::Ret(Some(ok))); - stmts.push(cx.stmt_expr(ret_ok)); - } + cx.lambda1(trait_span, ok, blkarg) + } else { + cx.lambda_stmts_1(trait_span, stmts, blkarg) + }; - let blk = cx.lambda_stmts_1(trait_span, stmts, blkarg); cx.expr_method_call(trait_span, encoder, cx.ident_of("emit_struct"), diff --git a/src/libsyntax_ext/deriving/generic/mod.rs b/src/libsyntax_ext/deriving/generic/mod.rs index 49c372b751b..3935f1722b6 100644 --- a/src/libsyntax_ext/deriving/generic/mod.rs +++ b/src/libsyntax_ext/deriving/generic/mod.rs @@ -962,7 +962,7 @@ impl<'a> MethodDef<'a> { let ret_type = self.get_ret_ty(cx, trait_, generics, type_ident); let method_ident = cx.ident_of(self.name); - let fn_decl = cx.fn_decl(args, ret_type); + let fn_decl = cx.fn_decl(args, ast::FunctionRetTy::Ty(ret_type)); let body_block = cx.block_expr(body); let unsafety = if self.is_unsafe { |
