From: Saleem Abdulrasool Date: Wed, 19 Sep 2018 16:18:55 +0000 (+0000) Subject: Basic: correct `__WINT_TYPE__` on Windows X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9e910c672d89962592778fe2b2ac66cb53994d1b;p=clang Basic: correct `__WINT_TYPE__` on Windows Windows uses `unsigned short` for `wint_t`. Correct the type definition as vended by the compiler. This type is defined in corecrt.h and is unconditionally typedef'ed. cl does not have an equivalent to `__WINT_TYPE__` which is why this was never detected. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342557 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets/OSTargets.h b/lib/Basic/Targets/OSTargets.h index d0354784ac..48da6dc950 100644 --- a/lib/Basic/Targets/OSTargets.h +++ b/lib/Basic/Targets/OSTargets.h @@ -643,6 +643,7 @@ public: WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : OSTargetInfo(Triple, Opts) { this->WCharType = TargetInfo::UnsignedShort; + this->WIntType = TargetInfo::UnsignedShort; } }; diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index 6e15bdc30a..5a93f3b1fa 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -1553,7 +1553,7 @@ // AARCH64-MSVC: #define __SIZEOF_SHORT__ 2 // AARCH64-MSVC: #define __SIZEOF_SIZE_T__ 8 // AARCH64-MSVC: #define __SIZEOF_WCHAR_T__ 2 -// AARCH64-MSVC: #define __SIZEOF_WINT_T__ 4 +// AARCH64-MSVC: #define __SIZEOF_WINT_T__ 2 // AARCH64-MSVC: #define __SIZE_MAX__ 18446744073709551615ULL // AARCH64-MSVC: #define __SIZE_TYPE__ long long unsigned int // AARCH64-MSVC: #define __SIZE_WIDTH__ 64 @@ -1602,8 +1602,8 @@ // AARCH64-MSVC: #define __WCHAR_TYPE__ unsigned short // AARCH64-MSVC: #define __WCHAR_UNSIGNED__ 1 // AARCH64-MSVC: #define __WCHAR_WIDTH__ 16 -// AARCH64-MSVC: #define __WINT_TYPE__ int -// AARCH64-MSVC: #define __WINT_WIDTH__ 32 +// AARCH64-MSVC: #define __WINT_TYPE__ unsigned short +// AARCH64-MSVC: #define __WINT_WIDTH__ 16 // AARCH64-MSVC: #define __aarch64__ 1 // RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm-none-none < /dev/null | FileCheck -match-full-lines -check-prefix ARM %s diff --git a/test/Preprocessor/woa-defaults.c b/test/Preprocessor/woa-defaults.c index 4eef863b23..9757823939 100644 --- a/test/Preprocessor/woa-defaults.c +++ b/test/Preprocessor/woa-defaults.c @@ -27,7 +27,7 @@ // CHECK: #define __SIZEOF_SHORT__ 2 // CHECK: #define __SIZEOF_SIZE_T__ 4 // CHECK: #define __SIZEOF_WCHAR_T__ 2 -// CHECK: #define __SIZEOF_WINT_T__ 4 +// CHECK: #define __SIZEOF_WINT_T__ 2 // CHECK: #define __SIZE_TYPE__ unsigned int // CHECK: #define __UINTPTR_TYPE__ unsigned int diff --git a/test/Sema/format-strings-ms.c b/test/Sema/format-strings-ms.c index 42676e7a4e..9887b461f6 100644 --- a/test/Sema/format-strings-ms.c +++ b/test/Sema/format-strings-ms.c @@ -13,6 +13,7 @@ void non_iso_warning_test(__int32 i32, __int64 i64, wchar_t c, void *p) { printf("%I32d", i32); // expected-warning{{'I32' length modifier is not supported by ISO C}} printf("%I64d", i64); // expected-warning{{'I64' length modifier is not supported by ISO C}} printf("%wc", c); // expected-warning{{'w' length modifier is not supported by ISO C}} + // expected-warning@-1{{format specifies type 'wint_t' (aka 'unsigned short') but the argument has type 'wchar_t' (aka 'unsigned short')}} printf("%Z", p); // expected-warning{{'Z' conversion specifier is not supported by ISO C}} } @@ -35,7 +36,7 @@ void unsigned_test() { } void w_test(wchar_t c, wchar_t *s) { - printf("%wc", c); + printf("%wc", c); // expected-warning{{format specifies type 'wint_t' (aka 'unsigned short') but the argument has type 'wchar_t' (aka 'unsigned short')}} printf("%wC", c); printf("%C", c); printf("%ws", s); @@ -49,7 +50,7 @@ void w_test(wchar_t c, wchar_t *s) { scanf("%S", s); double bad; - printf("%wc", bad); // expected-warning{{format specifies type 'wint_t' (aka 'int') but the argument has type 'double'}} + printf("%wc", bad); // expected-warning{{format specifies type 'wint_t' (aka 'unsigned short') but the argument has type 'double'}} printf("%wC", bad); // expected-warning{{format specifies type 'wchar_t' (aka 'unsigned short') but the argument has type 'double'}} printf("%C", bad); // expected-warning{{format specifies type 'wchar_t' (aka 'unsigned short') but the argument has type 'double'}} printf("%ws", bad); // expected-warning{{format specifies type 'wchar_t *' (aka 'unsigned short *') but the argument has type 'double'}}