This is test for MS-specific _stprintf() function. All test variants passes
also when compiled with MSVC compiler and run under msvcrt or UCRT runtime.

Note that gcc throws sprintf format warning for %hs usage in this test.
It is because gcc thinks that %hs takes unsigned short* argument.
But this is incorrect expectation, as all msvcrt and UCRT runtime versions
expect char* argument for %hs format. So this gcc format warning for %hs is
a gcc's bug.
---
 mingw-w64-crt/Makefile.am                 |  6 ++++
 mingw-w64-crt/testcases/t_stprintf0_a.c   |  3 ++
 mingw-w64-crt/testcases/t_stprintf0_u.c   |  3 ++
 mingw-w64-crt/testcases/t_stprintf1_a.c   |  3 ++
 mingw-w64-crt/testcases/t_stprintf1_u.c   |  3 ++
 mingw-w64-crt/testcases/t_stprintf_a.c    |  2 ++
 mingw-w64-crt/testcases/t_stprintf_tmpl.h | 34 +++++++++++++++++++++++
 mingw-w64-crt/testcases/t_stprintf_u.c    |  2 ++
 8 files changed, 56 insertions(+)
 create mode 100644 mingw-w64-crt/testcases/t_stprintf0_a.c
 create mode 100644 mingw-w64-crt/testcases/t_stprintf0_u.c
 create mode 100644 mingw-w64-crt/testcases/t_stprintf1_a.c
 create mode 100644 mingw-w64-crt/testcases/t_stprintf1_u.c
 create mode 100644 mingw-w64-crt/testcases/t_stprintf_a.c
 create mode 100644 mingw-w64-crt/testcases/t_stprintf_tmpl.h
 create mode 100644 mingw-w64-crt/testcases/t_stprintf_u.c

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index b80e80d96a01..2b503ff190d5 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -4199,6 +4199,12 @@ testcase_progs = \
   testcases/t_snwprintf \
   testcases/t_snwprintf0 \
   testcases/t_snwprintf1 \
+  testcases/t_stprintf_a \
+  testcases/t_stprintf_u \
+  testcases/t_stprintf0_a \
+  testcases/t_stprintf0_u \
+  testcases/t_stprintf1_a \
+  testcases/t_stprintf1_u \
   testcases/t_setjmp \
   testcases/t_sigv \
   testcases/t_speed_powl \
diff --git a/mingw-w64-crt/testcases/t_stprintf0_a.c 
b/mingw-w64-crt/testcases/t_stprintf0_a.c
new file mode 100644
index 000000000000..be532590d18e
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf0_a.c
@@ -0,0 +1,3 @@
+#define __USE_MINGW_ANSI_STDIO 0
+#undef _UNICODE
+#include "t_stprintf_tmpl.h"
diff --git a/mingw-w64-crt/testcases/t_stprintf0_u.c 
b/mingw-w64-crt/testcases/t_stprintf0_u.c
new file mode 100644
index 000000000000..bf02c32981cf
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf0_u.c
@@ -0,0 +1,3 @@
+#define __USE_MINGW_ANSI_STDIO 0
+#define _UNICODE
+#include "t_stprintf_tmpl.h"
diff --git a/mingw-w64-crt/testcases/t_stprintf1_a.c 
b/mingw-w64-crt/testcases/t_stprintf1_a.c
new file mode 100644
index 000000000000..e7109aae6281
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf1_a.c
@@ -0,0 +1,3 @@
+#define __USE_MINGW_ANSI_STDIO 1
+#undef _UNICODE
+#include "t_stprintf_tmpl.h"
diff --git a/mingw-w64-crt/testcases/t_stprintf1_u.c 
b/mingw-w64-crt/testcases/t_stprintf1_u.c
new file mode 100644
index 000000000000..890c0d5fd2f9
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf1_u.c
@@ -0,0 +1,3 @@
+#define __USE_MINGW_ANSI_STDIO 1
+#define _UNICODE
+#include "t_stprintf_tmpl.h"
diff --git a/mingw-w64-crt/testcases/t_stprintf_a.c 
b/mingw-w64-crt/testcases/t_stprintf_a.c
new file mode 100644
index 000000000000..af64991ce411
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf_a.c
@@ -0,0 +1,2 @@
+#undef _UNICODE
+#include "t_stprintf_tmpl.h"
diff --git a/mingw-w64-crt/testcases/t_stprintf_tmpl.h 
b/mingw-w64-crt/testcases/t_stprintf_tmpl.h
new file mode 100644
index 000000000000..a3d54a631e68
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf_tmpl.h
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <string.h>
+#include <wchar.h>
+#include <tchar.h>
+
+int main() {
+  int i;
+  TCHAR buffer[10] = { _T('X'), _T('X'), _T('X'), _T('X'), _T('X'), _T('X'), 
_T('X'), _T('X'), _T('X'), _T('X') };
+#ifdef _UNICODE
+  int exp_sizeof_buffer = 2*10;
+#else
+  int exp_sizeof_buffer = 10;
+#endif
+  /* _stprintf format:
+   * %s takes _T string
+   * %hs takes char* string
+   * %ls takes wchar_t* string
+   */
+  int ret = _stprintf(buffer, _T("%sBB%hs%ls"), _T("AA"), "CC", L"DD");
+  if (sizeof(buffer) != exp_sizeof_buffer) {
+    fprintf(stderr, "sizeof(buffer): expected=%d got=%d\n", exp_sizeof_buffer, 
(int)sizeof(buffer));
+    return 1;
+  }
+  if (ret != 8 || memcmp(buffer, _T("AABBCCDD\0X"), sizeof(buffer)) != 0) {
+    fprintf(stderr, "ret: expected=8 got=%d\n", ret);
+    fprintf(stderr, "buffer:");
+    for (i = 0; i < 10; i++) {
+      fprintf(stderr, " 0x%02x", (int)buffer[i]);
+    }
+    fprintf(stderr, "\n");
+    return 1;
+  }
+  return 0;
+}
diff --git a/mingw-w64-crt/testcases/t_stprintf_u.c 
b/mingw-w64-crt/testcases/t_stprintf_u.c
new file mode 100644
index 000000000000..4918e66734e1
--- /dev/null
+++ b/mingw-w64-crt/testcases/t_stprintf_u.c
@@ -0,0 +1,2 @@
+#define _UNICODE
+#include "t_stprintf_tmpl.h"
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to