On Jul 14 15:34, Andre Vieira wrote:
On 14/07/15 15:18, Corinna Vinschen wrote:
On Jul 14 15:08, Andre Vieira wrote:
On 14/07/15 14:49, Corinna Vinschen wrote:
I just checked this on 32 bit Cygwin:
$ gcc -E - <<EOF
#include <inttypes.h>
#include <stdint.h>
__INT_FAST32_TYPE__
PRIdFAST32
EOF
[...]
int
"d"
If there's still anything wrong with that, feel free to send patches.
Corinna
Hi Corinna,
I am on a newer version than the linked patch.
However when I run your example I get int and "ld".
In your example, if you pass -dM, does it show INT32_EQ_LONG to be defined?
No, it's undefined. This is i686-pc-cygwin. Please have a look at
libc/include/sys/_intsup.h and try to find out why this doesn't work
for your target.
Thanks,
Corinna
Hi Corinna,
It doesn't work because PRIdFAST32 uses __PRI32(d) as a definition and in
the patch you mentioned earlier __PRI32(d) is defined as "ld" if
_INT32_EQ_LONG is defined.
However __INT_FAST32_TYPE__ is a builtin defined in '<GCC
SRC>/gcc/c-family/c-common.c' using INT_FAST32_TYPE, which is defined in
'<GCC SRC>/gcc/config/newlib-stdint.h' as:
#define INT_FAST32_TYPE (INT_TYPE_SIZE >= 32 ? "int" : INT_LEAST32_TYPE)
So if INT_TYPE_SIZE == LONG_TYPE_SIZE, int_fast32_t will be 'int' and
PRIdFAST32 will yield "ld" and printf won't like that.
Your analysis is missing something. Have another look at the check in
libc/include/sys/_intsup.h:
[...]
#undef signed
#undef int
#undef long
#define signed +0
#define int +0
#define long +1
[...]
#if __INT32_TYPE__ == 1
#define _INT32_EQ_LONG
#elif __INT32_TYPE__ == 0
/* Nothing to define because int32_t is safe to print as an int. */
#else
#error "Unable to determine type definition of int32_t"
#endif
#undef long
#undef int
#undef signed
[...]
__INT32_TYPE__ is defined by GCC as well. If __INT_FAST32_TYPE__ is
int, then why is __INT32_TYPE__ long? And if that's the right thing to
do, we need a patch to sys/_intsup.h to apply the same check to
__INT_FAST32_TYPE__ and use that to define __PRI32fast and __SCN32fast
macros.
Corinna