Skip to content

Commit 1b9b322

Browse files
committed
Implement non-capturing closure to fn coercion
1 parent 8a1ce40 commit 1b9b322

File tree

19 files changed

+206
-2
lines changed

19 files changed

+206
-2
lines changed

src/librustc/middle/expr_use_visitor.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
715715
adjustment::Adjust::NeverToAny |
716716
adjustment::Adjust::ReifyFnPointer |
717717
adjustment::Adjust::UnsafeFnPointer |
718+
adjustment::Adjust::ClosureFnPointer |
718719
adjustment::Adjust::MutToConstPointer => {
719720
// Creating a closure/fn-pointer or unsizing consumes
720721
// the input and stores it into the resulting rvalue.

src/librustc/middle/mem_categorization.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
464464
adjustment::Adjust::NeverToAny |
465465
adjustment::Adjust::ReifyFnPointer |
466466
adjustment::Adjust::UnsafeFnPointer |
467+
adjustment::Adjust::ClosureFnPointer |
467468
adjustment::Adjust::MutToConstPointer |
468469
adjustment::Adjust::DerefRef {..} => {
469470
debug!("cat_expr({:?}): {:?}",

src/librustc/mir/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,9 @@ pub enum CastKind {
10221022
/// Convert unique, zero-sized type for a fn to fn()
10231023
ReifyFnPointer,
10241024

1025+
/// Convert non capturing closure to fn()
1026+
ClosureFnPointer,
1027+
10251028
/// Convert safe fn() to unsafe fn()
10261029
UnsafeFnPointer,
10271030

src/librustc/ty/adjustment.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ pub enum Adjust<'tcx> {
3333
/// Go from a safe fn pointer to an unsafe fn pointer.
3434
UnsafeFnPointer,
3535

36+
// Go from a non-capturing closure to an fn pointer.
37+
ClosureFnPointer,
38+
3639
/// Go from a mut raw pointer to a const raw pointer.
3740
MutToConstPointer,
3841

@@ -120,6 +123,7 @@ impl<'tcx> Adjustment<'tcx> {
120123

121124
Adjust::ReifyFnPointer |
122125
Adjust::UnsafeFnPointer |
126+
Adjust::ClosureFnPointer |
123127
Adjust::MutToConstPointer |
124128
Adjust::DerefRef {..} => false,
125129
}

src/librustc_mir/build/expr/as_lvalue.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
9999
ExprKind::Use { .. } |
100100
ExprKind::NeverToAny { .. } |
101101
ExprKind::ReifyFnPointer { .. } |
102+
ExprKind::ClosureFnPointer { .. } |
102103
ExprKind::UnsafeFnPointer { .. } |
103104
ExprKind::Unsize { .. } |
104105
ExprKind::Repeat { .. } |

src/librustc_mir/build/expr/as_rvalue.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
112112
let source = unpack!(block = this.as_operand(block, source));
113113
block.and(Rvalue::Cast(CastKind::UnsafeFnPointer, source, expr.ty))
114114
}
115+
ExprKind::ClosureFnPointer { source } => {
116+
let source = unpack!(block = this.as_operand(block, source));
117+
block.and(Rvalue::Cast(CastKind::ClosureFnPointer, source, expr.ty))
118+
}
115119
ExprKind::Unsize { source } => {
116120
let source = unpack!(block = this.as_operand(block, source));
117121
block.and(Rvalue::Cast(CastKind::Unsize, source, expr.ty))

src/librustc_mir/build/expr/category.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ impl Category {
7070
ExprKind::Cast { .. } |
7171
ExprKind::Use { .. } |
7272
ExprKind::ReifyFnPointer { .. } |
73+
ExprKind::ClosureFnPointer { .. } |
7374
ExprKind::UnsafeFnPointer { .. } |
7475
ExprKind::Unsize { .. } |
7576
ExprKind::Repeat { .. } |

src/librustc_mir/build/expr/into.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
244244
ExprKind::Cast { .. } |
245245
ExprKind::Use { .. } |
246246
ExprKind::ReifyFnPointer { .. } |
247+
ExprKind::ClosureFnPointer { .. } |
247248
ExprKind::UnsafeFnPointer { .. } |
248249
ExprKind::Unsize { .. } |
249250
ExprKind::Repeat { .. } |

src/librustc_mir/hair/cx/expr.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
6060
kind: ExprKind::UnsafeFnPointer { source: expr.to_ref() },
6161
};
6262
}
63+
Some((ty::adjustment::Adjust::ClosureFnPointer, adjusted_ty)) => {
64+
expr = Expr {
65+
temp_lifetime: temp_lifetime,
66+
temp_lifetime_was_shrunk: was_shrunk,
67+
ty: adjusted_ty,
68+
span: self.span,
69+
kind: ExprKind::ClosureFnPointer { source: expr.to_ref() },
70+
};
71+
}
6372
Some((ty::adjustment::Adjust::NeverToAny, adjusted_ty)) => {
6473
expr = Expr {
6574
temp_lifetime: temp_lifetime,

src/librustc_mir/hair/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ pub enum ExprKind<'tcx> {
152152
ReifyFnPointer {
153153
source: ExprRef<'tcx>,
154154
},
155+
ClosureFnPointer {
156+
source: ExprRef<'tcx>,
157+
},
155158
UnsafeFnPointer {
156159
source: ExprRef<'tcx>,
157160
},

0 commit comments

Comments
 (0)