[MLton] Port to HP-UX

Vesa Karvonen vesa.karvonen@cs.helsinki.fi
Mon, 24 Apr 2006 18:52:39 +0300


Quoting Ville Laurikari <ville@laurikari.net>:
[...]
> Anyway, I'm getting warnings like this with gcc:
>
> gc.c: In function 'GC_display':
> gc.c:343: warning: format '%u' expects type 'unsigned int', but argument 9 has type 'long int'
> gc.c:343: warning: format '%d' expects type 'int', but argument 10 has type 'long int'
> gc.c:349: warning: format '%u' expects type 'unsigned int', but argument 4 has type 'long int'
> gc.c:349: warning: format '%u' expects type 'unsigned int', but argument 5 has type 'long int'
>
> It seems that on this platform, pointer arithmetic gives a result of
> type 'long int' rather than 'int'.

Here are two relevant quotes from a C99 standard draft.  The result
of subtracting two pointers is a 'ptrdiff_t':

       [#9]  When  two pointers are subtracted, both shall point to
       elements of the same array object,  or  one  past  the  last
       element of the array object; the result is the difference of
       the subscripts of the two array elements.  The size  of  the
       result  is  implementation-defined,  and  its type (a signed
       integer type) is ptrdiff_t defined in the <stddef.h> header.
       [...]

To format a 'ptrdiff_t' value, the 't' length modifier should be used:

       [#7] The length modifiers and their meanings are:

       [...]

       t            Specifies  that a following d, i, o, u, x, or X
                    conversion specifier applies to a ptrdiff_t  or
                    the   corresponding   unsigned   integer   type
                    argument; or  that  a  following  n  conversion
                    specifier  applies  to a pointer to a ptrdiff_t
                    argument.

-Vesa Karvonen