diff --git a/include/swift/IDE/SourceEntityWalker.h b/include/swift/IDE/SourceEntityWalker.h index 5fba3af86fdf3..121ba83bb0589 100644 --- a/include/swift/IDE/SourceEntityWalker.h +++ b/include/swift/IDE/SourceEntityWalker.h @@ -18,6 +18,7 @@ #include "swift/Basic/LLVM.h" #include "swift/Basic/SourceLoc.h" #include "llvm/ADT/PointerUnion.h" +#include "llvm/Support/SaveAndRestore.h" namespace clang { class Module; @@ -189,10 +190,7 @@ class SourceEntityWalker { /// Utility that lets us keep track of an ASTWalker when walking. bool performWalk(ASTWalker &W, llvm::function_ref DoWalk) { - Walker = &W; - SWIFT_DEFER { - Walker = nullptr; - }; + llvm::SaveAndRestore SV(Walker, &W); return DoWalk(); } }; diff --git a/test/refactoring/ConvertAsync/convert_function.swift b/test/refactoring/ConvertAsync/convert_function.swift index 66f578685f654..7f7ce77d0e9e6 100644 --- a/test/refactoring/ConvertAsync/convert_function.swift +++ b/test/refactoring/ConvertAsync/convert_function.swift @@ -289,3 +289,23 @@ func testReturnHandling3(_ completion: (String?, Error?) -> Void) { // RETURN-HANDLING3: func testReturnHandling3() async throws -> String { // RETURN-HANDLING3-NEXT: {{^}} return (<#completion#>("", nil)){{$}} // RETURN-HANDLING3-NEXT: } + +// RUN: %refactor -convert-to-async -dump-text -source-filename %s -pos=%(line+1):1 | %FileCheck -check-prefix=RDAR78693050 %s +func rdar78693050(_ completion: () -> Void) { + simple { str in + print(str) + } + if .random() { + return completion() + } + completion() +} + +// RDAR78693050: func rdar78693050() async { +// RDAR78693050-NEXT: let str = await simple() +// RDAR78693050-NEXT: print(str) +// RDAR78693050-NEXT: if .random() { +// RDAR78693050-NEXT: return +// RDAR78693050-NEXT: } +// RDAR78693050-NEXT: return +// RDAR78693050-NEXT: }