diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f06ccc5080dc512a35e4b5d1316d929f22efd87a..8a2dd2263caa961a71c1eed801d688488dd4dce2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2007-09-04  Laurynas Biveinis  <laurynas.biveinis@gmail.com>
+
+	* c-format.c: Include alloc-pool.h.
+	(check_format_info_main): New argument fwt_alloc.  Use allocation
+	pool instead of GC.  Remove GC deallocation code.
+	(check_format_arg): Create allocation pool, pass it to
+	check_format_info_main and free it afterwards.
+	* Makefile.in (c-format.o): Add alloc-pool.h dependency.
+
 2007-09-05  Ben Elliston  <bje@au.ibm.com>
 
 	* config/rs6000/ppu_intrinsics.h (__protected_stream_count):
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 1979b72e6d036d2695becc46180c1ac5710dabb1..1846b8e6baf3313153a9c157cc3b46daa78cfafa 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1810,7 +1810,8 @@ attribs.o : attribs.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
 	$(TARGET_H) langhooks.h $(CPPLIB_H)
 
 c-format.o : c-format.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) langhooks.h \
-	$(C_COMMON_H) $(FLAGS_H) toplev.h intl.h $(DIAGNOSTIC_H) c-format.h
+	$(C_COMMON_H) $(FLAGS_H) toplev.h intl.h $(DIAGNOSTIC_H) alloc-pool.h \
+	c-format.h
 
 c-semantics.o : c-semantics.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
 	$(TREE_H) $(FLAGS_H) toplev.h output.h $(RTL_H) $(GGC_H) \
diff --git a/gcc/c-format.c b/gcc/c-format.c
index a4965418d538b8d8961622097e0a1237a7a499df..25cf859a161fa4aad5cc86988497f36d5fd09f05 100644
--- a/gcc/c-format.c
+++ b/gcc/c-format.c
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "diagnostic.h"
 #include "langhooks.h"
 #include "c-format.h"
+#include "alloc-pool.h"
 
 /* Set format warning options according to a -Wformat=n option.  */
 
@@ -821,7 +822,7 @@ static void check_format_arg (void *, tree, unsigned HOST_WIDE_INT);
 static void check_format_info_main (format_check_results *,
 				    function_format_info *,
 				    const char *, int, tree,
-				    unsigned HOST_WIDE_INT);
+                                    unsigned HOST_WIDE_INT, alloc_pool);
 
 static void init_dollar_format_checking (int, tree);
 static int maybe_read_dollar_number (const char **, int,
@@ -1300,6 +1301,7 @@ check_format_arg (void *ctx, tree format_tree,
   const char *format_chars;
   tree array_size = 0;
   tree array_init;
+  alloc_pool fwt_pool;
 
   if (integer_zerop (format_tree))
     {
@@ -1424,8 +1426,11 @@ check_format_arg (void *ctx, tree format_tree,
      will decrement it if it finds there are extra arguments, but this way
      need not adjust it for every return.  */
   res->number_other++;
+  fwt_pool = create_alloc_pool ("format_wanted_type pool",
+                                sizeof (format_wanted_type), 10);
   check_format_info_main (res, info, format_chars, format_length,
-			  params, arg_num);
+                          params, arg_num, fwt_pool);
+  free_alloc_pool (fwt_pool);
 }
 
 
@@ -1440,7 +1445,7 @@ static void
 check_format_info_main (format_check_results *res,
 			function_format_info *info, const char *format_chars,
 			int format_length, tree params,
-			unsigned HOST_WIDE_INT arg_num)
+                        unsigned HOST_WIDE_INT arg_num, alloc_pool fwt_pool)
 {
   const char *orig_format_chars = format_chars;
   tree first_fillin_param = params;
@@ -2087,7 +2092,8 @@ check_format_info_main (format_check_results *res,
 	      fci = fci->chain;
 	      if (fci)
 		{
-		  wanted_type_ptr = GGC_NEW (format_wanted_type);
+                  wanted_type_ptr = (format_wanted_type *)
+                      pool_alloc (fwt_pool);
 		  arg_num++;
 		  wanted_type = *fci->types[length_chars_val].type;
 		  wanted_type_name = fci->types[length_chars_val].name;
@@ -2098,17 +2104,6 @@ check_format_info_main (format_check_results *res,
       if (first_wanted_type != 0)
 	check_format_types (first_wanted_type, format_start,
 			    format_chars - format_start);
-
-      if (main_wanted_type.next != NULL)
-	{
-	  format_wanted_type *wanted_type_ptr = main_wanted_type.next;
-	  while (wanted_type_ptr)
-	    {
-	      format_wanted_type *next = wanted_type_ptr->next;
-	      ggc_free (wanted_type_ptr);
-	      wanted_type_ptr = next;
-	    }
-	}
     }
 }