cwchar.pass.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <cwchar>
  9. #include <cwchar>
  10. #include <ctime>
  11. #include <cstdarg>
  12. #include <cstdio>
  13. #include <type_traits>
  14. #include "test_macros.h"
  15. #ifndef NULL
  16. #error NULL not defined
  17. #endif
  18. #ifndef WCHAR_MAX
  19. #error WCHAR_MAX not defined
  20. #endif
  21. #ifndef WCHAR_MIN
  22. #error WCHAR_MIN not defined
  23. #endif
  24. #ifndef WEOF
  25. #error WEOF not defined
  26. #endif
  27. int main(int, char**)
  28. {
  29. std::mbstate_t mb = {};
  30. std::size_t s = 0;
  31. std::tm *tm = 0;
  32. std::wint_t w = 0;
  33. ::FILE* fp = 0;
  34. std::va_list va;
  35. char* ns = 0;
  36. wchar_t* ws = 0;
  37. ((void)mb); // Prevent unused warning
  38. ((void)s); // Prevent unused warning
  39. ((void)tm); // Prevent unused warning
  40. ((void)w); // Prevent unused warning
  41. ((void)fp); // Prevent unused warning
  42. ((void)va); // Prevent unused warning
  43. ((void)ns); // Prevent unused warning
  44. ((void)ws); // Prevent unused warning
  45. ASSERT_SAME_TYPE(int, decltype(std::fwprintf(fp, L"")));
  46. ASSERT_SAME_TYPE(int, decltype(std::fwscanf(fp, L"")));
  47. ASSERT_SAME_TYPE(int, decltype(std::swprintf(ws, s, L"")));
  48. ASSERT_SAME_TYPE(int, decltype(std::swscanf(L"", L"")));
  49. ASSERT_SAME_TYPE(int, decltype(std::vfwprintf(fp, L"", va)));
  50. ASSERT_SAME_TYPE(int, decltype(std::vfwscanf(fp, L"", va)));
  51. ASSERT_SAME_TYPE(int, decltype(std::vswprintf(ws, s, L"", va)));
  52. ASSERT_SAME_TYPE(int, decltype(std::vswscanf(L"", L"", va)));
  53. ASSERT_SAME_TYPE(std::wint_t, decltype(std::fgetwc(fp)));
  54. ASSERT_SAME_TYPE(wchar_t*, decltype(std::fgetws(ws, 0, fp)));
  55. ASSERT_SAME_TYPE(std::wint_t, decltype(std::fputwc(L' ', fp)));
  56. ASSERT_SAME_TYPE(int, decltype(std::fputws(L"", fp)));
  57. ASSERT_SAME_TYPE(int, decltype(std::fwide(fp, 0)));
  58. ASSERT_SAME_TYPE(std::wint_t, decltype(std::getwc(fp)));
  59. ASSERT_SAME_TYPE(std::wint_t, decltype(std::putwc(L' ', fp)));
  60. ASSERT_SAME_TYPE(std::wint_t, decltype(std::ungetwc(L' ', fp)));
  61. ASSERT_SAME_TYPE(double, decltype(std::wcstod(L"", (wchar_t**)0)));
  62. ASSERT_SAME_TYPE(float, decltype(std::wcstof(L"", (wchar_t**)0)));
  63. ASSERT_SAME_TYPE(long double, decltype(std::wcstold(L"", (wchar_t**)0)));
  64. ASSERT_SAME_TYPE(long, decltype(std::wcstol(L"", (wchar_t**)0, 0)));
  65. ASSERT_SAME_TYPE(long long, decltype(std::wcstoll(L"", (wchar_t**)0, 0)));
  66. ASSERT_SAME_TYPE(unsigned long, decltype(std::wcstoul(L"", (wchar_t**)0, 0)));
  67. ASSERT_SAME_TYPE(unsigned long long, decltype(std::wcstoull(L"", (wchar_t**)0, 0)));
  68. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcscpy(ws, L"")));
  69. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcsncpy(ws, L"", s)));
  70. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcscat(ws, L"")));
  71. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcsncat(ws, L"", s)));
  72. ASSERT_SAME_TYPE(int, decltype(std::wcscmp(L"", L"")));
  73. ASSERT_SAME_TYPE(int, decltype(std::wcscoll(L"", L"")));
  74. ASSERT_SAME_TYPE(int, decltype(std::wcsncmp(L"", L"", s)));
  75. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcsxfrm(ws, L"", s)));
  76. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcschr((wchar_t*)0, L' ')));
  77. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcscspn(L"", L"")));
  78. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcslen(L"")));
  79. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcspbrk((wchar_t*)0, L"")));
  80. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcsrchr((wchar_t*)0, L' ')));
  81. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcsspn(L"", L"")));
  82. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcsstr((wchar_t*)0, L"")));
  83. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wcstok(ws, L"", (wchar_t**)0)));
  84. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wmemchr((wchar_t*)0, L' ', s)));
  85. ASSERT_SAME_TYPE(int, decltype(std::wmemcmp(L"", L"", s)));
  86. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wmemcpy(ws, L"", s)));
  87. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wmemmove(ws, L"", s)));
  88. ASSERT_SAME_TYPE(wchar_t*, decltype(std::wmemset(ws, L' ', s)));
  89. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcsftime(ws, s, L"", tm)));
  90. ASSERT_SAME_TYPE(wint_t, decltype(std::btowc(0)));
  91. ASSERT_SAME_TYPE(int, decltype(std::wctob(w)));
  92. ASSERT_SAME_TYPE(int, decltype(std::mbsinit(&mb)));
  93. ASSERT_SAME_TYPE(std::size_t, decltype(std::mbrlen("", s, &mb)));
  94. ASSERT_SAME_TYPE(std::size_t, decltype(std::mbrtowc(ws, "", s, &mb)));
  95. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcrtomb(ns, L' ', &mb)));
  96. ASSERT_SAME_TYPE(std::size_t, decltype(std::mbsrtowcs(ws, (const char**)0, s, &mb)));
  97. ASSERT_SAME_TYPE(std::size_t, decltype(std::wcsrtombs(ns, (const wchar_t**)0, s, &mb)));
  98. // These tests fail on systems whose C library doesn't provide a correct overload
  99. // set for wcschr, wcspbrk, wcsrchr, wcsstr, and wmemchr, unless the compiler is
  100. // a suitably recent version of Clang.
  101. #if !defined(__APPLE__) || defined(_LIBCPP_PREFERRED_OVERLOAD)
  102. ASSERT_SAME_TYPE(const wchar_t*, decltype(std::wcschr((const wchar_t*)0, L' ')));
  103. ASSERT_SAME_TYPE(const wchar_t*, decltype(std::wcspbrk((const wchar_t*)0, L"")));
  104. ASSERT_SAME_TYPE(const wchar_t*, decltype(std::wcsrchr((const wchar_t*)0, L' ')));
  105. ASSERT_SAME_TYPE(const wchar_t*, decltype(std::wcsstr((const wchar_t*)0, L"")));
  106. ASSERT_SAME_TYPE(const wchar_t*, decltype(std::wmemchr((const wchar_t*)0, L' ', s)));
  107. #endif
  108. #ifndef _LIBCPP_HAS_NO_STDIN
  109. ASSERT_SAME_TYPE(std::wint_t, decltype(std::getwchar()));
  110. ASSERT_SAME_TYPE(int, decltype(std::vwscanf(L"", va)));
  111. ASSERT_SAME_TYPE(int, decltype(std::wscanf(L"")));
  112. #endif
  113. #ifndef _LIBCPP_HAS_NO_STDOUT
  114. ASSERT_SAME_TYPE(std::wint_t, decltype(std::putwchar(L' ')));
  115. ASSERT_SAME_TYPE(int, decltype(std::vwprintf(L"", va)));
  116. ASSERT_SAME_TYPE(int, decltype(std::wprintf(L"")));
  117. #endif
  118. return 0;
  119. }