--- gcc/tree-ssa-coalesce.c.jj	2012-10-26 18:05:03.000000000 +0200
+++ gcc/tree-ssa-coalesce.c	2012-11-16 16:09:47.302657256 +0100
@@ -1,5 +1,5 @@
 /* Coalesce SSA_NAMES together for the out-of-ssa pass.
-   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
    Contributed by Andrew MacLeod <amacleod@redhat.com>
 
@@ -1292,7 +1292,6 @@ coalesce_ssa_name (void)
   bitmap used_in_copies = BITMAP_ALLOC (NULL);
   var_map map;
   unsigned int i;
-  static hash_table <ssa_name_var_hash> ssa_name_hash;
 
   cl = create_coalesce_list ();
   map = create_outofssa_var_map (cl, used_in_copies);
@@ -1301,6 +1300,8 @@ coalesce_ssa_name (void)
      so debug info remains undisturbed.  */
   if (!optimize)
     {
+      hash_table <ssa_name_var_hash> ssa_name_hash;
+
       ssa_name_hash.create (10);
       for (i = 1; i < num_ssa_names; i++)
 	{
--- gcc/cp/class.c.jj	2012-11-16 12:39:15.000000000 +0100
+++ gcc/cp/class.c	2012-11-16 16:13:32.963262681 +0100
@@ -6567,6 +6567,9 @@ finish_struct (tree t, tree attributes)
   return t;
 }
 
+/* Hash table to avoid endless recursion when handling references.  */
+static hash_table <pointer_hash <tree_node> > fixed_type_or_null_ref_ht;
+
 /* Return the dynamic type of INSTANCE, if known.
    Used to determine whether the virtual function table is needed
    or not.
@@ -6682,9 +6685,8 @@ fixed_type_or_null (tree instance, int *
       else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE)
 	{
 	  /* We only need one hash table because it is always left empty.  */
-	  static hash_table <pointer_hash <tree_node> > ht;
-	  if (!ht.is_created ())
-	    ht.create (37); 
+	  if (!fixed_type_or_null_ref_ht.is_created ())
+	    fixed_type_or_null_ref_ht.create (37); 
 
 	  /* Reference variables should be references to objects.  */
 	  if (nonnull)
@@ -6696,15 +6698,15 @@ fixed_type_or_null (tree instance, int *
 	  if (TREE_CODE (instance) == VAR_DECL
 	      && DECL_INITIAL (instance)
 	      && !type_dependent_expression_p_push (DECL_INITIAL (instance))
-	      && !ht.find (instance))
+	      && !fixed_type_or_null_ref_ht.find (instance))
 	    {
 	      tree type;
 	      tree_node **slot;
 
-	      slot = ht.find_slot (instance, INSERT);
+	      slot = fixed_type_or_null_ref_ht.find_slot (instance, INSERT);
 	      *slot = instance;
 	      type = RECUR (DECL_INITIAL (instance));
-	      ht.remove_elt (instance);
+	      fixed_type_or_null_ref_ht.remove_elt (instance);
 
 	      return type;
 	    }
