Files
swift-mirror/validation-test/compiler_crashers_2_fixed/Inputs/rdar80704984.m
Nate Chandler 1ae317dd88 [SILGen] Handle foreign funcs with error and async conventions.
Previously, SILGen assumed that a foreign function could either have a
foreign async convention or a foreign error convention, but if it had
both, the error would be subsumed into the completion.  That resulted in
failures to emit code for async calls of functions like

```
- (BOOL)minimalWithError:(NSError* _Nullable*)error
         completionHandler:(void (^ _Nonnull)(void))completionHandler;
```

Here, SILGen gains the ability to emit such functions.  To enable that,
a few changes were required when both conventions are present:
- a separate argument for each convention is used
- the ResultPlan is a ForeignErrorResultPlan nesting a
  ForeignAsyncResultPlan
- the continuation is always of the form UnsafeContinuation<_, Error>
  regardless of whether the completion handler takes an error
- the foreign error block fills the continuation with the error that was
  passed by reference out of the ObjC method call
- the foreign error block branches to the block containing the await
  instruction

rdar://80704984
2021-08-03 18:36:15 -07:00

36 lines
1.1 KiB
Objective-C

#include "rdar80704984.h"
#pragma clang assume_nonnull begin
@implementation PFXObject
- (instancetype)init {
if (self = [super init]) {
}
return self;
}
- (BOOL)enqueueErroryRequestWithError:(NSError *_Nullable *)error
completionHandler:
(nullable CompletionHandler)completionHandler {
*error = [[NSError alloc] initWithDomain:@"d" code:1 userInfo:nil];
return NO;
}
- (BOOL)enqueueSyncSuccessfulErroryRequestWithError:(NSError *_Nullable *)error
completionHandler:(nullable CompletionHandler)
completionHandler {
completionHandler(0, 1);
return YES;
}
- (BOOL)enqueueAsyncSuccessfulErroryRequestWithError:(NSError *_Nullable *)error
completionHandler:
(nullable CompletionHandler)
completionHandler;
{
dispatch_async(dispatch_get_main_queue(), ^{
completionHandler(0, 2);
});
return YES;
}
@end
#pragma clang assume_nonnull end