mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-24 22:08:57 -04:00

Windows ARM indicates __va_start as a variadic function. However, the function itself is treated as having 4 formal arguments: - (out) pointer to the va_list - (in) address of the last named argument - (in) slot size for the type of the last argument - address of the last named argument The last argument does not seem to have any bearing on codegen, and thus is not explicitly type checked at this point. Unlike the previous handling for __va_start, it does not currently validate if the parameter is the last named parameter (it seems that MSVC currently accepts this). llvm-svn: 213595
43 lines
1.7 KiB
C++
43 lines
1.7 KiB
C++
// RUN: %clang_cc1 -triple thumbv7-windows -fms-compatibility -fsyntax-only %s -verify
|
|
|
|
extern "C" {
|
|
typedef char * va_list;
|
|
}
|
|
|
|
void test_no_arguments(int i, ...) {
|
|
__va_start(); // expected-error{{too few arguments to function call, expected at least 3, have 0}}
|
|
}
|
|
|
|
void test_one_argument(int i, ...) {
|
|
va_list ap;
|
|
__va_start(&ap); // expected-error{{too few arguments to function call, expected at least 3, have 1}}
|
|
}
|
|
|
|
void test_two_arguments(int i, ...) {
|
|
va_list ap;
|
|
__va_start(&ap, &i); // expected-error{{too few arguments to function call, expected at least 3, have 2}}
|
|
}
|
|
|
|
void test_non_last_argument(int i, int j, ...) {
|
|
va_list ap;
|
|
__va_start(&ap, &i, 4);
|
|
// expected-error@-1{{passing 'int *' to parameter of incompatible type 'const char *': type mismatch at 2nd parameter ('int *' vs 'const char *')}}
|
|
// expected-error@-2{{passing 'int' to parameter of incompatible type 'unsigned int': type mismatch at 3rd parameter ('int' vs 'unsigned int')}}
|
|
}
|
|
|
|
void test_stack_allocated(int i, ...) {
|
|
va_list ap;
|
|
int j;
|
|
__va_start(&ap, &j, 4);
|
|
// expected-error@-1{{passing 'int *' to parameter of incompatible type 'const char *': type mismatch at 2nd parameter ('int *' vs 'const char *')}}
|
|
// expected-error@-2{{passing 'int' to parameter of incompatible type 'unsigned int': type mismatch at 3rd parameter ('int' vs 'unsigned int')}}
|
|
}
|
|
|
|
void test_non_pointer_addressof(int i, ...) {
|
|
va_list ap;
|
|
__va_start(&ap, 1, 4);
|
|
// expected-error@-1{{passing 'int' to parameter of incompatible type 'const char *': type mismatch at 2nd parameter ('int' vs 'const char *')}}
|
|
// expected-error@-2{{passing 'int' to parameter of incompatible type 'unsigned int': type mismatch at 3rd parameter ('int' vs 'unsigned int')}}
|
|
}
|
|
|