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.
This commit is contained in:
commit
14ac1b5faa
5 changed files with 13 additions and 13 deletions
|
@ -145,7 +145,7 @@ impl<'a> AllocFnFactory<'a> {
|
|||
let result = self.call_allocator(method.name, args);
|
||||
let (output_ty, output_expr) =
|
||||
self.ret_ty(&method.output, &mut abi_args, mk, result);
|
||||
let kind = ItemKind::Fn(self.cx.fn_decl(abi_args, output_ty),
|
||||
let kind = ItemKind::Fn(self.cx.fn_decl(abi_args, ast::FunctionRetTy::Ty(output_ty)),
|
||||
Unsafety::Unsafe,
|
||||
dummy_spanned(Constness::NotConst),
|
||||
Abi::Rust,
|
||||
|
|
|
@ -214,7 +214,7 @@ pub trait AstBuilder {
|
|||
|
||||
fn arg(&self, span: Span, name: Ident, ty: P<ast::Ty>) -> ast::Arg;
|
||||
// FIXME unused self
|
||||
fn fn_decl(&self, inputs: Vec<ast::Arg> , output: P<ast::Ty>) -> P<ast::FnDecl>;
|
||||
fn fn_decl(&self, inputs: Vec<ast::Arg> , output: ast::FunctionRetTy) -> P<ast::FnDecl>;
|
||||
|
||||
fn item_fn_poly(&self,
|
||||
span: Span,
|
||||
|
@ -924,7 +924,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
|||
-> P<ast::Expr> {
|
||||
let fn_decl = self.fn_decl(
|
||||
ids.iter().map(|id| self.arg(span, *id, self.ty_infer(span))).collect(),
|
||||
self.ty_infer(span));
|
||||
ast::FunctionRetTy::Default(span));
|
||||
|
||||
// FIXME -- We are using `span` as the span of the `|...|`
|
||||
// part of the lambda, but it probably (maybe?) corresponds to
|
||||
|
@ -970,10 +970,10 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
|||
}
|
||||
|
||||
// FIXME unused self
|
||||
fn fn_decl(&self, inputs: Vec<ast::Arg>, output: P<ast::Ty>) -> P<ast::FnDecl> {
|
||||
fn fn_decl(&self, inputs: Vec<ast::Arg>, output: ast::FunctionRetTy) -> P<ast::FnDecl> {
|
||||
P(ast::FnDecl {
|
||||
inputs,
|
||||
output: ast::FunctionRetTy::Ty(output),
|
||||
output,
|
||||
variadic: false
|
||||
})
|
||||
}
|
||||
|
@ -1003,7 +1003,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
|||
self.item(span,
|
||||
name,
|
||||
Vec::new(),
|
||||
ast::ItemKind::Fn(self.fn_decl(inputs, output),
|
||||
ast::ItemKind::Fn(self.fn_decl(inputs, ast::FunctionRetTy::Ty(output)),
|
||||
ast::Unsafety::Normal,
|
||||
dummy_spanned(ast::Constness::NotConst),
|
||||
Abi::Rust,
|
||||
|
|
|
@ -547,7 +547,7 @@ fn mk_main(cx: &mut TestCtxt) -> P<ast::Item> {
|
|||
// pub fn main() { ... }
|
||||
let main_ret_ty = ecx.ty(sp, ast::TyKind::Tup(vec![]));
|
||||
let main_body = ecx.block(sp, vec![call_test_main]);
|
||||
let main = ast::ItemKind::Fn(ecx.fn_decl(vec![], main_ret_ty),
|
||||
let main = ast::ItemKind::Fn(ecx.fn_decl(vec![], ast::FunctionRetTy::Ty(main_ret_ty)),
|
||||
ast::Unsafety::Normal,
|
||||
dummy_spanned(ast::Constness::NotConst),
|
||||
::abi::Abi::Rust, ast::Generics::default(), main_body);
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue