11e8afba6SErik Pilkington// RUN: %clang_cc1 %s -fblocks -fsyntax-only -verify 21e8afba6SErik Pilkington 31e8afba6SErik Pilkington#define ASYNC(...) __attribute__((swift_async(__VA_ARGS__))) 41e8afba6SErik Pilkington#define ASYNC_ERROR(...) __attribute__((swift_async_error(__VA_ARGS__))) 51e8afba6SErik Pilkington 61e8afba6SErik PilkingtonASYNC(swift_private, 1) 71e8afba6SErik PilkingtonASYNC_ERROR(zero_argument, 1) 81e8afba6SErik Pilkingtonvoid test_good(void (^handler)(int)); 91e8afba6SErik Pilkington 101e8afba6SErik PilkingtonASYNC(swift_private, 2) 111e8afba6SErik PilkingtonASYNC_ERROR(nonzero_argument, 2) 121e8afba6SErik Pilkingtonvoid test_good2(double, void (^handler)(double, int, double)); 131e8afba6SErik Pilkington 141e8afba6SErik Pilkingtonenum SomeEnum { SE_a, SE_b }; 151e8afba6SErik Pilkington 161e8afba6SErik PilkingtonASYNC(swift_private, 1) 171e8afba6SErik PilkingtonASYNC_ERROR(nonzero_argument, 1) 181e8afba6SErik Pilkingtonvoid test_good3(void (^handler)(enum SomeEnum, double)); 191e8afba6SErik Pilkington 201e8afba6SErik PilkingtonASYNC_ERROR(zero_argument, 1) 211e8afba6SErik PilkingtonASYNC(swift_private, 1) 221e8afba6SErik Pilkingtonvoid test_rev_order(void (^handler)(int)); 231e8afba6SErik Pilkington 241e8afba6SErik Pilkington@class NSError; 251e8afba6SErik Pilkington 261e8afba6SErik PilkingtonASYNC(swift_private, 1) 271e8afba6SErik PilkingtonASYNC_ERROR(nonnull_error) 281e8afba6SErik Pilkingtonvoid test_nserror(void (^handler)(NSError *)); 291e8afba6SErik Pilkington 301e8afba6SErik Pilkingtontypedef struct __attribute__((objc_bridge(NSError))) __CFError * CFErrorRef; 311e8afba6SErik Pilkington 321e8afba6SErik PilkingtonASYNC(swift_private, 1) 331e8afba6SErik PilkingtonASYNC_ERROR(nonnull_error) 341e8afba6SErik Pilkingtonvoid test_cferror(void (^handler)(CFErrorRef)); 351e8afba6SErik Pilkington 361e8afba6SErik PilkingtonASYNC(swift_private, 1) 371e8afba6SErik PilkingtonASYNC_ERROR(nonnull_error) // expected-error {{'swift_async_error' attribute with 'nonnull_error' convention can only be applied to a function with a completion handler with an error parameter}} 381e8afba6SErik Pilkingtonvoid test_interror(void (^handler)(int)); 391e8afba6SErik Pilkington 401e8afba6SErik PilkingtonASYNC(swift_private, 1) 411e8afba6SErik PilkingtonASYNC_ERROR(zero_argument, 1) // expected-error {{'swift_async_error' attribute with 'zero_argument' convention must have an integral-typed parameter in completion handler at index 1, type here is 'double'}} 421e8afba6SErik Pilkingtonvoid test_not_integral(void (^handler)(double)); 431e8afba6SErik Pilkington 441e8afba6SErik PilkingtonASYNC(swift_private, 1) 451e8afba6SErik PilkingtonASYNC_ERROR(none) 46*22db4824SAaron Ballmanvoid test_none(void (^)(void)); 471e8afba6SErik Pilkington 481e8afba6SErik PilkingtonASYNC(none) 491e8afba6SErik PilkingtonASYNC_ERROR(none) 50*22db4824SAaron Ballmanvoid test_double_none(void (^)(void)); 511e8afba6SErik Pilkington 521e8afba6SErik PilkingtonASYNC(none) 531e8afba6SErik PilkingtonASYNC_ERROR(none, 1) // expected-error {{'swift_async_error' attribute takes one argument}} 54*22db4824SAaron Ballmanvoid test_double_none_args(void); 551e8afba6SErik Pilkington 561e8afba6SErik PilkingtonASYNC(swift_private, 1) 571e8afba6SErik PilkingtonASYNC_ERROR(nonnull_error, 1) // expected-error{{'swift_async_error' attribute takes one argument}} 581e8afba6SErik Pilkingtonvoid test_args(void (^)(void)); 591e8afba6SErik Pilkington 601e8afba6SErik PilkingtonASYNC(swift_private, 1) 611e8afba6SErik PilkingtonASYNC_ERROR(zero_argument, 1, 1) // expected-error{{'swift_async_error' attribute takes no more than 2 arguments}} 621e8afba6SErik Pilkingtonvoid test_args2(void (^)(int)); 631e8afba6SErik Pilkington 641e8afba6SErik PilkingtonASYNC_ERROR(none) int x; // expected-warning{{'swift_async_error' attribute only applies to functions and Objective-C methods}} 651e8afba6SErik Pilkington 661e8afba6SErik Pilkington@interface ObjC 671e8afba6SErik Pilkington-(void)m1:(void (^)(int))handler 681e8afba6SErik Pilkington ASYNC(swift_private, 1) 691e8afba6SErik Pilkington ASYNC_ERROR(zero_argument, 1); 701e8afba6SErik Pilkington 711e8afba6SErik Pilkington-(void)m2:(int)first withSecond:(void (^)(int))handler 721e8afba6SErik Pilkington ASYNC(swift_private, 2) 731e8afba6SErik Pilkington ASYNC_ERROR(nonzero_argument, 1); 741e8afba6SErik Pilkington 751e8afba6SErik Pilkington-(void)m3:(void (^)(void))block 761e8afba6SErik Pilkington ASYNC_ERROR(zero_argument, 1) // expected-error {{'swift_async_error' attribute parameter 2 is out of bounds}} 771e8afba6SErik Pilkington ASYNC(swift_private, 1); 781e8afba6SErik Pilkington 791e8afba6SErik Pilkington-(void)m4:(void (^)(double, int, float))handler 801e8afba6SErik Pilkington ASYNC(swift_private, 1) 811e8afba6SErik Pilkington ASYNC_ERROR(nonzero_argument, 1); // expected-error{{swift_async_error' attribute with 'nonzero_argument' convention must have an integral-typed parameter in completion handler at index 1, type here is 'double'}} 821e8afba6SErik Pilkington 831e8afba6SErik Pilkington-(void)m5:(void (^)(NSError *))handler 841e8afba6SErik Pilkington ASYNC(swift_private, 1) 851e8afba6SErik Pilkington ASYNC_ERROR(nonnull_error); 861e8afba6SErik Pilkington 871e8afba6SErik Pilkington-(void)m6:(void (^)(void *))handler 881e8afba6SErik Pilkington ASYNC(swift_private, 1) 891e8afba6SErik Pilkington ASYNC_ERROR(nonnull_error); // expected-error{{'swift_async_error' attribute with 'nonnull_error' convention can only be applied to a method with a completion handler with an error parameter}} 901e8afba6SErik Pilkington@end 911e8afba6SErik Pilkington 921e8afba6SErik Pilkington// 'swift_error' and 'swift_async_error' are OK on one function. 931e8afba6SErik PilkingtonASYNC(swift_private, 1) 941e8afba6SErik PilkingtonASYNC_ERROR(nonnull_error) 951e8afba6SErik Pilkington__attribute__((swift_error(nonnull_error))) 961e8afba6SErik Pilkingtonvoid swift_error_and_swift_async_error(void (^handler)(NSError *), NSError **); 971e8afba6SErik Pilkington 981e8afba6SErik Pilkington@interface TestNoSwiftAsync 991e8afba6SErik Pilkington// swift_async_error can make sense without swift_async. 1001e8afba6SErik Pilkington-(void)doAThingWithCompletion:(void (^)(NSError *))completion 1011e8afba6SErik Pilkington ASYNC_ERROR(nonnull_error); 1021e8afba6SErik Pilkington@end 103