Skip to content

Commit 49831a9

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 3ef125b commit 49831a9

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
@@ -2943,7 +2943,7 @@ class ObjCImplementationChecker {
29432943
if (auto func = dyn_cast<AbstractFunctionDecl>(req)) {
29442944
auto asyncFunc = func->getAsyncAlternative();
29452945

2946-
if (auto asyncAccessor = dyn_cast<AccessorDecl>(asyncFunc))
2946+
if (auto asyncAccessor = dyn_cast_or_null<AccessorDecl>(asyncFunc))
29472947
return asyncAccessor->getStorage();
29482948

29492949
return asyncFunc;

test/decl/ext/Inputs/objc_implementation.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@
103103
- (void)doSomethingAsynchronousWithCompletionHandler:(void (^ _Nonnull)(id _Nullable result, NSError * _Nullable error))completionHandler;
104104
- (void)doSomethingElseAsynchronousWithCompletionHandler:(void (^ _Nullable)(id _Nonnull result))completionHandler;
105105
- (void)doSomethingFunAndAsynchronousWithCompletionHandler:(void (^ _Nonnull)(id _Nullable result, NSError * _Nullable error))completionHandler;
106+
107+
- (void)doSomethingOverloadedWithCompletionHandler:(void (^ _Nonnull)())completionHandler;
108+
- (void)doSomethingOverloaded __attribute__((__swift_attr__("@_unavailableFromAsync(message: \"Use async doSomethingOverloaded instead.\")")));
106109
@end
107110

108111
@protocol PartiallyOptionalProtocol

test/decl/ext/objc_implementation.swift

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

328328
public func doSomethingFunAndAsynchronous(completionHandler: @escaping (Any?, Error?) -> Void) {
329329
}
330+
331+
@available(SwiftStdlib 5.1, *)
332+
@objc(doSomethingOverloadedWithCompletionHandler:)
333+
public func doSomethingOverloaded() async {}
334+
335+
@available(*, noasync)
336+
@objc(doSomethingOverloaded)
337+
public func doSomethingOverloaded() {}
330338
}
331339

332340
@_objcImplementation(Conformance) extension ObjCClass {

0 commit comments

Comments
 (0)