xref: /llvm-project/clang/test/SemaObjC/attr-swift-async-error.m (revision 22db4824b9e03fe8c2e9217d6832b71ac23c175f)
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