mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-27 07:19:03 -04:00

The `__va_start` intrinsic for Windows ARM does not account for const correctness when performing a check. All local qualifiers are ignored when validating the invocation. This was exposed by building the swift stdlib against the Windows 10586 SDK for ARM. Simply expand out the check for the two parameters and ignore the qualifiers for the check. llvm-svn: 314226
28 lines
967 B
C++
28 lines
967 B
C++
// RUN: %clang_cc1 -triple thumbv7-windows -fms-compatibility -fsyntax-only %s -verify
|
|
// expected-no-diagnostics
|
|
|
|
extern "C" {
|
|
typedef char * va_list;
|
|
void __va_start(va_list *, ...);
|
|
}
|
|
|
|
int test___va_start(int i, ...) {
|
|
va_list ap;
|
|
__va_start(&ap, ( &reinterpret_cast<const char &>(i) ),
|
|
( (sizeof(i) + 4 - 1) & ~(4 - 1) ),
|
|
( &reinterpret_cast<const char &>(i) ));
|
|
return (*(int *)((ap += ( (sizeof(int) + 4 - 1) & ~(4 - 1) ) + ( ((va_list)0 - (ap)) & (__alignof(int) - 1) )) - ( (sizeof(int) + 4 - 1) & ~(4 - 1) )));
|
|
}
|
|
|
|
int builtin(int i, ...) {
|
|
__builtin_va_list ap;
|
|
__builtin_va_start(ap, i);
|
|
return __builtin_va_arg(ap, int);
|
|
}
|
|
|
|
void test___va_start_ignore_const(const char *format, ...) {
|
|
va_list args;
|
|
((void)(__va_start(&args, (&const_cast<char &>(reinterpret_cast<const volatile char &>(format))), ((sizeof(format) + 4 - 1) & ~(4 - 1)), (&const_cast<char &>(reinterpret_cast<const volatile char &>(format))))));
|
|
}
|
|
|