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 <sys/types.h>
 #include <sys/mman.h>
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", \
