FreeBSD/contrib/gcc/cp/decl.c
/* Go through the motions of finishing a function definition.
   We don't compile this method until after the whole class has
   been processed.

   FINISH_METHOD must return something that looks as though it
   came from GROKFIELD (since we are defining a method, after all).

   This is called after parsing the body of the function definition.
   STMTS is the chain of statements that makes up the function body.

   DECL is the ..._DECL that `start_method' provided.  */
Go through the motions of finishing a function definition.
We don't compile this method until after the whole class has
been processed.

FINISH_METHOD must return something that looks as though it
came from GROKFIELD (since we are defining a method, after all).

This is called after parsing the body of the function definition.
STMTS is the chain of statements that makes up the function body.

DECL is the ..._DECL that `start_method' provided.
Go through the motions of finishing a function definition . We don ' t compile this method until after the whole class has been processed . FINISH_METHOD must return something that looks as though it came from GROKFIELD ( since we are defining a method after all ) . This is called after parsing the body of the function definition . STMTS is the chain of statements that makes up the function body . DECL is the ... _DECL that ` start_method ' provided .
tree
finish_method (tree decl)
{
  tree fndecl = decl;
  tree old_initial;
  tree link;
  if (decl == void_type_node)
    return decl;
  old_initial = DECL_INITIAL (fndecl);
  for (link = current_binding_level->names; link; link = TREE_CHAIN (link))
    {
      if (DECL_NAME (link) != NULL_TREE)
	pop_binding (DECL_NAME (link), link);
      gcc_assert (TREE_CODE (link) != FUNCTION_DECL);
      DECL_CONTEXT (link) = NULL_TREE;
    }
  poplevel (0, 0, 0);
  DECL_INITIAL (fndecl) = old_initial;
  if (DECL_FRIEND_P (fndecl))
    {
      VEC_safe_push (tree, gc, CLASSTYPE_INLINE_FRIENDS (current_class_type),
		     fndecl);
      decl = void_type_node;
    }
  return decl;
}
tree finish_method ( tree decl ) { tree fndecl = decl ; tree old_initial ; tree link ; if ( decl == void_type_node ) return decl ; old_initial = DECL_INITIAL ( fndecl ) ; for ( link = current_binding_level -> names ; link ; link = TREE_CHAIN ( link ) ) { if ( DECL_NAME ( link ) != NULL_TREE ) pop_binding ( DECL_NAME ( link ) , link ) ; gcc_assert ( TREE_CODE ( link ) != FUNCTION_DECL ) ; DECL_CONTEXT ( link ) = NULL_TREE ; } poplevel ( 0 , 0 , 0 ) ; DECL_INITIAL ( fndecl ) = old_initial ; if ( DECL_FRIEND_P ( fndecl ) ) { VEC_safe_push ( tree , gc , CLASSTYPE_INLINE_FRIENDS ( current_class_type ) , fndecl ) ; decl = void_type_node ; } return decl ; }
Go through the motions of finishing a function definition.
Go through the motions of finishing a function definition .
/* Undo the level for the parms (from start_method).
     This is like poplevel, but it causes nothing to be
     saved.  Saving information here confuses symbol-table
     output routines.  Besides, this information will
     be correctly output when this method is actually
     compiled.  */ /* Clear out the meanings of the local variables of this level;
     also record in each decl which block it belongs to.  */ /* We used to check if the context of FNDECL was different from
     current_class_type as another way to get inside here.  This didn't work
     for String.cc in libg++.  */