[Bug c++/103635] New: size_t and uintptr_t have wrong sizes with x86_64-w64-mingw32-g++ -mabi=sysv
mark at harmstone dot com
gcc-bugzilla@gcc.gnu.org
Thu Dec 9 18:07:42 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103635
Bug ID: 103635
Summary: size_t and uintptr_t have wrong sizes with
x86_64-w64-mingw32-g++ -mabi=sysv
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: mark at harmstone dot com
Target Milestone: ---
When you add the option -mabi=sysv to mingw for amd64, it changes size_t and
uintptr_t from 64 to 32 bits.
Minimal example:
tmp.cpp:
#include <stddef.h>
static_assert(sizeof(size_t) == 8, "!");
static_assert(sizeof(uintptr_t) == 8, "!");
Working:
x86_64-pc-linux-gnu-g++ -mabi=ms -c tmp.cpp
x86_64-pc-linux-gnu-g++ -mabi=sysv -c tmp.cpp
x86_64-pc-cygwin-g++ -mabi=ms -c tmp.cpp
x86_64-pc-cygwin-g++ -mabi=sysv -c tmp.cpp
x86_64-w64-mingw32-g++ -mabi=ms -c tmp.cpp
Not working:
x86_64-w64-mingw32-g++ -mabi=sysv -c tmp.cpp
tmp.cpp:2:30: error: static assertion failed: !
2 | static_assert(sizeof(size_t) == 8, "!");
| ~~~~~~~~~~~~~~~^~~~
tmp.cpp:3:33: error: static assertion failed: !
3 | static_assert(sizeof(uintptr_t) == 8, "!");
|
My hunch is that perhaps GCC is assuming that long is the same size as a
pointer, which it's not on Windows. The SysV specs say that size_t is
equivalent to unsigned long on LP64 (but unsurprisingly doesn't mention the
LLP64 that Windows uses).
The practical problem this causes is that you can't #include <string> on mingw
with -mabi=sysv, as _mm_malloc amongst others uses size_t to do pointer
arithmetic.
More information about the Gcc-bugs
mailing list