On Thu, 27 Mar 2025, Martin Storsjö wrote:

On Thu, 20 Mar 2025, Pali Rohár wrote:

Currently all 32-bit non-UCRT builds are forced to use time_t type as
32-bit and also all time_t functions in 32-bit form.

With this change, any msvcrt.dll based 32-bit application can use 64-bit
time_t functions by defining -D_TIME_BITS=64 flag during compilation.

Flag -D_TIME_BITS=64 is recognized also by GNU C library header files for
the same purpose.

When both _USE_32BIT_TIME_T and _TIME_BITS are defined by application then
_USE_32BIT_TIME_T override effect of _TIME_BITS.
---
mingw-w64-headers/crt/_mingw.h.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

I had a read through the rest of this patch series, and I didn't find anything else by reading that would be a problem.

I did try running this through my "CI" setup on github, and that did uncover a problem though: https://github.com/mstorsjo/mingw-w64/actions/runs/14106946049

The libcxx testsuite now fails with this patchset applied. Tests fail with an error like this:

# .---command stderr------------
# | In file included from D:\a\mingw-w64\mingw-w64\llvm-project\libcxx\test\libcxx\input.output\iostream.format\output.streams\ostream.formatted\ostream.formatted.print\vprint_unicode.pass.cpp:37: # | D:/a/mingw-w64/mingw-w64/llvm-project/libcxx/test/support/filesystem_test_helper.h:147:28: error: cannot initialize a member subobject of type '_dev_t' (aka 'unsigned int') with an rvalue of type 'const value_type *' (aka 'const char *')
# |   147 |         return ::stat(path.c_str(), &tmp) == 0;
# |       |                       ~~~~~^~~~~~~
# | D:/a/mingw-w64/mingw-w64/llvm-project/libcxx/test/support/filesystem_test_helper.h:147:43: error: invalid operands to binary expression ('::stat' and 'int')
# |   147 |         return ::stat(path.c_str(), &tmp) == 0;
# |       |                ~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~
# | C:/llvm-mingw/include/guiddef.h:180:15: note: candidate function not viable: no known conversion from '::stat' to 'const GUID' (aka 'const _GUID') for 1st argument # | 180 | __inline bool operator== (REFGUID guidOne, REFGUID guidOther) { return !!IsEqualGUID (guidOne, guidOther); }
# |       |               ^           ~~~~~~~~~~~~~~~
# | 2 errors generated.
# `-----------------------------

I can also reproduce similar errors by trying to compile this small standalone test snippet:

#include <sys/stat.h>
#include <string>
bool exists(std::string const& path) {
   struct ::stat tmp;
   return ::stat(path.c_str(), &tmp) == 0;
}

Building this snippet, with a toolchain with this patchset applied, errors out like this:

exists.cpp:5:12: error: no matching constructor for initialization of '::stat'
   5 |     return ::stat(path.c_str(), &tmp) == 0;
     |            ^      ~~~~~~~~~~~~~~~~~~
/home/martin/clang-trunk/x86_64-w64-mingw32/include/sys/stat.h:129:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
 129 | struct stat {
     |        ^~~~
/home/martin/clang-trunk/x86_64-w64-mingw32/include/sys/stat.h:129:8: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided
 129 | struct stat {
     |        ^~~~
/home/martin/clang-trunk/x86_64-w64-mingw32/include/sys/stat.h:129:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided exists.cpp:5:39: error: invalid operands to binary expression ('::stat' and 'int')
   5 |     return ::stat(path.c_str(), &tmp) == 0;
     |            ~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~
2 errors generated.

Lasse pointed out that this seems to be due to __CRT__NO_INLINE - when building without optimizations, that is defined, and we get these errors. If building with optimizations enabled, it builds fine.

Needless to say, our headers need to work both with and without optimizations...

// Martin

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

Reply via email to