Skip to content

Commit f44a9c3

Browse files
committed
Fix @objcImpl crash with async/sync overloads
The @objcImpl checker would accidentally dereference a null pointer when it tried to check if an async requirement could be satisfied by a non-async method. Fix that mistake. Fixes rdar://111064481.
1 parent e680218 commit f44a9c3

File tree

3 files changed

+12
-1
lines changed

3 files changed

+12
-1
lines changed

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2950,7 +2950,7 @@ class ObjCImplementationChecker {
29502950
if (auto func = dyn_cast<AbstractFunctionDecl>(req)) {
29512951
auto asyncFunc = func->getAsyncAlternative();
29522952

2953-
if (auto asyncAccessor = dyn_cast<AccessorDecl>(asyncFunc))
2953+
if (auto asyncAccessor = dyn_cast_or_null<AccessorDecl>(asyncFunc))
29542954
return asyncAccessor->getStorage();
29552955

29562956
return asyncFunc;

test/decl/ext/Inputs/objc_implementation.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@
9494
- (void)doSomethingAsynchronousWithCompletionHandler:(void (^ _Nonnull)(id _Nullable result, NSError * _Nullable error))completionHandler;
9595
- (void)doSomethingElseAsynchronousWithCompletionHandler:(void (^ _Nullable)(id _Nonnull result))completionHandler;
9696
- (void)doSomethingFunAndAsynchronousWithCompletionHandler:(void (^ _Nonnull)(id _Nullable result, NSError * _Nullable error))completionHandler;
97+
98+
- (void)doSomethingOverloadedWithCompletionHandler:(void (^ _Nonnull)())completionHandler;
99+
- (void)doSomethingOverloaded __attribute__((__swift_attr__("@_unavailableFromAsync(message: \"Use async doSomethingOverloaded instead.\")")));
97100
@end
98101

99102
@protocol PartiallyOptionalProtocol

test/decl/ext/objc_implementation.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,14 @@ protocol EmptySwiftProto {}
312312

313313
public func doSomethingFunAndAsynchronous(completionHandler: @escaping (Any?, Error?) -> Void) {
314314
}
315+
316+
@available(SwiftStdlib 5.1, *)
317+
@objc(doSomethingOverloadedWithCompletionHandler:)
318+
public func doSomethingOverloaded() async {}
319+
320+
@available(*, noasync)
321+
@objc(doSomethingOverloaded)
322+
public func doSomethingOverloaded() {}
315323
}
316324

317325
@_objcImplementation(Conformance) extension ObjCClass {

0 commit comments

Comments
 (0)