Skip to content

Commit f08626b

Browse files
committed
Emit destructor invocation in FnOnce shim for Fn/FnMut
- Fixes #29946
1 parent 3623797 commit f08626b

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

src/librustc_trans/trans/closure.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ fn trans_fn_once_adapter_shim<'a, 'tcx>(
421421
}
422422
}, ArgVals(&llargs[(self_idx + 1)..]), dest).bcx;
423423

424-
fcx.pop_custom_cleanup_scope(self_scope);
424+
fcx.pop_and_trans_custom_cleanup_scope(bcx, self_scope);
425425

426426
finish_fn(&fcx, bcx, sig.output, DebugLoc::None);
427427

src/test/run-pass/issue-29948.rs

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct Foo<'a>(&'a mut bool);
12+
13+
impl<'a> Drop for Foo<'a> {
14+
fn drop(&mut self) {
15+
*self.0 = true;
16+
}
17+
}
18+
19+
fn f<T: FnOnce()>(t: T) {
20+
t()
21+
}
22+
23+
fn main() {
24+
let mut ran_drop = false;
25+
{
26+
let x = Foo(&mut ran_drop);
27+
let x = move || { let _ = x; };
28+
f(x);
29+
}
30+
assert!(ran_drop);
31+
}
32+

0 commit comments

Comments
 (0)