cleanup = start_anon_func ();
flag_access_control = saved_flag_access_control;
expand_static_init (decl, init)     tree decl;     tree init;{  tree oldstatic = value_member (decl, static_aggregates);  if (oldstatic)    {      if (TREE_PURPOSE (oldstatic) && init != NULL_TREE)	cp_error ("multiple initializations given for `%D'", decl);    }  else if (! toplevel_bindings_p ())    {      /* Emit code to perform this initialization but once.  */      tree temp;      /* Remember this information until end of file.  */      push_obstacks (&permanent_obstack, &permanent_obstack);      /* Emit code to perform this initialization but once.  This code	 looks like:           static int temp = 0;           if (!temp) {             // Do initialization.	     temp = 1;	     // Register variable for destruction at end of program.	   }	 Note that the `temp' variable is only set to 1 *after* the	 initialization is complete.  This ensures that an exception,	 thrown during the construction, will cause the variable to	 reinitialized when we pass through this code again, as per:	 	   [stmt.dcl]	   If the initialization exits by throwing an exception, the	   initialization is not complete, so it will be tried again	   the next time control enters the declaration.         In theory, this process should be thread-safe, too; multiple	 threads should not be able to initialize the variable more	 than once.  We don't yet attempt to ensure thread-safety.  */      temp = get_temp_name (integer_type_node, 1);      rest_of_decl_compilation (temp, NULL_PTR, 0, 0);      /* Begin the conditional initialization.  */      expand_start_cond (build_binary_op (EQ_EXPR, temp,					  integer_zero_node), 0);      expand_start_target_temps ();      /* Do the initialization itself.  */      if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))	  || (init && TREE_CODE (init) == TREE_LIST))	{	  expand_aggr_init (decl, init, 0);	  do_pending_stack_adjust ();	}      else if (init)	expand_assignment (decl, init, 0, 0);      /* Set TEMP to 1.  */      expand_assignment (temp, integer_one_node, 0, 0);      /* Cleanup any temporaries needed for the initial value.  If	 destroying one of the temporaries causes an exception to be	 thrown, then the object itself has still been fully	 constructed.  */      expand_end_target_temps ();      /* Use atexit to register a function for destroying this static	 variable.  */      if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))	{	  tree cleanup, fcall;	  static tree Atexit = 0;	  if (Atexit == 0)	    {	      tree atexit_fndecl, PFV, pfvlist;	      /* Remember this information until end of file.  */	      push_obstacks (&permanent_obstack, &permanent_obstack);	      PFV = build_pointer_type (build_function_type					(void_type_node, void_list_node));	      pfvlist = tree_cons (NULL_TREE, PFV, void_list_node);	      push_lang_context (lang_name_c);	      atexit_fndecl		= builtin_function ("atexit",				    build_function_type (void_type_node,							 pfvlist),				    NOT_BUILT_IN, NULL_PTR);	      mark_used (atexit_fndecl);	      Atexit = default_conversion (atexit_fndecl);	      pop_lang_context ();	      pop_obstacks ();	    }	      	  /* Call build_cleanup before we enter the anonymous function	     so that any access checks will be done relative to the	     current scope, rather than the scope of the anonymous	     function.  */	  fcall = build_cleanup (decl);	  cleanup = start_anon_func ();	  expand_expr_stmt (fcall);	  end_anon_func ();	  mark_addressable (cleanup);	  cleanup = build_unary_op (ADDR_EXPR, cleanup, 0);	  fcall = build_function_call (Atexit, expr_tree_cons (NULL_TREE, cleanup, NULL_TREE));	  expand_expr_stmt (fcall);	}      expand_end_cond ();      /* Resume old (possibly temporary) allocation.  */      pop_obstacks ();    }  else    {      /* This code takes into account memory allocation policy of	 `start_decl'.  Namely, if TYPE_NEEDS_CONSTRUCTING does not	 hold for this object, then we must make permanent the storage	 currently in the temporary obstack.  */      if (!TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))	preserve_initializer ();      static_aggregates = perm_tree_cons (init, decl, static_aggregates);    }}