For better portability, stop using the type `long`
A potential source of bugs - and one of the reasons the MSVC debug CIs hangs / displays a runtime checker popup - is the use of the long type , whose size differs in 64-bit mode on MSVC (4 bytes) vs "rest of the world" compilers (8 bytes).
(nitpicker's corner: okay, there might be a few other exceptions)
As an example, the test FUNCTION RANDOM fails here (intrinsic.c:cob_intr_random) :
seed = get_seconds_past_midnight () * (long)COB_MODULE_PTR;
Indeed, a 64-bit pointer won't fit in a 32-bit long, and the MSVC runtime checker will complain.
Wherever the size matters, I'd suggest using the C99 fixed width integer types (u)int64_t - providing a custom definition when missing. Or, we could just use cob_u64_t / cob_s64_t.
(nitpicker's corner bis: yeah, for a pointer the proper cast would be to (u)intptr_t, not (u)int64_t)
Thoughts ?
This is the wrong place for this "feature request" - please create that upstream.
Obviously:
- the calls to library functions outside of GnuCOBOL cannot be changed
- API (= external visible) changes may only be done in GC4
C99 types are nice - and should be postponed to GC4 with a fallback possibly provided by gnulib.
For the specific sample: a cast / bitwise truncation to cob_u32_t would be fine as well.
Indeed, I opened that on SF => https://sourceforge.net/p/gnucobol/feature-requests/476/.