From 84825ee3109a69e4546f66bd3547511d91a73255 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Tue, 15 Jan 2013 16:33:20 -0800 Subject: [PATCH] librustc: Make the default sigil for block lambdas `&` instead of `@`. --- src/libcore/task/spawn.rs | 2 +- src/librustc/metadata/encoder.rs | 10 ++++----- src/librustc/middle/privacy.rs | 12 +++++++---- src/librustc/middle/trans/_match.rs | 5 +++-- src/librustc/middle/trans/base.rs | 2 +- src/librustc/middle/trans/closure.rs | 21 +++++++++---------- src/librustc/middle/trans/common.rs | 10 +++++++-- src/librustc/middle/trans/monomorphize.rs | 2 +- src/librustc/middle/typeck/check/mod.rs | 2 +- src/librustc/util/common.rs | 10 +++++---- src/libsyntax/diagnostic.rs | 4 +++- src/libsyntax/ext/tt/macro_rules.rs | 4 ++-- src/libsyntax/visit.rs | 3 ++- ...ock-arg-used-as-lambda-with-illegal-cap.rs | 2 +- src/test/compile-fail/issue-1896.rs | 19 ----------------- src/test/compile-fail/issue-2149.rs | 4 +++- src/test/run-fail/unwind-closure.rs | 2 +- src/test/run-pass/cycle-collection2.rs | 6 +++--- src/test/run-pass/cycle-collection4.rs | 6 +++--- src/test/run-pass/cycle-collection5.rs | 6 +++--- src/test/run-pass/fixed-point-bind-box.rs | 4 ++-- src/test/run-pass/fixed-point-bind-unique.rs | 4 ++-- src/test/run-pass/last-use-corner-cases.rs | 2 +- 23 files changed, 70 insertions(+), 72 deletions(-) delete mode 100644 src/test/compile-fail/issue-1896.rs diff --git a/src/libcore/task/spawn.rs b/src/libcore/task/spawn.rs index 5152c3c049c..1c5531303e1 100644 --- a/src/libcore/task/spawn.rs +++ b/src/libcore/task/spawn.rs @@ -608,7 +608,7 @@ pub fn spawn_raw(opts: TaskOpts, f: fn~()) { }; if result { // Unwinding function in case any ancestral enlisting fails - let bail = |tg: TaskGroupInner| { + let bail: @fn(TaskGroupInner) = |tg| { leave_taskgroup(tg, child, false) }; // Attempt to join every ancestor group. diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 0ed32ef11c2..65002ff891b 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -66,10 +66,10 @@ export encode_def_id; type abbrev_map = map::HashMap; -type encode_inlined_item = fn@(ecx: @encode_ctxt, - ebml_w: writer::Encoder, - path: ast_map::path, - ii: ast::inlined_item); +pub type encode_inlined_item = fn@(ecx: @encode_ctxt, + ebml_w: writer::Encoder, + path: ast_map::path, + ii: ast::inlined_item); type encode_parms = { diag: span_handler, @@ -572,7 +572,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, index: @mut ~[entry]) { index.push({val: item.id, pos: ebml_w.writer.tell()}); } - let add_to_index = |copy ebml_w| add_to_index_(item, ebml_w, index); + let add_to_index: &fn() = || add_to_index_(item, ebml_w, index); debug!("encoding info for item at %s", ecx.tcx.sess.codemap.span_to_str(item.span)); diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs index 745e3f6086f..1e23dbbc51a 100644 --- a/src/librustc/middle/privacy.rs +++ b/src/librustc/middle/privacy.rs @@ -30,6 +30,7 @@ use syntax::ast_map::{node_item, node_method}; use syntax::ast_map; use syntax::ast_util::{Private, Public, has_legacy_export_attr, is_local}; use syntax::ast_util::{visibility_to_privacy}; +use syntax::codemap::span; use syntax::visit; fn check_crate(tcx: ty::ctxt, method_map: &method_map, crate: @ast::crate) { @@ -37,7 +38,7 @@ fn check_crate(tcx: ty::ctxt, method_map: &method_map, crate: @ast::crate) { let legacy_exports = has_legacy_export_attr(crate.node.attrs); // Adds structs that are privileged to this scope. - let add_privileged_items = |items: &[@ast::item]| { + let add_privileged_items: @fn(&[@ast::item]) -> int = |items| { let mut count = 0; for items.each |item| { match item.node { @@ -53,7 +54,8 @@ fn check_crate(tcx: ty::ctxt, method_map: &method_map, crate: @ast::crate) { }; // Checks that an enum variant is in scope - let check_variant = |span, enum_id| { + let check_variant: @fn(span: span, enum_id: ast::def_id) = + |span, enum_id| { let variant_info = ty::enum_variants(tcx, enum_id)[0]; let parental_privacy = if is_local(enum_id) { let parent_vis = ast_map::node_item_query(tcx.items, enum_id.node, @@ -81,7 +83,8 @@ fn check_crate(tcx: ty::ctxt, method_map: &method_map, crate: @ast::crate) { }; // Checks that a private field is in scope. - let check_field = |span, id, ident| { + let check_field: @fn(span: span, id: ast::def_id, ident: ast::ident) = + |span, id, ident| { let fields = ty::lookup_struct_fields(tcx, id); for fields.each |field| { if field.ident != ident { loop; } @@ -95,7 +98,8 @@ fn check_crate(tcx: ty::ctxt, method_map: &method_map, crate: @ast::crate) { }; // Checks that a private method is in scope. - let check_method = |span, origin: &method_origin| { + let check_method: @fn(span: span, origin: &method_origin) = + |span, origin| { match *origin { method_static(method_id) => { if method_id.crate == local_crate { diff --git a/src/librustc/middle/trans/_match.rs b/src/librustc/middle/trans/_match.rs index 9a5e4cb2176..a059a2bfa90 100644 --- a/src/librustc/middle/trans/_match.rs +++ b/src/librustc/middle/trans/_match.rs @@ -1610,8 +1610,9 @@ fn trans_match_inner(scope_cx: block, if ty::type_is_empty(tcx, t) { // Special case for empty types let fail_cx = @mut None; - Some(|| mk_fail(scope_cx, discr_expr.span, - ~"scrutinizing value that can't exist", fail_cx)) + let f: mk_fail = || mk_fail(scope_cx, discr_expr.span, + ~"scrutinizing value that can't exist", fail_cx); + Some(f) } else { None } diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index f66823c8081..9d363416be3 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2867,7 +2867,7 @@ fn fill_crate_map(ccx: @crate_ctxt, map: ValueRef) { fn crate_ctxt_to_encode_parms(cx: @crate_ctxt) -> encoder::encode_parms { // XXX: Bad copy of `c`, whatever it is. - let encode_inlined_item = + let encode_inlined_item: encoder::encode_inlined_item = |a,b,c,d| astencode::encode_inlined_item(a, b, copy c, d, cx.maps); return { diff --git a/src/librustc/middle/trans/closure.rs b/src/librustc/middle/trans/closure.rs index 09d188b6cd2..a3f07431bc8 100644 --- a/src/librustc/middle/trans/closure.rs +++ b/src/librustc/middle/trans/closure.rs @@ -427,24 +427,23 @@ fn trans_expr_fn(bcx: block, ~"expr_fn"); let llfn = decl_internal_cdecl_fn(ccx.llmod, s, llfnty); - // XXX: Bad copies. - let trans_closure_env = |proto, copy body, copy sub_path, copy decl| { + let trans_closure_env: &fn(ast::Proto) -> Result = |proto| { let cap_vars = capture::compute_capture_vars(ccx.tcx, user_id, proto, cap_clause); let ret_handle = match is_loop_body { Some(x) => x, None => None }; // XXX: Bad copy. let {llbox, cdata_ty, bcx} = build_closure(bcx, copy cap_vars, proto, ret_handle); - trans_closure(ccx, /*bad*/copy sub_path, decl, body, llfn, no_self, - /*bad*/copy bcx.fcx.param_substs, user_id, None, - |fcx| { - load_environment(fcx, cdata_ty, copy cap_vars, - ret_handle.is_some(), proto); + trans_closure(ccx, /*bad*/copy sub_path, decl, /*bad*/copy body, + llfn, no_self, /*bad*/copy bcx.fcx.param_substs, + user_id, None, |fcx| { + load_environment(fcx, cdata_ty, copy cap_vars, + ret_handle.is_some(), proto); }, |bcx| { - if is_loop_body.is_some() { - Store(bcx, C_bool(true), bcx.fcx.llretptr); - } - }); + if is_loop_body.is_some() { + Store(bcx, C_bool(true), bcx.fcx.llretptr); + } + }); rslt(bcx, llbox) }; diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 4481deec3c7..2af96f17f7d 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -444,8 +444,14 @@ fn add_clean_temp_mem(bcx: block, val: ValueRef, t: ty::t) { } fn add_clean_free(cx: block, ptr: ValueRef, heap: heap) { let free_fn = match heap { - heap_shared => |a| glue::trans_free(a, ptr), - heap_exchange => |a| glue::trans_unique_free(a, ptr) + heap_shared => { + let f: @fn(block) -> block = |a| glue::trans_free(a, ptr); + f + } + heap_exchange => { + let f: @fn(block) -> block = |a| glue::trans_unique_free(a, ptr); + f + } }; do in_scope_cx(cx) |scope_info| { scope_info.cleanups.push(clean_temp(ptr, free_fn, diff --git a/src/librustc/middle/trans/monomorphize.rs b/src/librustc/middle/trans/monomorphize.rs index 9cdbbffcef8..5aad9026814 100644 --- a/src/librustc/middle/trans/monomorphize.rs +++ b/src/librustc/middle/trans/monomorphize.rs @@ -153,7 +153,7 @@ fn monomorphic_fn(ccx: @crate_ctxt, ~[path_name((ccx.names)(ccx.sess.str_of(name)))]); let s = mangle_exported_name(ccx, /*bad*/copy pt, mono_ty); - let mk_lldecl = |/*bad*/copy s| { + let mk_lldecl = || { let lldecl = decl_internal_cdecl_fn(ccx.llmod, /*bad*/copy s, llfty); ccx.monomorphized.insert(hash_id, lldecl); lldecl diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 8365c261dec..2205eb77ef0 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -1561,7 +1561,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt, fn_ty.meta.onceness) } _ => { - (None, ast::impure_fn, ast::ProtoBox, ast::Many) + (None, ast::impure_fn, ast::ProtoBorrowed, ast::Many) } } }; diff --git a/src/librustc/util/common.rs b/src/librustc/util/common.rs index 528b997c8e6..7dbaf1a7528 100644 --- a/src/librustc/util/common.rs +++ b/src/librustc/util/common.rs @@ -58,8 +58,9 @@ fn field_exprs(fields: ~[ast::field]) -> ~[@ast::expr] { // of b -- skipping any inner loops (loop, while, loop_body) fn loop_query(b: ast::blk, p: fn@(ast::expr_) -> bool) -> bool { let rs = @mut false; - let visit_expr = - |e: @ast::expr, &&flag: @mut bool, v: visit::vt<@mut bool>| { + let visit_expr: @fn(@ast::expr, + &&flag: @mut bool, + v: visit::vt<@mut bool>) = |e, &&flag, v| { *flag |= p(e.node); match e.node { // Skip inner loops, since a break in the inner loop isn't a @@ -80,8 +81,9 @@ fn loop_query(b: ast::blk, p: fn@(ast::expr_) -> bool) -> bool { // of b -- skipping any inner loops (loop, while, loop_body) fn block_query(b: ast::blk, p: fn@(@ast::expr) -> bool) -> bool { let rs = @mut false; - let visit_expr = - |e: @ast::expr, &&flag: @mut bool, v: visit::vt<@mut bool>| { + let visit_expr: @fn(@ast::expr, + &&flag: @mut bool, + v: visit::vt<@mut bool>) = |e, &&flag, v| { *flag |= p(e); visit::visit_expr(e, flag, v) }; diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs index 7e9d257a742..6e335c318dd 100644 --- a/src/libsyntax/diagnostic.rs +++ b/src/libsyntax/diagnostic.rs @@ -213,7 +213,9 @@ fn print_diagnostic(topic: ~str, lvl: level, msg: &str) { fn collect(messages: @DVec<~str>) -> fn@(Option<(@codemap::CodeMap, span)>, &str, level) { - |_o, msg: &str, _l| { messages.push(msg.to_str()); } + let f: @fn(Option<(@codemap::CodeMap, span)>, &str, level) = + |_o, msg: &str, _l| { messages.push(msg.to_str()); }; + f } fn emit(cmsp: Option<(@codemap::CodeMap, span)>, msg: &str, lvl: level) { diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 069eb1e0d82..d68e5a34fbc 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -136,8 +136,8 @@ fn add_new_extension(cx: ext_ctxt, sp: span, name: ident, cx.span_fatal(best_fail_spot, best_fail_msg); } - let exp = |cx, sp, arg| generic_extension(cx, sp, name, - arg, lhses, rhses); + let exp: @fn(ext_ctxt, span, ~[ast::token_tree]) -> mac_result = + |cx, sp, arg| generic_extension(cx, sp, name, arg, lhses, rhses); return mr_def({ name: *cx.parse_sess().interner.get(name), diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 25ea76d9b51..4d68c982d06 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -641,7 +641,8 @@ fn mk_simple_visitor(v: simple_visitor) -> vt<()> { f(fk, decl, body, sp, id); visit_fn(fk, decl, body, sp, id, e, v); } - let visit_ty = |a,b,c| v_ty(v.visit_ty, a, b, c); + let visit_ty: @fn(@Ty, &&x: (), vt<()>) = + |a,b,c| v_ty(v.visit_ty, a, b, c); fn v_struct_field(f: fn@(@struct_field), sf: @struct_field, &&e: (), v: vt<()>) { f(sf); diff --git a/src/test/compile-fail/block-arg-used-as-lambda-with-illegal-cap.rs b/src/test/compile-fail/block-arg-used-as-lambda-with-illegal-cap.rs index 97520c0a44c..0671e804601 100644 --- a/src/test/compile-fail/block-arg-used-as-lambda-with-illegal-cap.rs +++ b/src/test/compile-fail/block-arg-used-as-lambda-with-illegal-cap.rs @@ -13,7 +13,7 @@ fn to_lambda1(f: fn@(uint) -> uint) -> fn@(uint) -> uint { } fn to_lambda2(b: fn(uint) -> uint) -> fn@(uint) -> uint { - return to_lambda1({|x| b(x)}); //~ ERROR illegal move from argument `b` + return to_lambda1(|x| b(x)); //~ ERROR illegal move from argument `b` } fn main() { diff --git a/src/test/compile-fail/issue-1896.rs b/src/test/compile-fail/issue-1896.rs deleted file mode 100644 index 2aaffe5e684..00000000000 --- a/src/test/compile-fail/issue-1896.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2012 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. - -type t = { f: fn() -> T }; - -fn f(_x: t) {} - -fn main() { - let x: t<()> = { f: { || () } }; //~ ERROR expected & closure, found @ closure - //~^ ERROR in field `f`, expected & closure, found @ closure - f(x); -} \ No newline at end of file diff --git a/src/test/compile-fail/issue-2149.rs b/src/test/compile-fail/issue-2149.rs index 8ae388a8e0d..f29afabf556 100644 --- a/src/test/compile-fail/issue-2149.rs +++ b/src/test/compile-fail/issue-2149.rs @@ -21,5 +21,7 @@ impl ~[A]: vec_monad { } } fn main() { - ["hi"].bind({|x| [x] }); //~ ERROR type `[&static/str]/1` does not implement any method in scope named `bind` + ["hi"].bind(|x| [x] ); + //~^ ERROR type `[&static/str]/1` does not implement any method in scope named `bind` + //~^^ ERROR Unconstrained region variable } diff --git a/src/test/run-fail/unwind-closure.rs b/src/test/run-fail/unwind-closure.rs index c4f99f9ba16..5d0f6bb3e04 100644 --- a/src/test/run-fail/unwind-closure.rs +++ b/src/test/run-fail/unwind-closure.rs @@ -16,6 +16,6 @@ fn f(a: @int) { fn main() { let b = @0; - let g = {|move b|f(b)}; + let g : fn@() = |move b|f(b); g(); } \ No newline at end of file diff --git a/src/test/run-pass/cycle-collection2.rs b/src/test/run-pass/cycle-collection2.rs index 80cc7863ffb..69f2995df30 100644 --- a/src/test/run-pass/cycle-collection2.rs +++ b/src/test/run-pass/cycle-collection2.rs @@ -8,13 +8,13 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -type foo = { mut z : fn@() }; +struct foo { mut z : fn@() } fn nop() { } fn nop_foo(_x : @foo) { } fn main() { - let w = @{ mut z: {||nop()} }; - let x = {||nop_foo(w)}; + let w = @foo{ mut z: || nop() }; + let x : fn@() = || nop_foo(w); w.z = x; } \ No newline at end of file diff --git a/src/test/run-pass/cycle-collection4.rs b/src/test/run-pass/cycle-collection4.rs index 1ac2bdc31e6..f7c7cdc76f5 100644 --- a/src/test/run-pass/cycle-collection4.rs +++ b/src/test/run-pass/cycle-collection4.rs @@ -8,13 +8,13 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -type foo = { mut z : fn@() }; +struct foo { mut z : fn@() } fn nop() { } fn nop_foo(_y: ~[int], _x : @foo) { } fn main() { - let w = @{ mut z: {||nop()} }; - let x = {||nop_foo(~[], w)}; + let w = @foo{ z: || nop() }; + let x : fn@() = || nop_foo(~[], w); w.z = x; } \ No newline at end of file diff --git a/src/test/run-pass/cycle-collection5.rs b/src/test/run-pass/cycle-collection5.rs index f16cf06d641..2d05de2d4fd 100644 --- a/src/test/run-pass/cycle-collection5.rs +++ b/src/test/run-pass/cycle-collection5.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -type foo = { mut z : fn@() }; +struct foo { mut z : fn@() } fn nop() { } fn nop_foo(_y: @int, _x : @foo) { } @@ -16,7 +16,7 @@ fn nop_foo(_y: @int, _x : @foo) { } fn o() -> @int { @10 } fn main() { - let w = @{ mut z: {||nop()} }; - let x = {||nop_foo(o(), w)}; + let w = @foo { mut z: || nop() }; + let x : fn@() = || nop_foo(o(), w); w.z = x; } \ No newline at end of file diff --git a/src/test/run-pass/fixed-point-bind-box.rs b/src/test/run-pass/fixed-point-bind-box.rs index a8c081b8307..d906ea6f91e 100644 --- a/src/test/run-pass/fixed-point-bind-box.rs +++ b/src/test/run-pass/fixed-point-bind-box.rs @@ -12,11 +12,11 @@ #[legacy_modes]; fn fix_help(f: extern fn(fn@(A) -> B, A) -> B, x: A) -> B { - return f({|a|fix_help(f, a)}, x); + return f( |a| fix_help(f, a), x); } fn fix(f: extern fn(fn@(A) -> B, A) -> B) -> fn@(A) -> B { - return {|a|fix_help(f, a)}; + return |a| fix_help(f, a); } fn fact_(f: fn@(&&v: int) -> int, &&n: int) -> int { diff --git a/src/test/run-pass/fixed-point-bind-unique.rs b/src/test/run-pass/fixed-point-bind-unique.rs index f01b2b082d0..06f01a67453 100644 --- a/src/test/run-pass/fixed-point-bind-unique.rs +++ b/src/test/run-pass/fixed-point-bind-unique.rs @@ -12,11 +12,11 @@ #[legacy_modes]; fn fix_help(f: extern fn(fn@(A) -> B, A) -> B, x: A) -> B { - return f({|a|fix_help(f, a)}, x); + return f(|a| fix_help(f, a), x); } fn fix(f: extern fn(fn@(A) -> B, A) -> B) -> fn@(A) -> B { - return {|a|fix_help(f, a)}; + return |a| fix_help(f, a); } fn fact_(f: fn@(&&v: int) -> int, &&n: int) -> int { diff --git a/src/test/run-pass/last-use-corner-cases.rs b/src/test/run-pass/last-use-corner-cases.rs index 1dfccac8bce..190177e53cb 100644 --- a/src/test/run-pass/last-use-corner-cases.rs +++ b/src/test/run-pass/last-use-corner-cases.rs @@ -26,7 +26,7 @@ fn main() { // Ensure function arguments and box arguments interact sanely. fn call_me(x: fn() -> int, y: ~int) { assert x() == *y; } let q = ~30; - call_me({|copy q| *q}, q); + call_me(|| *q, q); // Check that no false positives are found in loops. let mut q = ~40, p = 10;