On 32-bit Windows platform, int and long is mixed all over the place in platform headers. The most notable example is SIZE_T, which is unsigned long, unlike size_t, which is unsigned int. %I, %z and %j formats do the right thing for those types, but clang issues a warning, leaving no good way to print SIZE_T (other than disabling warnings or adding useless casts).
GCC supports only %I for mingw targets, but allows both int and long to be used.
This is causing problems when using clang to build Wine PE files.
I'm not convinced isOSMSVCRT is the right check. The troubling typedefs are [[ https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types#size-t | SIZE_T and SSIZE_T ]], which come from the Windows API and are unrelated to Microsoft's C run-time library. I think isOSWindows would be more precise.