FreeBSD/contrib/gcc/cp/decl.c
/* Store the parameter declarations into the current function declaration.
   This is called after parsing the parameter declarations, before
   digesting the body of the function.

   Also install to binding contour return value identifier, if any.  */
Store the parameter declarations into the current function declaration.
This is called after parsing the parameter declarations, before
digesting the body of the function.

Also install to binding contour return value identifier, if any.
Store the parameter declarations into the current function declaration . This is called after parsing the parameter declarations before digesting the body of the function . Also install to binding contour return value identifier if any .
static void
store_parm_decls (tree current_function_parms)
{
  tree fndecl = current_function_decl;
  tree parm;
  tree nonparms = NULL_TREE;
  if (current_function_parms)
    {
      tree specparms = current_function_parms;
      tree next;
      current_binding_level->names = NULL;
      specparms = nreverse (specparms);
      for (parm = specparms; parm; parm = next)
	{
	  next = TREE_CHAIN (parm);
	  if (TREE_CODE (parm) == PARM_DECL)
	    {
	      if (DECL_NAME (parm) == NULL_TREE
		  || TREE_CODE (parm) != VOID_TYPE)
		pushdecl (parm);
	      else
		error ("parameter %qD declared void", parm);
	    }
	  else
	    {
	      TREE_CHAIN (parm) = NULL_TREE;
	      nonparms = chainon (nonparms, parm);
	    }
	}
      DECL_ARGUMENTS (fndecl) = getdecls ();
    }
  else
    DECL_ARGUMENTS (fndecl) = NULL_TREE;
  current_binding_level->names = chainon (nonparms, DECL_ARGUMENTS (fndecl));
  if (use_eh_spec_block (current_function_decl))
    current_eh_spec_block = begin_eh_spec_block ();
}
static void store_parm_decls ( tree current_function_parms ) { tree fndecl = current_function_decl ; tree parm ; tree nonparms = NULL_TREE ; if ( current_function_parms ) { tree specparms = current_function_parms ; tree next ; current_binding_level -> names = NULL ; specparms = nreverse ( specparms ) ; for ( parm = specparms ; parm ; parm = next ) { next = TREE_CHAIN ( parm ) ; if ( TREE_CODE ( parm ) == PARM_DECL ) { if ( DECL_NAME ( parm ) == NULL_TREE || TREE_CODE ( parm ) != VOID_TYPE ) pushdecl ( parm ) ; else error ( " " , parm ) ; } else { TREE_CHAIN ( parm ) = NULL_TREE ; nonparms = chainon ( nonparms , parm ) ; } } DECL_ARGUMENTS ( fndecl ) = getdecls ( ) ; } else DECL_ARGUMENTS ( fndecl ) = NULL_TREE ; current_binding_level -> names = chainon ( nonparms , DECL_ARGUMENTS ( fndecl ) ) ; if ( use_eh_spec_block ( current_function_decl ) ) current_eh_spec_block = begin_eh_spec_block ( ) ; }
Store the parameter declarations into the current function declaration.
Store the parameter declarations into the current function declaration .
/* This is a chain of any other decls that came in among the parm
     declarations.  If a parm is declared with  enum {foo, bar} x;
     then CONST_DECLs for foo and bar are put here.  */ /* This case is when the function was defined with an ANSI prototype.
	 The parms already have decls, so we need not do anything here
	 except record them as in effect
	 and complain if any redundant old-style parm decls were written.  */ /* Must clear this because it might contain TYPE_DECLs declared
	     at class level.  */ /* If we're doing semantic analysis, then we'll call pushdecl
	     for each of these.  We must do them in reverse order so that
	     they end in the correct forward order.  */ /* If we find an enum constant or a type tag,
		 put it aside for the moment.  */ /* Get the decls in their original chain order and record in the
	 function.  This is all and only the PARM_DECLs that were
	 pushed into scope by the loop above.  */ /* Now store the final chain of decls for the arguments
     as the decl-chain of the current lexical scope.
     Put the enumerators in as well, at the front so that
     DECL_ARGUMENTS is not modified.  */