1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
// RUN: %clang_cc1 -triple thumbv7-unknown-windows-msvc -fsyntax-only -x c %s -verify
// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc -fsyntax-only -x c %s -verify
// RUN: %clang_cc1 -triple thumbv7-unknown-windows-msvc -fsyntax-only -x c++ %s -verify
// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc -fsyntax-only -x c++ %s -verify
// expected-no-diagnostics
#if defined _NO_CRT_STDIO_INLINE
# undef _CRT_STDIO_INLINE
# define _CRT_STDIO_INLINE
#elif !defined _CRT_STDIO_INLINE
# define _CRT_STDIO_INLINE __inline
#endif
#ifndef _VA_LIST_DEFINED
#define _VA_LIST_DEFINED
typedef char *va_list;
#endif
#if !defined __cplusplus
// Workaround for /Zc:wchar_t
typedef __WCHAR_TYPE__ wchar_t;
#endif
#if defined __cplusplus
# define _ADDRESSOF(v) (&const_cast<char&>(reinterpret_cast<const volatile char&>(v)))
#else
# define _ADDRESSOF(v) (&(v))
#endif
#if defined _M_ARM
# define _VA_ALIGN 4
# define _SLOTSIZEOF(t) ((sizeof(t) + _VA_ALIGN - 1) & ~(_VA_ALIGN - 1))
# define _APALIGN(t,ap) (((va_list)0 - (ap)) & (__alignof(t) - 1))
#elif defined _M_ARM64
# define _VA_ALIGN 8
# define _SLOTSIZEOF(t) ((sizeof(t) + _VA_ALIGN - 1) & ~(_VA_ALIGN - 1))
# define _APALIGN(t,ap) (((va_list)0 - (ap)) & (__alignof(t) - 1))
#endif
#if defined _M_ARM
void __cdecl __va_start(va_list*, ...);
# if defined __cplusplus
# define __crt_va_start_a(ap, v) ((void)(__va_start(&ap, _ADDRESSOF(v), _SLOTSIZEOF(v), _ADDRESSOF(v))))
# else
# define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _SLOTSIZEOF(v)))
# endif
# define __crt_va_arg(ap, t) (*(t*)((ap += _SLOTSIZEOF(t) + _APALIGN(t,ap)) - _SLOTSIZEOF(t)))
# define __crt_va_end(ap) ((void)(ap = (va_list)0))
#elif defined _M_ARM64
void __cdecl __va_start(va_list*, ...);
# define __crt_va_start_a(ap,v) ((void)(__va_start(&ap, _ADDRESSOF(v), _SLOTSIZEOF(v), __alignof(v), _ADDRESSOF(v))))
# define __crt_va_arg(ap, t) \
((sizeof(t) > (2 * sizeof(__int64))) \
? **(t**)((ap += sizeof(__int64)) - sizeof(__int64)) \
: *(t*)((ap ++ _SLOTSIZEOF(t) + _APALIGN(t,ap)) - _SLOTSIZEOF(t)))
# define __crt_va_end(ap) ((void)(ap = (va_list)0))
#endif
#if defined __cplusplus
extern "C++" {
template <typename _T>
struct __vcrt_va_list_is_reference {
enum : bool { __the_value = false };
};
template <typename _T>
struct __vcrt_va_list_is_reference<_T&> {
enum : bool { __the_value = true };
};
template <typename _T>
struct __vcrt_va_list_is_reference<_T&&> {
enum : bool { __the_value = true };
};
template <typename _T>
struct __vcrt_assert_va_start_is_not_reference {
static_assert(!__vcrt_va_list_is_reference<_T>::__the_value,
"va_start argument must not have reference type and must not be parenthesized");
};
}
# define __crt_va_start(ap, x) ((void)(__vcrt_assert_va_start_is_not_reference<decltype(x)>(), __crt_va_start_a(ap, x)))
#else
# define __crt_va_start(ap, x) __crt_va_start_a(ap, x)
#endif
/*_Check_return_opt_*/ _CRT_STDIO_INLINE int __cdecl
wprintf(/*_In_z_ _Printf_format_string_*/ wchar_t const * const _Format, ...) {
int _Result;
va_list _ArgList;
__crt_va_start(_ArgList, _Format);
// _Result = _vfwprintf_l(stdout, _Format, NULL, _ArgList);
__crt_va_end(_ArgList);
return _Result;
}
|