Skip to content

Commit b20882b

Browse files
authored
Fix horrible sneaky use-of-temporary-after-destruction in SWIFT_DEFER. (#7851)
Caught by ASan's new use-after-scope checking!
1 parent babf6ff commit b20882b

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

include/swift/Basic/Defer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
namespace swift {
2424
template <typename F>
2525
class DoAtScopeExit {
26-
F &Fn;
26+
F Fn;
2727
void operator=(DoAtScopeExit&) = delete;
2828
public:
29-
DoAtScopeExit(F &Fn) : Fn(Fn){}
29+
DoAtScopeExit(F &&Fn) : Fn(std::move(Fn)) {}
3030
~DoAtScopeExit() {
3131
Fn();
3232
}
@@ -36,7 +36,7 @@ namespace swift {
3636
struct DeferTask {};
3737
template<typename F>
3838
DoAtScopeExit<typename std::decay<F>::type> operator+(DeferTask, F&& fn) {
39-
return DoAtScopeExit<typename std::decay<F>::type>(fn);
39+
return DoAtScopeExit<typename std::decay<F>::type>(std::move(fn));
4040
}
4141
}
4242
} // end namespace swift

0 commit comments

Comments
 (0)