Index: gcc/defaults.h =================================================================== --- gcc/defaults.h (revision 132578) +++ gcc/defaults.h (working copy) @@ -423,6 +423,22 @@ #define LONG_TYPE_SIZE BITS_PER_WORD #endif +#ifndef INT_FAST8_TYPE_SIZE +#define INT_FAST8_TYPE_SIZE -1 +#endif + +#ifndef INT_FAST16_TYPE_SIZE +#define INT_FAST16_TYPE_SIZE -1 +#endif + +#ifndef INT_FAST32_TYPE_SIZE +#define INT_FAST32_TYPE_SIZE -1 +#endif + +#ifndef INT_FAST64_TYPE_SIZE +#define INT_FAST64_TYPE_SIZE -1 +#endif + #ifndef LONG_LONG_TYPE_SIZE #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2) #endif Index: gcc/config/linux.h =================================================================== --- gcc/config/linux.h (revision 132578) +++ gcc/config/linux.h (working copy) @@ -130,3 +130,17 @@ #define TARGET_HAS_SINCOS (OPTION_GLIBC) #define TARGET_POSIX_IO + +/* On Linux, the int_fastN_t types have the following sizes. */ +#if TARGET_64BIT +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 64 +#define INT_FAST32_TYPE_SIZE 64 +#define INT_FAST64_TYPE_SIZE 64 +#else +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 32 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 +#endif + Index: gcc/config/i386/mingw32.h =================================================================== --- gcc/config/i386/mingw32.h (revision 132578) +++ gcc/config/i386/mingw32.h (working copy) @@ -135,6 +135,12 @@ #undef WINT_TYPE #define WINT_TYPE "short unsigned int" +/* On Windows, the int_fastN_t types have size N. */ +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 16 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 + /* mingw32 uses the -mthreads option to enable thread support. */ #undef GOMP_SELF_SPECS #define GOMP_SELF_SPECS "%{fopenmp: -mthreads}" Index: gcc/config/sol2-10.h =================================================================== --- gcc/config/sol2-10.h (revision 132578) +++ gcc/config/sol2-10.h (working copy) @@ -21,3 +21,11 @@ /* Solaris 10 has the float and long double forms of math functions. */ #undef TARGET_C99_FUNCTIONS #define TARGET_C99_FUNCTIONS 1 + +/* Starting with Solaris 10, the int_fastN_t types have size N. + Before, they weren't defined. */ +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 32 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 + Index: gcc/config/rs6000/aix.h =================================================================== --- gcc/config/rs6000/aix.h (revision 132578) +++ gcc/config/rs6000/aix.h (working copy) @@ -256,3 +256,10 @@ /* WINT_TYPE */ #define WINT_TYPE "int" + +/* On AIX, the int_fastN_t types have size N. */ +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 16 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 + Index: gcc/config/darwin.h =================================================================== --- gcc/config/darwin.h (revision 132578) +++ gcc/config/darwin.h (working copy) @@ -72,6 +72,12 @@ #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE 32 +/* On MacOS, the int_fastN_t types have size N. */ +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 16 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 + /* Default to using the NeXT-style runtime, since that's what is pre-installed on Darwin systems. */ Index: gcc/config/mips/iris6.h =================================================================== --- gcc/config/mips/iris6.h (revision 132578) +++ gcc/config/mips/iris6.h (working copy) @@ -116,3 +116,9 @@ #undef SUBTARGET_CPP_SPEC #define SUBTARGET_CPP_SPEC "%{pthread:-D_REENTRANT}" +/* On IRIX 6.x, the int_fastN_t types have size N. */ +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 16 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 + Index: gcc/config/openbsd.h =================================================================== --- gcc/config/openbsd.h (revision 132578) +++ gcc/config/openbsd.h (working copy) @@ -306,5 +306,11 @@ perror ("mprotect of trampoline code"); \ } +/* On recent OpenBSD, the int_fastN_t types have size N. */ +#define INT_FAST8_TYPE_SIZE 8 +#define INT_FAST16_TYPE_SIZE 16 +#define INT_FAST32_TYPE_SIZE 32 +#define INT_FAST64_TYPE_SIZE 64 + #include #include Index: gcc/fortran/iso-c-binding.def =================================================================== --- gcc/fortran/iso-c-binding.def (revision 132578) +++ gcc/fortran/iso-c-binding.def (working copy) @@ -75,12 +74,36 @@ NAMED_INTCST (ISOCBINDING_INT_LEAST64_T, "c_int_least64_t", \ get_int_kind_from_minimal_width (64)) -/* TODO: Implement c_int_fast*_t. Depends on PR 448. */ +/* The c_int_fast*_t values depend on target macros. */ +#if INT_FAST8_TYPE_SIZE > 0 +NAMED_INTCST (ISOCBINDING_INT_FAST8_T, "c_int_fast8_t", \ + get_int_kind_from_width (INT_FAST8_TYPE_SIZE)) +#else NAMED_INTCST (ISOCBINDING_INT_FAST8_T, "c_int_fast8_t", -2) +#endif + +#if INT_FAST16_TYPE_SIZE > 0 +NAMED_INTCST (ISOCBINDING_INT_FAST16_T, "c_int_fast16_t", \ + get_int_kind_from_width (INT_FAST16_TYPE_SIZE)) +#else NAMED_INTCST (ISOCBINDING_INT_FAST16_T, "c_int_fast16_t", -2) +#endif + +#if INT_FAST32_TYPE_SIZE > 0 +NAMED_INTCST (ISOCBINDING_INT_FAST32_T, "c_int_fast32_t", \ + get_int_kind_from_width (INT_FAST32_TYPE_SIZE)) +#else NAMED_INTCST (ISOCBINDING_INT_FAST32_T, "c_int_fast32_t", -2) +#endif + +#if INT_FAST64_TYPE_SIZE > 0 +NAMED_INTCST (ISOCBINDING_INT_FAST64_T, "c_int_fast64_t", \ + get_int_kind_from_width (INT_FAST64_TYPE_SIZE)) +#else NAMED_INTCST (ISOCBINDING_INT_FAST64_T, "c_int_fast64_t", -2) +#endif + NAMED_REALCST (ISOCBINDING_FLOAT, "c_float", \ get_real_kind_from_node (float_type_node)) NAMED_REALCST (ISOCBINDING_DOUBLE, "c_double", \