-
Notifications
You must be signed in to change notification settings - Fork 13.1k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Implement non-capturing closure to fn coercion #40025
Conversation
r? @pnkfelix (rust_highfive has picked a reviewer for you, use r? to override) |
r? @eddyb |
f0d612f
to
03b534c
Compare
@eddyb Its ready for review! |
src/librustc_trans/mir/constant.rs
Outdated
.unwrap().def_id; | ||
// Now create its substs [Closure, Tuple] | ||
let input = tcx.closure_type(def_id, substs).sig.input(0); | ||
let substs = Substs::for_item(tcx, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can just make Substs
by doing tcx.mk_substs([operand.ty, input.skip_binder()].iter().cloned())
IIRC.
src/librustc_trans/mir/rvalue.rs
Outdated
.unwrap().def_id; | ||
// Now create its substs [Closure, Tuple] | ||
let input = bcx.tcx().closure_type(def_id, substs).sig.input(0); | ||
let substs = Substs::for_item(bcx.tcx(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
|
||
let b = self.shallow_resolve(b); | ||
|
||
let node_id_a :NodeId = self.tcx.hir.as_local_node_id(def_id_a).unwrap(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Type annotations shouldn't be needed.
let sig = self.closure_type(def_id_a, substs_a).sig; | ||
let converted_sig = sig.input(0).map_bound(|v| { | ||
let params_iter = match v.sty { | ||
TypeVariants::TyTuple(params, _) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ty::TyTuple
// to | ||
// `fn(arg0,arg1,...) -> _` | ||
let sig = self.closure_type(def_id_a, substs_a).sig; | ||
let converted_sig = sig.input(0).map_bound(|v| { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I meant sig.map_bound
. Because that lets you avoid skip_binder
on output too.
|
||
fn main() { | ||
let mut a = 0u8; | ||
let foo :fn(u8) -> u8 = |v: u8| { a += v; a }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let x :T
is unidiomatic, should be let x: T
.
assert_eq!({BAR[1](&mut a); a }, 1); | ||
assert_eq!({BAR[2](&mut a); a }, 3); | ||
assert_eq!({BAR[3](&mut a); a }, 6); | ||
assert_eq!({BAR[4](&mut a); a }, 10); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
{
should be followed by a space just like }
should be preceded by one.
* use more convenient mk_substs function * remove type annotations * use map_bound one level farther outside * style improvements
@bors r+ |
📌 Commit 77f131d has been approved by |
Implement non-capturing closure to fn coercion Implements non capturing closure coercion ([RFC 1558](https://github.com/rust-lang/rfcs/blob/master/text/1558-closure-to-fn-coercion.md)). cc tracking issue rust-lang#39817
Implement non-capturing closure to fn coercion Implements non capturing closure coercion ([RFC 1558](https://github.com/rust-lang/rfcs/blob/master/text/1558-closure-to-fn-coercion.md)). cc tracking issue rust-lang#39817
Rollup of 28 pull requests - Successful merges: #39859, #39864, #39888, #39903, #39905, #39914, #39945, #39950, #39953, #39961, #39980, #39988, #39993, #39995, #40019, #40020, #40022, #40024, #40025, #40026, #40027, #40031, #40035, #40037, #40038, #40064, #40069, #40086 - Failed merges: #39927, #40008, #40047
Implements non capturing closure coercion (RFC 1558).
cc tracking issue #39817