xref: /aosp_15_r20/external/clang/test/SemaCXX/attr-swiftcall.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li #define SWIFTCALL __attribute__((swiftcall))
4*67e74705SXin Li #define INDIRECT_RESULT __attribute__((swift_indirect_result))
5*67e74705SXin Li #define ERROR_RESULT __attribute__((swift_error_result))
6*67e74705SXin Li #define CONTEXT __attribute__((swift_context))
7*67e74705SXin Li 
8*67e74705SXin Li int notAFunction SWIFTCALL; // expected-warning {{'swiftcall' only applies to function types; type here is 'int'}}
9*67e74705SXin Li void variadic(int x, ...) SWIFTCALL; // expected-error {{variadic function cannot use swiftcall calling convention}}
10*67e74705SXin Li void multiple_ccs(int x) SWIFTCALL __attribute__((vectorcall)); // expected-error {{vectorcall and swiftcall attributes are not compatible}}
11*67e74705SXin Li void (*functionPointer)(void) SWIFTCALL;
12*67e74705SXin Li 
13*67e74705SXin Li void indirect_result_nonswift(INDIRECT_RESULT void *out); // expected-error {{'swift_indirect_result' parameter can only be used with swiftcall calling convention}}
14*67e74705SXin Li void indirect_result_bad_position(int first, INDIRECT_RESULT void *out) SWIFTCALL; // expected-error {{'swift_indirect_result' parameters must be first parameters of function}}
15*67e74705SXin Li void indirect_result_bad_type(INDIRECT_RESULT int out) SWIFTCALL; // expected-error {{'swift_indirect_result' parameter must have pointer type; type here is 'int'}}
16*67e74705SXin Li void indirect_result_single(INDIRECT_RESULT void *out) SWIFTCALL;
17*67e74705SXin Li void indirect_result_multiple(INDIRECT_RESULT void *out1, INDIRECT_RESULT void *out2) SWIFTCALL;
18*67e74705SXin Li 
19*67e74705SXin Li void error_result_nonswift(ERROR_RESULT void **error); // expected-error {{'swift_error_result' parameter can only be used with swiftcall calling convention}} expected-error{{'swift_error_result' parameter must follow 'swift_context' parameter}}
20*67e74705SXin Li void error_result_bad_position(ERROR_RESULT void **error, int last) SWIFTCALL; // expected-error {{'swift_error_result' parameter must be last parameter of function}}
21*67e74705SXin Li void error_result_bad_position2(int first, ERROR_RESULT void **error) SWIFTCALL; // expected-error {{'swift_error_result' parameter must follow 'swift_context' parameter}}
22*67e74705SXin Li void error_result_bad_type(CONTEXT void *context, ERROR_RESULT int error) SWIFTCALL; // expected-error {{'swift_error_result' parameter must have pointer to unqualified pointer type; type here is 'int'}}
23*67e74705SXin Li void error_result_bad_type2(CONTEXT void *context, ERROR_RESULT int *error) SWIFTCALL; // expected-error {{'swift_error_result' parameter must have pointer to unqualified pointer type; type here is 'int *'}}
24*67e74705SXin Li void error_result_okay(int a, int b, CONTEXT void *context, ERROR_RESULT void **error) SWIFTCALL;
25*67e74705SXin Li 
26*67e74705SXin Li void context_nonswift(CONTEXT void *context); // expected-error {{'swift_context' parameter can only be used with swiftcall calling convention}}
27*67e74705SXin Li void context_bad_position(CONTEXT void *context, int x) SWIFTCALL; // expected-error {{'swift_context' parameter can only be followed by 'swift_error_result' parameter}}
28*67e74705SXin Li void context_bad_type(CONTEXT int context) SWIFTCALL; // expected-error {{'swift_context' parameter must have pointer type; type here is 'int'}}
29*67e74705SXin Li void context_okay(CONTEXT void *context) SWIFTCALL;
30*67e74705SXin Li 
31*67e74705SXin Li template <class T> void indirect_result_temp_okay1(INDIRECT_RESULT T *out) SWIFTCALL;
32*67e74705SXin Li template <class T> void indirect_result_temp_okay2(INDIRECT_RESULT T out) SWIFTCALL; // expected-note {{candidate template ignored: substitution failure [with T = int]: 'swift_indirect_result' parameter must have pointer type; type here is 'int'}}
test_indirect_result_temp(void * out)33*67e74705SXin Li void test_indirect_result_temp(void *out) {
34*67e74705SXin Li   indirect_result_temp_okay1(out);
35*67e74705SXin Li   indirect_result_temp_okay2(out);
36*67e74705SXin Li   indirect_result_temp_okay2(1); // expected-error {{no matching function for call to 'indirect_result_temp_okay2'}}
37*67e74705SXin Li }
38