15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <cwchar>
105a83710eSEric Fiselier 
11*a7f9895cSLouis Dionne // XFAIL: no-wide-characters
12f4c1258dSLouis Dionne 
135a83710eSEric Fiselier #include <cwchar>
145a127cdcSMarshall Clow #include <ctime>
15cbeadbdbSEric Fiselier #include <cstdarg>
1664c1d456SLouis Dionne #include <cstdio>
175a83710eSEric Fiselier #include <type_traits>
185a83710eSEric Fiselier 
19b766eb96SMarshall Clow #include "test_macros.h"
20b766eb96SMarshall Clow 
215a83710eSEric Fiselier #ifndef NULL
225a83710eSEric Fiselier #error NULL not defined
235a83710eSEric Fiselier #endif
245a83710eSEric Fiselier 
255a83710eSEric Fiselier #ifndef WCHAR_MAX
265a83710eSEric Fiselier #error WCHAR_MAX not defined
275a83710eSEric Fiselier #endif
285a83710eSEric Fiselier 
295a83710eSEric Fiselier #ifndef WCHAR_MIN
305a83710eSEric Fiselier #error WCHAR_MIN not defined
315a83710eSEric Fiselier #endif
325a83710eSEric Fiselier 
335a83710eSEric Fiselier #ifndef WEOF
345a83710eSEric Fiselier #error WEOF not defined
355a83710eSEric Fiselier #endif
365a83710eSEric Fiselier 
main(int,char **)372df59c50SJF Bastien int main(int, char**)
385a83710eSEric Fiselier {
39f979baabSMarshall Clow     std::mbstate_t mb = {};
405a83710eSEric Fiselier     std::size_t s = 0;
415a83710eSEric Fiselier     std::tm *tm = 0;
425a83710eSEric Fiselier     std::wint_t w = 0;
435a83710eSEric Fiselier     ::FILE* fp = 0;
44382e9179SEric Fiselier     std::va_list va;
45382e9179SEric Fiselier 
465a83710eSEric Fiselier     char* ns = 0;
475a83710eSEric Fiselier     wchar_t* ws = 0;
489178fb73SLouis Dionne     const wchar_t* cws = 0;
499178fb73SLouis Dionne     wchar_t** wsp = 0;
50fb42f4c4SEric Fiselier 
51fb42f4c4SEric Fiselier     ((void)mb); // Prevent unused warning
52fb42f4c4SEric Fiselier     ((void)s); // Prevent unused warning
53fb42f4c4SEric Fiselier     ((void)tm); // Prevent unused warning
54fb42f4c4SEric Fiselier     ((void)w); // Prevent unused warning
55fb42f4c4SEric Fiselier     ((void)fp); // Prevent unused warning
56fb42f4c4SEric Fiselier     ((void)va); // Prevent unused warning
57fb42f4c4SEric Fiselier     ((void)ns); // Prevent unused warning
58fb42f4c4SEric Fiselier     ((void)ws); // Prevent unused warning
599178fb73SLouis Dionne     ((void)cws); // Prevent unused warning
609178fb73SLouis Dionne     ((void)wsp); // Prevent unused warning
61fb42f4c4SEric Fiselier 
62b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::fwprintf(fp, L"")));
63b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::fwscanf(fp, L"")));
64b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::swprintf(ws, s, L"")));
65b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::swscanf(L"", L"")));
66b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::vfwprintf(fp, L"", va)));
67b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::vfwscanf(fp, L"", va)));
68b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::vswprintf(ws, s, L"", va)));
69b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::vswscanf(L"", L"", va)));
70b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::fgetwc(fp)));
71b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::fgetws(ws, 0, fp)));
72b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::fputwc(L' ', fp)));
73b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::fputws(L"", fp)));
74b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::fwide(fp, 0)));
75b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::getwc(fp)));
76b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::putwc(L' ', fp)));
77b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::ungetwc(L' ', fp)));
789178fb73SLouis Dionne     ASSERT_SAME_TYPE(double,             decltype(std::wcstod(L"", wsp)));
799178fb73SLouis Dionne     ASSERT_SAME_TYPE(float,              decltype(std::wcstof(L"", wsp)));
809178fb73SLouis Dionne     ASSERT_SAME_TYPE(long double,        decltype(std::wcstold(L"", wsp)));
819178fb73SLouis Dionne     ASSERT_SAME_TYPE(long,               decltype(std::wcstol(L"", wsp, 0)));
829178fb73SLouis Dionne     ASSERT_SAME_TYPE(long long,          decltype(std::wcstoll(L"", wsp, 0)));
839178fb73SLouis Dionne     ASSERT_SAME_TYPE(unsigned long,      decltype(std::wcstoul(L"", wsp, 0)));
849178fb73SLouis Dionne     ASSERT_SAME_TYPE(unsigned long long, decltype(std::wcstoull(L"", wsp, 0)));
85b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcscpy(ws, L"")));
86b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcsncpy(ws, L"", s)));
87b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcscat(ws, L"")));
88b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcsncat(ws, L"", s)));
89b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wcscmp(L"", L"")));
90b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wcscoll(L"", L"")));
91b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wcsncmp(L"", L"", s)));
92b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcsxfrm(ws, L"", s)));
939178fb73SLouis Dionne     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcschr(ws, L' ')));
949178fb73SLouis Dionne     ASSERT_SAME_TYPE(const wchar_t*,     decltype(std::wcschr(cws, L' ')));
95b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcscspn(L"", L"")));
96b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcslen(L"")));
979178fb73SLouis Dionne     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcspbrk(ws, L"")));
989178fb73SLouis Dionne     ASSERT_SAME_TYPE(const wchar_t*,     decltype(std::wcspbrk(cws, L"")));
999178fb73SLouis Dionne     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcsrchr(ws, L' ')));
1009178fb73SLouis Dionne     ASSERT_SAME_TYPE(const wchar_t*,     decltype(std::wcsrchr(cws, L' ')));
101b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcsspn(L"", L"")));
1029178fb73SLouis Dionne     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcsstr(ws, L"")));
1039178fb73SLouis Dionne     ASSERT_SAME_TYPE(const wchar_t*,     decltype(std::wcsstr(cws, L"")));
1049178fb73SLouis Dionne     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wcstok(ws, L"", wsp)));
1059178fb73SLouis Dionne     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wmemchr(ws, L' ', s)));
1069178fb73SLouis Dionne     ASSERT_SAME_TYPE(const wchar_t*,     decltype(std::wmemchr(cws, L' ', s)));
107b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wmemcmp(L"", L"", s)));
108b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wmemcpy(ws, L"", s)));
109b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wmemmove(ws, L"", s)));
110b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wchar_t*,           decltype(std::wmemset(ws, L' ', s)));
111b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcsftime(ws, s, L"", tm)));
112b766eb96SMarshall Clow     ASSERT_SAME_TYPE(wint_t,             decltype(std::btowc(0)));
113b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wctob(w)));
114b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::mbsinit(&mb)));
115b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::mbrlen("", s, &mb)));
116b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::mbrtowc(ws, "", s, &mb)));
117b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcrtomb(ns, L' ', &mb)));
118b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::mbsrtowcs(ws, (const char**)0, s, &mb)));
119b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::size_t,        decltype(std::wcsrtombs(ns, (const wchar_t**)0, s, &mb)));
120f4ac884fSEd Schouten 
121b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::getwchar()));
122b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::vwscanf(L"", va)));
123b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wscanf(L"")));
124f4ac884fSEd Schouten 
125b766eb96SMarshall Clow     ASSERT_SAME_TYPE(std::wint_t,        decltype(std::putwchar(L' ')));
126b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::vwprintf(L"", va)));
127b766eb96SMarshall Clow     ASSERT_SAME_TYPE(int,                decltype(std::wprintf(L"")));
1282df59c50SJF Bastien 
1292df59c50SJF Bastien     return 0;
1305a83710eSEric Fiselier }
131