Skip to content

Commit 19b4d2a

Browse files
committed
test: Add tests for tchar.h routines
1 parent 2280c59 commit 19b4d2a

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

test/Makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ TESTS_CPP_EXCEPTIONS = hello-exception exception-locale exception-reduced
7474
TESTS_CPP_STATIC = hello-exception
7575
TESTS_CPP_DLL = tlstest-lib throwcatch-lib
7676
TESTS_CPP_LINK_DLL = throwcatch-main
77+
TESTS_TCHAR = tchar
7778
TESTS_SSP = stacksmash
7879
TESTS_FORTIFY = bufferoverflow crt-test
7980
ifneq ($(HAVE_ASAN),)
@@ -108,6 +109,8 @@ TARGETS_CPP_EXCEPTIONS_OPT = $(addsuffix -opt$(EXEEXT), $(TESTS_CPP_EXCEPTIONS))
108109
TARGETS_CPP_STATIC = $(addsuffix -static$(EXEEXT), $(TESTS_CPP_STATIC))
109110
TARGETS_CPP_DLL = $(addsuffix $(DLLEXT), $(TESTS_CPP_DLL))
110111
TARGETS_CPP_LINK_DLL = $(addsuffix $(EXEEXT), $(TESTS_CPP_LINK_DLL))
112+
TARGETS_TCHAR_NARROW = $(addsuffix -narrow$(EXEEXT), $(TESTS_TCHAR))
113+
TARGETS_TCHAR_UNICODE = $(addsuffix -unicode$(EXEEXT), $(TESTS_TCHAR))
111114
TARGETS_SSP = $(addsuffix $(EXEEXT), $(TESTS_SSP))
112115
TARGETS_CFGUARD = $(addsuffix $(EXEEXT), $(TESTS_CFGUARD))
113116
TARGETS_FORTIFY = $(addsuffix -fortify$(EXEEXT), $(TESTS_FORTIFY))
@@ -129,6 +132,7 @@ TARGETS_ATOMIC = $(addsuffix $(EXEEXT), $(TESTS_ATOMIC))
129132
TARGETS = \
130133
$(TARGETS_C) $(TARGETS_C_DLL) $(TARGETS_C_LINK_DLL) $(TARGETS_C_NO_BUILTIN) $(TARGETS_C_ANSI_STDIO) $(TARGETS_C_NOANSI_STDIO) $(TARGETS_C_AS_CPP) \
131134
$(TARGETS_CPP) $(TARGETS_CPP_EXCEPTIONS) $(TARGETS_CPP_EXCEPTIONS_OPT) $(TARGETS_CPP_STATIC) $(TARGETS_CPP_DLL) $(TARGETS_CPP_LINK_DLL) \
135+
$(TARGETS_TCHAR_NARROW) $(TARGETS_TCHAR_UNICODE) \
132136
$(TARGETS_SSP) $(TARGETS_CFGUARD) $(TARGETS_FORTIFY) \
133137
$(TARGETS_IDL) $(TARGETS_RES) \
134138
$(TARGETS_OTHER_TARGETS) $(TARGETS_UWP) $(TARGETS_UWP_FAIL) \
@@ -184,6 +188,14 @@ $(TARGETS_CPP) $(TARGETS_CPP_EXCEPTIONS): %$(EXEEXT): %.cpp
184188
$(TARGETS_CPP_STATIC): %-static$(EXEEXT): %.cpp
185189
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -static $< -o $@
186190

191+
# Build these tests with -D__USE_MINGW_ANSI_STDIO=1 to make sure that tchar
192+
# routines behave as expected even when normally using mingw stdio functions.
193+
$(TARGETS_TCHAR_NARROW): %-narrow$(EXEEXT): %.c
194+
$(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@ -D__USE_MINGW_ANSI_STDIO=1
195+
196+
$(TARGETS_TCHAR_UNICODE): %-unicode$(EXEEXT): %.c
197+
$(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@ -D__USE_MINGW_ANSI_STDIO=1 -municode
198+
187199
$(TARGETS_SSP): %$(EXEEXT): %.c
188200
$(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@ -fstack-protector-strong
189201

test/tchar.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright (c) 2025 Martin Storsjo
3+
*
4+
* This file is part of llvm-mingw.
5+
*
6+
* Permission to use, copy, modify, and/or distribute this software for any
7+
* purpose with or without fee is hereby granted, provided that the above
8+
* copyright notice and this permission notice appear in all copies.
9+
*
10+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13+
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15+
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16+
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17+
*/
18+
19+
#ifdef UNICODE
20+
#define _UNICODE
21+
#endif
22+
23+
#include <stdio.h>
24+
#include <tchar.h>
25+
26+
int _tmain(int argc, TCHAR* argv[]) {
27+
_tprintf(_T("_tprintf\n"));
28+
_ftprintf(stdout, _T("_ftprintf\n"));
29+
30+
TCHAR buffer[100];
31+
_stprintf(buffer, _T("foo %d"), 123);
32+
if (_tcscmp(buffer, _T("foo 123"))) {
33+
_tprintf(_T("incorrect _stprintf output\n"));
34+
return 1;
35+
}
36+
_stprintf(buffer, _T("str %s"), _T("arg"));
37+
if (_tcscmp(buffer, _T("str arg"))) {
38+
_tprintf(_T("incorrect _stprintf output for %%s\n"));
39+
return 1;
40+
}
41+
42+
int val;
43+
if (_stscanf(_T("123"), _T("%d"), &val) != 1 || val != 123) {
44+
_tprintf(_T("incorrect _stscanf output\n"));
45+
return 1;
46+
}
47+
48+
return 0;
49+
}

0 commit comments

Comments
 (0)