--- gcc/cp/decl.c.orig	2012-11-11 01:40:23.000000000 +0900
+++ gcc/cp/decl.c	2012-11-11 02:00:41.000000000 +0900
@@ -475,6 +475,14 @@
 
 /* The binding level currently in effect.  */
 
+#define set_current_binding_level(val)				\
+	do {							\
+		if (cfun)					\
+			cp_function_chain->bindings = (val);	\
+		else						\
+			scope_chain->bindings = (val);		\
+	} while (0 /*CONSTCOND*/)
+
 #define current_binding_level			\
   (cfun						\
    ? cp_function_chain->bindings		\
@@ -523,7 +531,7 @@
      are active.  */
   memset ((char*) newlevel, 0, sizeof (struct binding_level));
   newlevel->level_chain = current_binding_level;
-  current_binding_level = newlevel;
+  set_current_binding_level(newlevel);
   newlevel->tag_transparent = tag_transparent;
   newlevel->more_cleanups_ok = 1;
 
@@ -579,7 +587,7 @@
 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
   {
     register struct binding_level *level = current_binding_level;
-    current_binding_level = current_binding_level->level_chain;
+    set_current_binding_level(current_binding_level->level_chain);
     level->level_chain = free_binding_level;
 #if 0 /* defined(DEBUG_CP_BINDING_LEVELS) */
     if (level->binding_depth != binding_depth)
@@ -594,7 +602,7 @@
 suspend_binding_level ()
 {
   if (class_binding_level)
-    current_binding_level = class_binding_level;
+    set_current_binding_level(class_binding_level);
 
   if (global_binding_level)
     {
@@ -616,7 +624,7 @@
     }
   is_class_level = 0;
 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
-  current_binding_level = current_binding_level->level_chain;
+  set_current_binding_level(current_binding_level->level_chain);
   find_class_binding_level ();
 }
 
@@ -629,7 +637,7 @@
   my_friendly_assert(!class_binding_level, 386);
   /* Also, resuming a non-directly nested namespace is a no-no.  */
   my_friendly_assert(b->level_chain == current_binding_level, 386);
-  current_binding_level = b;
+  set_current_binding_level(b);
 #if defined(DEBUG_CP_BINDING_LEVELS)
   b->binding_depth = binding_depth;
   indent ();
@@ -2813,7 +2821,7 @@
 	    DECL_IGNORED_P (d) = 1;
 
 	  TYPE_CONTEXT (type) = DECL_CONTEXT (d);
-	  DECL_ASSEMBLER_NAME (d) = DECL_NAME (d);
+	  SET_DECL_ASSEMBLER_NAME (d, DECL_NAME (d));
 
 	  /* If this is a local class, keep track of it.  We need this
 	     information for name-mangling, and so that it is possible to find
@@ -2828,10 +2836,9 @@
 	  if (!uses_template_parms (type))
 	    {
 	      if (flag_new_abi)
-		DECL_ASSEMBLER_NAME (d) = mangle_type (type);
+		SET_DECL_ASSEMBLER_NAME (d, mangle_type (type));
 	      else
-		DECL_ASSEMBLER_NAME (d)
-		  = get_identifier (build_overload_name (type, 1, 1));
+		SET_DECL_ASSEMBLER_NAME (d, get_identifier (build_overload_name (type, 1, 1)));
 	    }
         }
       if (b->parm_flag == 2)
@@ -3153,7 +3160,7 @@
 	     will be banished.  */
 	  DECL_LANGUAGE (olddecl) = DECL_LANGUAGE (newdecl);
 	  DECL_RTL (olddecl) = DECL_RTL (newdecl);
-	  DECL_ASSEMBLER_NAME (olddecl) = DECL_ASSEMBLER_NAME (newdecl);
+	  SET_DECL_ASSEMBLER_NAME (olddecl, DECL_ASSEMBLER_NAME (newdecl));
 	  SET_IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (newdecl),
 				       newdecl);
 	}
@@ -3620,7 +3627,7 @@
       if (! types_match)
 	{
 	  DECL_LANGUAGE (olddecl) = DECL_LANGUAGE (newdecl);
-	  DECL_ASSEMBLER_NAME (olddecl) = DECL_ASSEMBLER_NAME (newdecl);
+	  SET_DECL_ASSEMBLER_NAME (olddecl, DECL_ASSEMBLER_NAME (newdecl));
 	  DECL_RTL (olddecl) = DECL_RTL (newdecl);
 	}
       if (! types_match || new_defines_function)
@@ -3670,7 +3677,7 @@
   TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl);
   TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl);
   DECL_COMMON (newdecl) = DECL_COMMON (olddecl);
-  DECL_ASSEMBLER_NAME (newdecl) = DECL_ASSEMBLER_NAME (olddecl);
+  SET_DECL_ASSEMBLER_NAME (newdecl, DECL_ASSEMBLER_NAME (olddecl));
 
   if (TREE_CODE (newdecl) == FUNCTION_DECL)
     {
@@ -4231,9 +4238,9 @@
   else
     {
       b = current_binding_level;
-      current_binding_level = level;
+      set_current_binding_level(level);
       x = pushdecl (x);
-      current_binding_level = b;
+      set_current_binding_level(b);
     }
   current_function_decl = function_decl;
   return x;
@@ -6327,7 +6334,7 @@
   current_lang_name = lang_name_c;
 
   current_function_decl = NULL_TREE;
-  current_binding_level = NULL_BINDING_LEVEL;
+  set_current_binding_level(NULL_BINDING_LEVEL);
   free_binding_level = NULL_BINDING_LEVEL;
 
   build_common_tree_nodes (flag_signed_char);
@@ -6671,7 +6678,7 @@
      we cannot change DECL_ASSEMBLER_NAME until we have installed this
      function in the namespace.  */
   if (libname)
-    DECL_ASSEMBLER_NAME (decl) = get_identifier (libname);
+    SET_DECL_ASSEMBLER_NAME (decl, get_identifier (libname));
   make_decl_rtl (decl, NULL);
 
   return decl;
@@ -7514,10 +7521,10 @@
 	  if (TREE_PUBLIC (decl))
 	    {
 	      if (flag_new_abi)
-		DECL_ASSEMBLER_NAME (decl) = mangle_decl (decl);
+		SET_DECL_ASSEMBLER_NAME (decl, mangle_decl (decl));
 	      else
-		DECL_ASSEMBLER_NAME (decl)
-		  = build_static_name (current_function_decl, DECL_NAME (decl));
+		SET_DECL_ASSEMBLER_NAME (decl,
+		  build_static_name (current_function_decl, DECL_NAME (decl)));
 	    }
 	  else
 	    {
@@ -7706,7 +7713,7 @@
 
   /* Set the DECL_ASSEMBLER_NAME for the variable.  */
   if (asmspec)
-    DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
+    SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
 
   /* We don't create any RTL for local variables.  */
   if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl))
@@ -8019,7 +8026,7 @@
       /* This must override the asm specifier which was placed by
 	 grokclassfn.  Lay this out fresh.  */
       DECL_RTL (TREE_TYPE (decl)) = NULL_RTX;
-      DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
+      SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
       make_decl_rtl (decl, asmspec);
     }
 
@@ -8957,10 +8964,10 @@
       if (!uses_template_parms (decl))
 	{
 	  if (flag_new_abi)
-	    DECL_ASSEMBLER_NAME (decl) = mangle_decl (decl);
+	    SET_DECL_ASSEMBLER_NAME (decl, mangle_decl (decl));
 	  else
-	    DECL_ASSEMBLER_NAME (decl) = build_static_name (basetype,
-							    declarator);
+	    SET_DECL_ASSEMBLER_NAME (decl, build_static_name (basetype,
+							    declarator));
 	}
     }
   else
@@ -8988,10 +8995,10 @@
       if (declarator && context && current_lang_name != lang_name_c)
 	{
 	  if (flag_new_abi)
-	    DECL_ASSEMBLER_NAME (decl) = mangle_decl (decl);
+	    SET_DECL_ASSEMBLER_NAME (decl, mangle_decl (decl));
 	  else
-	    DECL_ASSEMBLER_NAME (decl)
-	      = build_static_name (context, declarator);
+	    SET_DECL_ASSEMBLER_NAME (decl,
+	      build_static_name (context, declarator));
 	}
     }
 
@@ -9860,10 +9867,10 @@
   if (decl_context == NORMAL && !toplevel_bindings_p ())
     {
       struct binding_level *b = current_binding_level;
-      current_binding_level = b->level_chain;
+      set_current_binding_level(b->level_chain);
       if (current_binding_level != 0 && toplevel_bindings_p ())
 	decl_context = PARM;
-      current_binding_level = b;
+      set_current_binding_level(b);
     }
 
   if (name == NULL)
@@ -11027,7 +11034,7 @@
 	      = TYPE_IDENTIFIER (type);
 
 	  if (flag_new_abi)
-	    DECL_ASSEMBLER_NAME (decl) = mangle_type (type);
+	    SET_DECL_ASSEMBLER_NAME (decl, mangle_type (type));
 	  else
 	    {
 	      /* XXX Temporarily set the scope.
@@ -11039,9 +11046,9 @@
 	      else
 		DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace);
 
-	      DECL_ASSEMBLER_NAME (decl) = DECL_NAME (decl);
-	      DECL_ASSEMBLER_NAME (decl)
-		= get_identifier (build_overload_name (type, 1, 1));
+	      SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
+	      SET_DECL_ASSEMBLER_NAME (decl,
+		get_identifier (build_overload_name (type, 1, 1)));
 	      DECL_CONTEXT (decl) = NULL_TREE;
 	    }
 
@@ -13445,7 +13452,7 @@
      FIXME factor out the non-RTL stuff.  */
   bl = current_binding_level;
   init_function_start (decl1, input_filename, lineno);
-  current_binding_level = bl;
+  set_current_binding_level(bl);
 
   /* Even though we're inside a function body, we still don't want to
      call expand_expr to calculate the size of a variable-sized array.
