c-decl.c revision 117421
118334Speter/* Process declarations and variables for C compiler.
290075Sobrien   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
390075Sobrien   2001, 2002 Free Software Foundation, Inc.
418334Speter
590075SobrienThis file is part of GCC.
618334Speter
790075SobrienGCC is free software; you can redistribute it and/or modify it under
890075Sobrienthe terms of the GNU General Public License as published by the Free
990075SobrienSoftware Foundation; either version 2, or (at your option) any later
1090075Sobrienversion.
1118334Speter
1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590075Sobrienfor more details.
1618334Speter
1718334SpeterYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
1990075SobrienSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA
2090075Sobrien02111-1307, USA.  */
2118334Speter
2296549Sobrien/* $FreeBSD: head/contrib/gcc/c-decl.c 117421 2003-07-11 05:11:14Z kan $ */
2396549Sobrien
2418334Speter/* Process declarations and symbol lookup for C front end.
2518334Speter   Also constructs types; the standard scalar types at initialization,
2618334Speter   and structure, union, array and enum types when they are declared.  */
2718334Speter
2818334Speter/* ??? not all decl nodes are given the most useful possible
2918334Speter   line numbers.  For example, the CONST_DECLs for enum values.  */
3018334Speter
3118334Speter#include "config.h"
3250397Sobrien#include "system.h"
3390075Sobrien#include "intl.h"
3418334Speter#include "tree.h"
3590075Sobrien#include "tree-inline.h"
3690075Sobrien#include "rtl.h"
3718334Speter#include "flags.h"
3890075Sobrien#include "function.h"
3918334Speter#include "output.h"
4090075Sobrien#include "expr.h"
4118334Speter#include "c-tree.h"
4250397Sobrien#include "toplev.h"
4390075Sobrien#include "ggc.h"
4490075Sobrien#include "tm_p.h"
4550397Sobrien#include "cpplib.h"
4690075Sobrien#include "target.h"
4790075Sobrien#include "debug.h"
4890075Sobrien#include "timevar.h"
4990075Sobrien#include "c-common.h"
5096263Sobrien#include "c-pragma.h"
51117421Skan#include "libfuncs.h"
52117421Skan#include "except.h"
5350397Sobrien
5418334Speter/* In grokdeclarator, distinguish syntactic contexts of declarators.  */
5518334Speterenum decl_context
5618334Speter{ NORMAL,			/* Ordinary declaration */
5718334Speter  FUNCDEF,			/* Function definition */
5818334Speter  PARM,				/* Declaration of parm before function body */
5918334Speter  FIELD,			/* Declaration inside struct or union */
6096263Sobrien  BITFIELD,			/* Likewise but with specified width */
6118334Speter  TYPENAME};			/* Typename (inside cast or sizeof)  */
6218334Speter
6318334Speter
6418334Speter/* Nonzero if we have seen an invalid cross reference
6518334Speter   to a struct, union, or enum, but not yet printed the message.  */
6618334Speter
6718334Spetertree pending_invalid_xref;
6818334Speter/* File and line to appear in the eventual error message.  */
6990075Sobrienconst char *pending_invalid_xref_file;
7018334Speterint pending_invalid_xref_line;
7118334Speter
7218334Speter/* While defining an enum type, this is 1 plus the last enumerator
7318334Speter   constant value.  Note that will do not have to save this or `enum_overflow'
7418334Speter   around nested function definition since such a definition could only
7518334Speter   occur in an enum value expression and we don't use these variables in
7618334Speter   that case.  */
7718334Speter
7818334Speterstatic tree enum_next_value;
7918334Speter
8018334Speter/* Nonzero means that there was overflow computing enum_next_value.  */
8118334Speter
8218334Speterstatic int enum_overflow;
8318334Speter
8418334Speter/* Parsing a function declarator leaves a list of parameter names
8518334Speter   or a chain or parameter decls here.  */
8618334Speter
8718334Speterstatic tree last_function_parms;
8818334Speter
8918334Speter/* Parsing a function declarator leaves here a chain of structure
9018334Speter   and enum types declared in the parmlist.  */
9118334Speter
9218334Speterstatic tree last_function_parm_tags;
9318334Speter
9418334Speter/* After parsing the declarator that starts a function definition,
9518334Speter   `start_function' puts here the list of parameter names or chain of decls.
9618334Speter   `store_parm_decls' finds it here.  */
9718334Speter
9818334Speterstatic tree current_function_parms;
9918334Speter
10018334Speter/* Similar, for last_function_parm_tags.  */
10118334Speterstatic tree current_function_parm_tags;
10218334Speter
10318334Speter/* Similar, for the file and line that the prototype came from if this is
10418334Speter   an old-style definition.  */
10590075Sobrienstatic const char *current_function_prototype_file;
10618334Speterstatic int current_function_prototype_line;
10718334Speter
10890075Sobrien/* The current statement tree.  */
10990075Sobrien
110117421Skanstatic GTY(()) struct stmt_tree_s c_stmt_tree;
11190075Sobrien
11290075Sobrien/* The current scope statement stack.  */
11390075Sobrien
114117421Skanstatic GTY(()) tree c_scope_stmt_stack;
11590075Sobrien
11618334Speter/* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
11718334Speter   that have names.  Here so we can clear out their names' definitions
11818334Speter   at the end of the function.  */
11918334Speter
120117421Skanstatic GTY(()) tree named_labels;
12118334Speter
12218334Speter/* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
12318334Speter
124117421Skanstatic GTY(()) tree shadowed_labels;
12518334Speter
12618334Speter/* Set to 0 at beginning of a function definition, set to 1 if
12718334Speter   a return statement that specifies a return value is seen.  */
12818334Speter
12918334Speterint current_function_returns_value;
13018334Speter
13118334Speter/* Set to 0 at beginning of a function definition, set to 1 if
13218334Speter   a return statement with no argument is seen.  */
13318334Speter
13418334Speterint current_function_returns_null;
13518334Speter
13696263Sobrien/* Set to 0 at beginning of a function definition, set to 1 if
13796263Sobrien   a call to a noreturn function is seen.  */
13896263Sobrien
13996263Sobrienint current_function_returns_abnormally;
14096263Sobrien
14118334Speter/* Set to nonzero by `grokdeclarator' for a function
14218334Speter   whose return type is defaulted, if warnings for this are desired.  */
14318334Speter
14418334Speterstatic int warn_about_return_type;
14518334Speter
14618334Speter/* Nonzero when starting a function declared `extern inline'.  */
14718334Speter
14818334Speterstatic int current_extern_inline;
14918334Speter
15018334Speter/* For each binding contour we allocate a binding_level structure
15118334Speter * which records the names defined in that contour.
15218334Speter * Contours include:
15318334Speter *  0) the global one
15418334Speter *  1) one for each function definition,
15518334Speter *     where internal declarations of the parameters appear.
15618334Speter *  2) one for each compound statement,
15718334Speter *     to record its declarations.
15818334Speter *
15918334Speter * The current meaning of a name can be found by searching the levels from
16018334Speter * the current one out to the global one.
16118334Speter */
16218334Speter
16318334Speter/* Note that the information in the `names' component of the global contour
16418334Speter   is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers.  */
16518334Speter
166117421Skanstruct binding_level GTY(())
16718334Speter  {
16818334Speter    /* A chain of _DECL nodes for all variables, constants, functions,
16918334Speter       and typedef types.  These are in the reverse of the order supplied.
17018334Speter     */
17118334Speter    tree names;
17218334Speter
17318334Speter    /* A list of structure, union and enum definitions,
17418334Speter     * for looking up tag names.
17518334Speter     * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
17618334Speter     * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE,
17718334Speter     * or ENUMERAL_TYPE node.
17818334Speter     */
17918334Speter    tree tags;
18018334Speter
18118334Speter    /* For each level, a list of shadowed outer-level local definitions
18218334Speter       to be restored when this level is popped.
18318334Speter       Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
18418334Speter       whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
18518334Speter    tree shadowed;
18618334Speter
18718334Speter    /* For each level (except not the global one),
18818334Speter       a chain of BLOCK nodes for all the levels
18918334Speter       that were entered and exited one level down.  */
19018334Speter    tree blocks;
19118334Speter
19218334Speter    /* The BLOCK node for this level, if one has been preallocated.
19318334Speter       If 0, the BLOCK is allocated (if needed) when the level is popped.  */
19418334Speter    tree this_block;
19518334Speter
19618334Speter    /* The binding level which this one is contained in (inherits from).  */
19718334Speter    struct binding_level *level_chain;
19818334Speter
19918334Speter    /* Nonzero for the level that holds the parameters of a function.  */
20018334Speter    char parm_flag;
20118334Speter
20218334Speter    /* Nonzero if this level "doesn't exist" for tags.  */
20318334Speter    char tag_transparent;
20418334Speter
20518334Speter    /* Nonzero if sublevels of this level "don't exist" for tags.
20618334Speter       This is set in the parm level of a function definition
20718334Speter       while reading the function body, so that the outermost block
20818334Speter       of the function body will be tag-transparent.  */
20918334Speter    char subblocks_tag_transparent;
21018334Speter
21118334Speter    /* Nonzero means make a BLOCK for this level regardless of all else.  */
21218334Speter    char keep;
21318334Speter
21418334Speter    /* Nonzero means make a BLOCK if this level has any subblocks.  */
21518334Speter    char keep_if_subblocks;
21618334Speter
217117421Skan    /* List of decls in `names' that have incomplete structure or
218117421Skan       union types.  */
219117421Skan    tree incomplete_list;
22018334Speter
22118334Speter    /* A list of decls giving the (reversed) specified order of parms,
22218334Speter       not including any forward-decls in the parmlist.
22318334Speter       This is so we can put the parms in proper order for assign_parms.  */
22418334Speter    tree parm_order;
22518334Speter  };
22618334Speter
22718334Speter#define NULL_BINDING_LEVEL (struct binding_level *) NULL
22890075Sobrien
22918334Speter/* The binding level currently in effect.  */
23018334Speter
231117421Skanstatic GTY(()) struct binding_level *current_binding_level;
23218334Speter
23318334Speter/* A chain of binding_level structures awaiting reuse.  */
23418334Speter
235117421Skanstatic GTY((deletable (""))) struct binding_level *free_binding_level;
23618334Speter
23718334Speter/* The outermost binding level, for names of file scope.
23818334Speter   This is created when the compiler is started and exists
23918334Speter   through the entire run.  */
24018334Speter
241117421Skanstatic GTY(()) struct binding_level *global_binding_level;
24218334Speter
24318334Speter/* Binding level structures are initialized by copying this one.  */
24418334Speter
24518334Speterstatic struct binding_level clear_binding_level
246117421Skan  = {NULL, NULL, NULL, NULL, NULL, NULL_BINDING_LEVEL, 0, 0, 0, 0, 0, NULL,
24718334Speter     NULL};
24818334Speter
24918334Speter/* Nonzero means unconditionally make a BLOCK for the next level pushed.  */
25018334Speter
25118334Speterstatic int keep_next_level_flag;
25218334Speter
25318334Speter/* Nonzero means make a BLOCK for the next level pushed
25418334Speter   if it has subblocks.  */
25518334Speter
25618334Speterstatic int keep_next_if_subblocks;
25790075Sobrien
25818334Speter/* The chain of outer levels of label scopes.
25918334Speter   This uses the same data structure used for binding levels,
26018334Speter   but it works differently: each link in the chain records
26118334Speter   saved values of named_labels and shadowed_labels for
26218334Speter   a label binding level outside the current one.  */
26318334Speter
264117421Skanstatic GTY(()) struct binding_level *label_level_chain;
26518334Speter
26618334Speter/* Functions called automatically at the beginning and end of execution.  */
26718334Speter
26818334Spetertree static_ctors, static_dtors;
26918334Speter
27018334Speter/* Forward declarations.  */
27118334Speter
27290075Sobrienstatic struct binding_level * make_binding_level	PARAMS ((void));
273117421Skanstatic void pop_binding_level		PARAMS ((struct binding_level **));
27490075Sobrienstatic void clear_limbo_values		PARAMS ((tree));
27590075Sobrienstatic int duplicate_decls		PARAMS ((tree, tree, int));
27690075Sobrienstatic int redeclaration_error_message	PARAMS ((tree, tree));
27790075Sobrienstatic void storedecls			PARAMS ((tree));
27890075Sobrienstatic void storetags			PARAMS ((tree));
27990075Sobrienstatic tree lookup_tag			PARAMS ((enum tree_code, tree,
28090075Sobrien						 struct binding_level *, int));
28190075Sobrienstatic tree lookup_tag_reverse		PARAMS ((tree));
28290075Sobrienstatic tree grokdeclarator		PARAMS ((tree, tree, enum decl_context,
28396263Sobrien						 int));
28490075Sobrienstatic tree grokparms			PARAMS ((tree, int));
28590075Sobrienstatic void layout_array_type		PARAMS ((tree));
28690075Sobrienstatic tree c_make_fname_decl           PARAMS ((tree, int));
28790075Sobrienstatic void c_expand_body               PARAMS ((tree, int, int));
28890075Sobrienstatic void warn_if_shadowing		PARAMS ((tree, tree));
289117421Skanstatic bool flexible_array_type_p	PARAMS ((tree));
290117421Skanstatic tree set_save_expr_context	PARAMS ((tree *, int *, void *));
29118334Speter
29290075Sobrien/* States indicating how grokdeclarator() should handle declspecs marked
29390075Sobrien   with __attribute__((deprecated)).  An object declared as
29490075Sobrien   __attribute__((deprecated)) suppresses warnings of uses of other
29590075Sobrien   deprecated items.  */
29690075Sobrien
29790075Sobrienenum deprecated_states {
29890075Sobrien  DEPRECATED_NORMAL,
29990075Sobrien  DEPRECATED_SUPPRESS
30090075Sobrien};
30190075Sobrien
30290075Sobrienstatic enum deprecated_states deprecated_state = DEPRECATED_NORMAL;
30390075Sobrien
30418334Spetervoid
30590075Sobrienc_print_identifier (file, node, indent)
30618334Speter     FILE *file;
30718334Speter     tree node;
30818334Speter     int indent;
30918334Speter{
31018334Speter  print_node (file, "global", IDENTIFIER_GLOBAL_VALUE (node), indent + 4);
31118334Speter  print_node (file, "local", IDENTIFIER_LOCAL_VALUE (node), indent + 4);
31218334Speter  print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4);
31318334Speter  print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4);
31418334Speter  print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4);
31518334Speter  print_node (file, "limbo value", IDENTIFIER_LIMBO_VALUE (node), indent + 4);
31690075Sobrien  if (C_IS_RESERVED_WORD (node))
31790075Sobrien    {
31890075Sobrien      tree rid = ridpointers[C_RID_CODE (node)];
31990075Sobrien      indent_to (file, indent + 4);
32090075Sobrien      fprintf (file, "rid ");
32190075Sobrien      fprintf (file, HOST_PTR_PRINTF, (void *)rid);
32290075Sobrien      fprintf (file, " \"%s\"", IDENTIFIER_POINTER (rid));
32390075Sobrien    }
32418334Speter}
32518334Speter
32618334Speter/* Hook called at end of compilation to assume 1 elt
32790075Sobrien   for a top-level tentative array defn that wasn't complete before.  */
32890075Sobrien
32918334Spetervoid
330117421Skanc_finish_incomplete_decl (decl)
33118334Speter     tree decl;
33218334Speter{
33350397Sobrien  if (TREE_CODE (decl) == VAR_DECL)
33418334Speter    {
33518334Speter      tree type = TREE_TYPE (decl);
33650397Sobrien      if (type != error_mark_node
33750397Sobrien	  && TREE_CODE (type) == ARRAY_TYPE
33890075Sobrien	  && ! DECL_EXTERNAL (decl)
33950397Sobrien	  && TYPE_DOMAIN (type) == 0)
34018334Speter	{
34190075Sobrien	  warning_with_decl (decl, "array `%s' assumed to have one element");
34250397Sobrien
34318334Speter	  complete_array_type (type, NULL_TREE, 1);
34418334Speter
34518334Speter	  layout_decl (decl, 0);
34618334Speter	}
34718334Speter    }
34818334Speter}
34918334Speter
350117421Skan/* Reuse or create a struct for this binding level.  */
35118334Speter
35290075Sobrienstatic struct binding_level *
35318334Spetermake_binding_level ()
35418334Speter{
355117421Skan  if (free_binding_level)
356117421Skan    {
357117421Skan      struct binding_level *result = free_binding_level;
358117421Skan      free_binding_level = result->level_chain;
359117421Skan      return result;
360117421Skan    }
361117421Skan  else
362117421Skan    return (struct binding_level *) ggc_alloc (sizeof (struct binding_level));
36318334Speter}
36418334Speter
365117421Skan/* Remove a binding level from a list and add it to the level chain.  */
366117421Skan
367117421Skanstatic void
368117421Skanpop_binding_level (lp)
369117421Skan     struct binding_level **lp;
370117421Skan{
371117421Skan  struct binding_level *l = *lp;
372117421Skan  *lp = l->level_chain;
373117421Skan
374117421Skan  memset (l, 0, sizeof (struct binding_level));
375117421Skan  l->level_chain = free_binding_level;
376117421Skan  free_binding_level = l;
377117421Skan}
378117421Skan
37918334Speter/* Nonzero if we are currently in the global binding level.  */
38018334Speter
38118334Speterint
38218334Speterglobal_bindings_p ()
38318334Speter{
38418334Speter  return current_binding_level == global_binding_level;
38518334Speter}
38618334Speter
38718334Spetervoid
38818334Speterkeep_next_level ()
38918334Speter{
39018334Speter  keep_next_level_flag = 1;
39118334Speter}
39218334Speter
39318334Speter/* Nonzero if the current level needs to have a BLOCK made.  */
39418334Speter
39518334Speterint
39618334Speterkept_level_p ()
39718334Speter{
39818334Speter  return ((current_binding_level->keep_if_subblocks
39918334Speter	   && current_binding_level->blocks != 0)
40018334Speter	  || current_binding_level->keep
40118334Speter	  || current_binding_level->names != 0
40218334Speter	  || (current_binding_level->tags != 0
40318334Speter	      && !current_binding_level->tag_transparent));
40418334Speter}
40518334Speter
40618334Speter/* Identify this binding level as a level of parameters.
40718334Speter   DEFINITION_FLAG is 1 for a definition, 0 for a declaration.
40818334Speter   But it turns out there is no way to pass the right value for
40918334Speter   DEFINITION_FLAG, so we ignore it.  */
41018334Speter
41118334Spetervoid
41218334Speterdeclare_parm_level (definition_flag)
41352284Sobrien     int definition_flag ATTRIBUTE_UNUSED;
41418334Speter{
41518334Speter  current_binding_level->parm_flag = 1;
41618334Speter}
41718334Speter
41818334Speter/* Nonzero if currently making parm declarations.  */
41918334Speter
42018334Speterint
42118334Speterin_parm_level_p ()
42218334Speter{
42318334Speter  return current_binding_level->parm_flag;
42418334Speter}
42518334Speter
42618334Speter/* Enter a new binding level.
42718334Speter   If TAG_TRANSPARENT is nonzero, do so only for the name space of variables,
42818334Speter   not for that of tags.  */
42918334Speter
43018334Spetervoid
43118334Speterpushlevel (tag_transparent)
43218334Speter     int tag_transparent;
43318334Speter{
43490075Sobrien  struct binding_level *newlevel = NULL_BINDING_LEVEL;
43518334Speter
43618334Speter  /* If this is the top level of a function,
43718334Speter     just make sure that NAMED_LABELS is 0.  */
43818334Speter
43918334Speter  if (current_binding_level == global_binding_level)
44018334Speter    {
44118334Speter      named_labels = 0;
44218334Speter    }
44318334Speter
444117421Skan  newlevel = make_binding_level ();
44518334Speter
44618334Speter  /* Add this level to the front of the chain (stack) of levels that
44718334Speter     are active.  */
44818334Speter
44918334Speter  *newlevel = clear_binding_level;
45018334Speter  newlevel->tag_transparent
45118334Speter    = (tag_transparent
45218334Speter       || (current_binding_level
45318334Speter	   ? current_binding_level->subblocks_tag_transparent
45418334Speter	   : 0));
45518334Speter  newlevel->level_chain = current_binding_level;
45618334Speter  current_binding_level = newlevel;
45718334Speter  newlevel->keep = keep_next_level_flag;
45818334Speter  keep_next_level_flag = 0;
45918334Speter  newlevel->keep_if_subblocks = keep_next_if_subblocks;
46018334Speter  keep_next_if_subblocks = 0;
46118334Speter}
46218334Speter
46390075Sobrien/* Clear the limbo values of all identifiers defined in BLOCK or a subblock.  */
46450397Sobrien
46550397Sobrienstatic void
46650397Sobrienclear_limbo_values (block)
46750397Sobrien     tree block;
46850397Sobrien{
46950397Sobrien  tree tem;
47050397Sobrien
47150397Sobrien  for (tem = BLOCK_VARS (block); tem; tem = TREE_CHAIN (tem))
47250397Sobrien    if (DECL_NAME (tem) != 0)
47350397Sobrien      IDENTIFIER_LIMBO_VALUE (DECL_NAME (tem)) = 0;
47450397Sobrien
47550397Sobrien  for (tem = BLOCK_SUBBLOCKS (block); tem; tem = TREE_CHAIN (tem))
47650397Sobrien    clear_limbo_values (tem);
47750397Sobrien}
47890075Sobrien
47918334Speter/* Exit a binding level.
48018334Speter   Pop the level off, and restore the state of the identifier-decl mappings
48118334Speter   that were in effect when this level was entered.
48218334Speter
48318334Speter   If KEEP is nonzero, this level had explicit declarations, so
48418334Speter   and create a "block" (a BLOCK node) for the level
48518334Speter   to record its declarations and subblocks for symbol table output.
48618334Speter
48718334Speter   If FUNCTIONBODY is nonzero, this level is the body of a function,
48818334Speter   so create a block as if KEEP were set and also clear out all
48918334Speter   label names.
49018334Speter
49118334Speter   If REVERSE is nonzero, reverse the order of decls before putting
49218334Speter   them into the BLOCK.  */
49318334Speter
49418334Spetertree
49518334Speterpoplevel (keep, reverse, functionbody)
49618334Speter     int keep;
49718334Speter     int reverse;
49818334Speter     int functionbody;
49918334Speter{
50090075Sobrien  tree link;
50118334Speter  /* The chain of decls was accumulated in reverse order.
50218334Speter     Put it into forward order, just for cleanliness.  */
50318334Speter  tree decls;
50418334Speter  tree tags = current_binding_level->tags;
50518334Speter  tree subblocks = current_binding_level->blocks;
50618334Speter  tree block = 0;
50718334Speter  tree decl;
50818334Speter  int block_previously_created;
50918334Speter
51018334Speter  keep |= current_binding_level->keep;
51118334Speter
51218334Speter  /* This warning is turned off because it causes warnings for
51318334Speter     declarations like `extern struct foo *x'.  */
51418334Speter#if 0
51518334Speter  /* Warn about incomplete structure types in this level.  */
51618334Speter  for (link = tags; link; link = TREE_CHAIN (link))
51790075Sobrien    if (!COMPLETE_TYPE_P (TREE_VALUE (link)))
51818334Speter      {
51918334Speter	tree type = TREE_VALUE (link);
52052284Sobrien	tree type_name = TYPE_NAME (type);
52152284Sobrien	char *id = IDENTIFIER_POINTER (TREE_CODE (type_name) == IDENTIFIER_NODE
52252284Sobrien				       ? type_name
52352284Sobrien				       : DECL_NAME (type_name));
52418334Speter	switch (TREE_CODE (type))
52518334Speter	  {
52618334Speter	  case RECORD_TYPE:
52752284Sobrien	    error ("`struct %s' incomplete in scope ending here", id);
52818334Speter	    break;
52918334Speter	  case UNION_TYPE:
53052284Sobrien	    error ("`union %s' incomplete in scope ending here", id);
53118334Speter	    break;
53218334Speter	  case ENUMERAL_TYPE:
53352284Sobrien	    error ("`enum %s' incomplete in scope ending here", id);
53418334Speter	    break;
53518334Speter	  }
53618334Speter      }
53718334Speter#endif /* 0 */
53818334Speter
53918334Speter  /* Get the decls in the order they were written.
54018334Speter     Usually current_binding_level->names is in reverse order.
54118334Speter     But parameter decls were previously put in forward order.  */
54218334Speter
54318334Speter  if (reverse)
54418334Speter    current_binding_level->names
54518334Speter      = decls = nreverse (current_binding_level->names);
54618334Speter  else
54718334Speter    decls = current_binding_level->names;
54818334Speter
54918334Speter  /* Output any nested inline functions within this block
55018334Speter     if they weren't already output.  */
55118334Speter
55218334Speter  for (decl = decls; decl; decl = TREE_CHAIN (decl))
55318334Speter    if (TREE_CODE (decl) == FUNCTION_DECL
55418334Speter	&& ! TREE_ASM_WRITTEN (decl)
55518334Speter	&& DECL_INITIAL (decl) != 0
55618334Speter	&& TREE_ADDRESSABLE (decl))
55718334Speter      {
55818334Speter	/* If this decl was copied from a file-scope decl
55918334Speter	   on account of a block-scope extern decl,
56018334Speter	   propagate TREE_ADDRESSABLE to the file-scope decl.
56118334Speter
56218334Speter	   DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
56318334Speter	   true, since then the decl goes through save_for_inline_copying.  */
56418334Speter	if (DECL_ABSTRACT_ORIGIN (decl) != 0
56518334Speter	    && DECL_ABSTRACT_ORIGIN (decl) != decl)
56618334Speter	  TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
56718334Speter      }
56818334Speter
56990075Sobrien  /* We used to warn about unused variables in expand_end_bindings,
57090075Sobrien     i.e. while generating RTL.  But in function-at-a-time mode we may
57190075Sobrien     choose to never expand a function at all (e.g. auto inlining), so
57290075Sobrien     we do this explicitly now.  */
57390075Sobrien  warn_about_unused_variables (getdecls ());
57490075Sobrien
57518334Speter  /* If there were any declarations or structure tags in that level,
57618334Speter     or if this level is a function body,
57718334Speter     create a BLOCK to record them for the life of this function.  */
57818334Speter
57918334Speter  block = 0;
58018334Speter  block_previously_created = (current_binding_level->this_block != 0);
58118334Speter  if (block_previously_created)
58218334Speter    block = current_binding_level->this_block;
58318334Speter  else if (keep || functionbody
58418334Speter	   || (current_binding_level->keep_if_subblocks && subblocks != 0))
58518334Speter    block = make_node (BLOCK);
58618334Speter  if (block != 0)
58718334Speter    {
58818334Speter      BLOCK_VARS (block) = decls;
58918334Speter      BLOCK_SUBBLOCKS (block) = subblocks;
59018334Speter    }
59118334Speter
59218334Speter  /* In each subblock, record that this is its superior.  */
59318334Speter
59418334Speter  for (link = subblocks; link; link = TREE_CHAIN (link))
59518334Speter    BLOCK_SUPERCONTEXT (link) = block;
59618334Speter
59718334Speter  /* Clear out the meanings of the local variables of this level.  */
59818334Speter
59918334Speter  for (link = decls; link; link = TREE_CHAIN (link))
60018334Speter    {
60118334Speter      if (DECL_NAME (link) != 0)
60218334Speter	{
60318334Speter	  /* If the ident. was used or addressed via a local extern decl,
60418334Speter	     don't forget that fact.  */
60518334Speter	  if (DECL_EXTERNAL (link))
60618334Speter	    {
60718334Speter	      if (TREE_USED (link))
60818334Speter		TREE_USED (DECL_NAME (link)) = 1;
60918334Speter	      if (TREE_ADDRESSABLE (link))
61018334Speter		TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
61118334Speter	    }
61218334Speter	  IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0;
61318334Speter	}
61418334Speter    }
61518334Speter
61618334Speter  /* Restore all name-meanings of the outer levels
61718334Speter     that were shadowed by this level.  */
61818334Speter
61918334Speter  for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
62018334Speter    IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
62118334Speter
62218334Speter  /* If the level being exited is the top level of a function,
62318334Speter     check over all the labels, and clear out the current
62418334Speter     (function local) meanings of their names.  */
62518334Speter
62618334Speter  if (functionbody)
62718334Speter    {
62850397Sobrien      clear_limbo_values (block);
62950397Sobrien
63018334Speter      /* If this is the top level block of a function,
63118334Speter	 the vars are the function's parameters.
63218334Speter	 Don't leave them in the BLOCK because they are
63318334Speter	 found in the FUNCTION_DECL instead.  */
63418334Speter
63518334Speter      BLOCK_VARS (block) = 0;
63618334Speter
63718334Speter      /* Clear out the definitions of all label names,
63818334Speter	 since their scopes end here,
63918334Speter	 and add them to BLOCK_VARS.  */
64018334Speter
64118334Speter      for (link = named_labels; link; link = TREE_CHAIN (link))
64218334Speter	{
64390075Sobrien	  tree label = TREE_VALUE (link);
64418334Speter
64518334Speter	  if (DECL_INITIAL (label) == 0)
64618334Speter	    {
64718334Speter	      error_with_decl (label, "label `%s' used but not defined");
64818334Speter	      /* Avoid crashing later.  */
64918334Speter	      define_label (input_filename, lineno,
65018334Speter			    DECL_NAME (label));
65118334Speter	    }
65290075Sobrien	  else if (warn_unused_label && !TREE_USED (label))
65318334Speter	    warning_with_decl (label, "label `%s' defined but not used");
65418334Speter	  IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
65518334Speter
65618334Speter	  /* Put the labels into the "variables" of the
65718334Speter	     top-level block, so debugger can see them.  */
65818334Speter	  TREE_CHAIN (label) = BLOCK_VARS (block);
65918334Speter	  BLOCK_VARS (block) = label;
66018334Speter	}
66118334Speter    }
66218334Speter
66318334Speter  /* Pop the current level, and free the structure for reuse.  */
66418334Speter
665117421Skan  pop_binding_level (&current_binding_level);
66618334Speter
66718334Speter  /* Dispose of the block that we just made inside some higher level.  */
66818334Speter  if (functionbody)
66918334Speter    DECL_INITIAL (current_function_decl) = block;
67018334Speter  else if (block)
67118334Speter    {
67218334Speter      if (!block_previously_created)
67390075Sobrien	current_binding_level->blocks
67490075Sobrien	  = chainon (current_binding_level->blocks, block);
67518334Speter    }
67618334Speter  /* If we did not make a block for the level just exited,
67718334Speter     any blocks made for inner levels
67818334Speter     (since they cannot be recorded as subblocks in that level)
67918334Speter     must be carried forward so they will later become subblocks
68018334Speter     of something else.  */
68118334Speter  else if (subblocks)
68218334Speter    current_binding_level->blocks
68318334Speter      = chainon (current_binding_level->blocks, subblocks);
68418334Speter
68518334Speter  /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
68618334Speter     binding contour so that they point to the appropriate construct, i.e.
68718334Speter     either to the current FUNCTION_DECL node, or else to the BLOCK node
68818334Speter     we just constructed.
68918334Speter
69018334Speter     Note that for tagged types whose scope is just the formal parameter
69118334Speter     list for some function type specification, we can't properly set
69218334Speter     their TYPE_CONTEXTs here, because we don't have a pointer to the
69318334Speter     appropriate FUNCTION_TYPE node readily available to us.  For those
69418334Speter     cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
69518334Speter     in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
69618334Speter     node which will represent the "scope" for these "parameter list local"
69790075Sobrien     tagged types.  */
69818334Speter
69918334Speter  if (functionbody)
70018334Speter    for (link = tags; link; link = TREE_CHAIN (link))
70118334Speter      TYPE_CONTEXT (TREE_VALUE (link)) = current_function_decl;
70218334Speter  else if (block)
70318334Speter    for (link = tags; link; link = TREE_CHAIN (link))
70418334Speter      TYPE_CONTEXT (TREE_VALUE (link)) = block;
70518334Speter
70618334Speter  if (block)
70718334Speter    TREE_USED (block) = 1;
70890075Sobrien
70918334Speter  return block;
71018334Speter}
71118334Speter
71218334Speter/* Insert BLOCK at the end of the list of subblocks of the
71318334Speter   current binding level.  This is used when a BIND_EXPR is expanded,
71418334Speter   to handle the BLOCK node inside the BIND_EXPR.  */
71518334Speter
71618334Spetervoid
71718334Speterinsert_block (block)
71818334Speter     tree block;
71918334Speter{
72018334Speter  TREE_USED (block) = 1;
72118334Speter  current_binding_level->blocks
72218334Speter    = chainon (current_binding_level->blocks, block);
72318334Speter}
72418334Speter
72518334Speter/* Set the BLOCK node for the innermost scope
72618334Speter   (the one we are currently in).  */
72718334Speter
72818334Spetervoid
72918334Speterset_block (block)
73090075Sobrien     tree block;
73118334Speter{
73218334Speter  current_binding_level->this_block = block;
73390075Sobrien  current_binding_level->names = chainon (current_binding_level->names,
73490075Sobrien					  BLOCK_VARS (block));
73590075Sobrien  current_binding_level->blocks = chainon (current_binding_level->blocks,
73690075Sobrien					   BLOCK_SUBBLOCKS (block));
73718334Speter}
73818334Speter
73918334Spetervoid
74018334Speterpush_label_level ()
74118334Speter{
74290075Sobrien  struct binding_level *newlevel;
74318334Speter
744117421Skan  newlevel = make_binding_level ();
74518334Speter
74618334Speter  /* Add this level to the front of the chain (stack) of label levels.  */
74718334Speter
74818334Speter  newlevel->level_chain = label_level_chain;
74918334Speter  label_level_chain = newlevel;
75018334Speter
75118334Speter  newlevel->names = named_labels;
75218334Speter  newlevel->shadowed = shadowed_labels;
75318334Speter  named_labels = 0;
75418334Speter  shadowed_labels = 0;
75518334Speter}
75618334Speter
75718334Spetervoid
75818334Speterpop_label_level ()
75918334Speter{
76090075Sobrien  struct binding_level *level = label_level_chain;
76118334Speter  tree link, prev;
76218334Speter
76318334Speter  /* Clear out the definitions of the declared labels in this level.
76418334Speter     Leave in the list any ordinary, non-declared labels.  */
76518334Speter  for (link = named_labels, prev = 0; link;)
76618334Speter    {
76718334Speter      if (C_DECLARED_LABEL_FLAG (TREE_VALUE (link)))
76818334Speter	{
76918334Speter	  if (DECL_SOURCE_LINE (TREE_VALUE (link)) == 0)
77018334Speter	    {
77118334Speter	      error_with_decl (TREE_VALUE (link),
77218334Speter			       "label `%s' used but not defined");
77318334Speter	      /* Avoid crashing later.  */
77418334Speter	      define_label (input_filename, lineno,
77518334Speter			    DECL_NAME (TREE_VALUE (link)));
77618334Speter	    }
77790075Sobrien	  else if (warn_unused_label && !TREE_USED (TREE_VALUE (link)))
77890075Sobrien	    warning_with_decl (TREE_VALUE (link),
77918334Speter			       "label `%s' defined but not used");
78018334Speter	  IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) = 0;
78118334Speter
78218334Speter	  /* Delete this element from the list.  */
78318334Speter	  link = TREE_CHAIN (link);
78418334Speter	  if (prev)
78518334Speter	    TREE_CHAIN (prev) = link;
78618334Speter	  else
78718334Speter	    named_labels = link;
78818334Speter	}
78918334Speter      else
79018334Speter	{
79118334Speter	  prev = link;
79218334Speter	  link = TREE_CHAIN (link);
79318334Speter	}
79418334Speter    }
79518334Speter
79618334Speter  /* Bring back all the labels that were shadowed.  */
79718334Speter  for (link = shadowed_labels; link; link = TREE_CHAIN (link))
79818334Speter    if (DECL_NAME (TREE_VALUE (link)) != 0)
79918334Speter      IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)))
80018334Speter	= TREE_VALUE (link);
80118334Speter
80218334Speter  named_labels = chainon (named_labels, level->names);
80318334Speter  shadowed_labels = level->shadowed;
80418334Speter
80518334Speter  /* Pop the current level, and free the structure for reuse.  */
806117421Skan  pop_binding_level (&label_level_chain);
80718334Speter}
80818334Speter
80918334Speter/* Push a definition or a declaration of struct, union or enum tag "name".
81018334Speter   "type" should be the type node.
81118334Speter   We assume that the tag "name" is not already defined.
81218334Speter
81318334Speter   Note that the definition may really be just a forward reference.
81418334Speter   In that case, the TYPE_SIZE will be zero.  */
81518334Speter
81618334Spetervoid
81718334Speterpushtag (name, type)
81818334Speter     tree name, type;
81918334Speter{
82090075Sobrien  struct binding_level *b;
82118334Speter
82218334Speter  /* Find the proper binding level for this type tag.  */
82318334Speter
82418334Speter  for (b = current_binding_level; b->tag_transparent; b = b->level_chain)
82518334Speter    continue;
82618334Speter
82718334Speter  if (name)
82818334Speter    {
82918334Speter      /* Record the identifier as the type's name if it has none.  */
83018334Speter
83118334Speter      if (TYPE_NAME (type) == 0)
83218334Speter	TYPE_NAME (type) = name;
83318334Speter    }
83418334Speter
83590075Sobrien  b->tags = tree_cons (name, type, b->tags);
83618334Speter
83718334Speter  /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE will be the
83818334Speter     tagged type we just added to the current binding level.  This fake
83918334Speter     NULL-named TYPE_DECL node helps dwarfout.c to know when it needs
84018334Speter     to output a representation of a tagged type, and it also gives
84118334Speter     us a convenient place to record the "scope start" address for the
84218334Speter     tagged type.  */
84318334Speter
84418334Speter  TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type));
84550397Sobrien
84650397Sobrien  /* An approximation for now, so we can tell this is a function-scope tag.
84750397Sobrien     This will be updated in poplevel.  */
84850397Sobrien  TYPE_CONTEXT (type) = DECL_CONTEXT (TYPE_STUB_DECL (type));
84918334Speter}
85018334Speter
85118334Speter/* Handle when a new declaration NEWDECL
85218334Speter   has the same name as an old one OLDDECL
85318334Speter   in the same binding contour.
85418334Speter   Prints an error message if appropriate.
85518334Speter
85618334Speter   If safely possible, alter OLDDECL to look like NEWDECL, and return 1.
85750397Sobrien   Otherwise, return 0.
85818334Speter
85950397Sobrien   When DIFFERENT_BINDING_LEVEL is true, NEWDECL is an external declaration,
86050397Sobrien   and OLDDECL is in an outer binding level and should thus not be changed.  */
86150397Sobrien
86218334Speterstatic int
86350397Sobrienduplicate_decls (newdecl, olddecl, different_binding_level)
86490075Sobrien     tree newdecl, olddecl;
86550397Sobrien     int different_binding_level;
86618334Speter{
86718334Speter  int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl));
86818334Speter  int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL
86918334Speter			   && DECL_INITIAL (newdecl) != 0);
87018334Speter  tree oldtype = TREE_TYPE (olddecl);
87118334Speter  tree newtype = TREE_TYPE (newdecl);
87252284Sobrien  int errmsg = 0;
87318334Speter
87490075Sobrien  if (DECL_P (olddecl))
87590075Sobrien    {
87690075Sobrien      if (TREE_CODE (newdecl) == FUNCTION_DECL
87790075Sobrien	  && TREE_CODE (olddecl) == FUNCTION_DECL
87890075Sobrien	  && (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl)))
87990075Sobrien	{
88090075Sobrien	  if (DECL_DECLARED_INLINE_P (newdecl)
88190075Sobrien	      && DECL_UNINLINABLE (newdecl)
88290075Sobrien	      && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
88390075Sobrien	    /* Already warned elsewhere.  */;
88490075Sobrien	  else if (DECL_DECLARED_INLINE_P (olddecl)
88590075Sobrien		   && DECL_UNINLINABLE (olddecl)
88690075Sobrien		   && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
88790075Sobrien	    /* Already warned.  */;
88890075Sobrien	  else if (DECL_DECLARED_INLINE_P (newdecl)
88990075Sobrien		   && ! DECL_DECLARED_INLINE_P (olddecl)
89090075Sobrien		   && DECL_UNINLINABLE (olddecl)
89190075Sobrien		   && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
89290075Sobrien	    {
89390075Sobrien	      warning_with_decl (newdecl,
89490075Sobrien				 "function `%s' redeclared as inline");
89590075Sobrien	      warning_with_decl (olddecl,
89690075Sobrien				 "previous declaration of function `%s' with attribute noinline");
89790075Sobrien	    }
89890075Sobrien	  else if (DECL_DECLARED_INLINE_P (olddecl)
89990075Sobrien		   && DECL_UNINLINABLE (newdecl)
90090075Sobrien		   && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
90190075Sobrien	    {
90290075Sobrien	      warning_with_decl (newdecl,
90390075Sobrien				 "function `%s' redeclared with attribute noinline");
90490075Sobrien	      warning_with_decl (olddecl,
90590075Sobrien				 "previous declaration of function `%s' was inline");
90690075Sobrien	    }
90790075Sobrien	}
90818334Speter
90990075Sobrien      DECL_ATTRIBUTES (newdecl)
91090075Sobrien	= (*targetm.merge_decl_attributes) (olddecl, newdecl);
91190075Sobrien    }
91290075Sobrien
91318334Speter  if (TREE_CODE (newtype) == ERROR_MARK
91418334Speter      || TREE_CODE (oldtype) == ERROR_MARK)
91518334Speter    types_match = 0;
91618334Speter
91718334Speter  /* New decl is completely inconsistent with the old one =>
91818334Speter     tell caller to replace the old one.
91918334Speter     This is always an error except in the case of shadowing a builtin.  */
92018334Speter  if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
92118334Speter    {
92218334Speter      if (TREE_CODE (olddecl) == FUNCTION_DECL
92318334Speter	  && (DECL_BUILT_IN (olddecl)
92418334Speter	      || DECL_BUILT_IN_NONANSI (olddecl)))
92518334Speter	{
92618334Speter	  /* If you declare a built-in or predefined function name as static,
92718334Speter	     the old definition is overridden,
92818334Speter	     but optionally warn this was a bad choice of name.  */
92918334Speter	  if (!TREE_PUBLIC (newdecl))
93018334Speter	    {
93118334Speter	      if (!warn_shadow)
93218334Speter		;
93318334Speter	      else if (DECL_BUILT_IN (olddecl))
93418334Speter		warning_with_decl (newdecl, "shadowing built-in function `%s'");
93518334Speter	      else
93618334Speter		warning_with_decl (newdecl, "shadowing library function `%s'");
93718334Speter	    }
93818334Speter	  /* Likewise, if the built-in is not ansi, then programs can
93918334Speter	     override it even globally without an error.  */
94018334Speter	  else if (! DECL_BUILT_IN (olddecl))
94118334Speter	    warning_with_decl (newdecl,
94218334Speter			       "library function `%s' declared as non-function");
94318334Speter
94418334Speter	  else if (DECL_BUILT_IN_NONANSI (olddecl))
94518334Speter	    warning_with_decl (newdecl,
94618334Speter			       "built-in function `%s' declared as non-function");
94718334Speter	  else
94818334Speter	    warning_with_decl (newdecl,
94990075Sobrien			       "built-in function `%s' declared as non-function");
95018334Speter	}
95118334Speter      else
95218334Speter	{
95318334Speter	  error_with_decl (newdecl, "`%s' redeclared as different kind of symbol");
95418334Speter	  error_with_decl (olddecl, "previous declaration of `%s'");
95518334Speter	}
95618334Speter
95718334Speter      return 0;
95818334Speter    }
95918334Speter
96018334Speter  /* For real parm decl following a forward decl,
96118334Speter     return 1 so old decl will be reused.  */
96218334Speter  if (types_match && TREE_CODE (newdecl) == PARM_DECL
96318334Speter      && TREE_ASM_WRITTEN (olddecl) && ! TREE_ASM_WRITTEN (newdecl))
96418334Speter    return 1;
96518334Speter
96618334Speter  /* The new declaration is the same kind of object as the old one.
96718334Speter     The declarations may partially match.  Print warnings if they don't
96818334Speter     match enough.  Ultimately, copy most of the information from the new
96918334Speter     decl to the old one, and keep using the old one.  */
97018334Speter
971117421Skan  if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_BUILT_IN (olddecl))
97218334Speter    {
97318334Speter      /* A function declaration for a built-in function.  */
97418334Speter      if (!TREE_PUBLIC (newdecl))
97518334Speter	{
97618334Speter	  /* If you declare a built-in function name as static, the
97718334Speter	     built-in definition is overridden,
97818334Speter	     but optionally warn this was a bad choice of name.  */
97918334Speter	  if (warn_shadow)
98018334Speter	    warning_with_decl (newdecl, "shadowing built-in function `%s'");
98118334Speter	  /* Discard the old built-in function.  */
98218334Speter	  return 0;
98318334Speter	}
98418334Speter      else if (!types_match)
98518334Speter	{
98690075Sobrien	  /* Accept the return type of the new declaration if same modes.  */
98750397Sobrien	  tree oldreturntype = TREE_TYPE (oldtype);
98850397Sobrien	  tree newreturntype = TREE_TYPE (newtype);
98918334Speter
99090075Sobrien	  if (TYPE_MODE (oldreturntype) == TYPE_MODE (newreturntype))
99118334Speter	    {
99218334Speter	      /* Function types may be shared, so we can't just modify
99318334Speter		 the return type of olddecl's function type.  */
99450397Sobrien	      tree trytype
99518334Speter		= build_function_type (newreturntype,
99650397Sobrien				       TYPE_ARG_TYPES (oldtype));
99790075Sobrien	      trytype = build_type_attribute_variant (trytype,
99890075Sobrien						      TYPE_ATTRIBUTES (oldtype));
99990075Sobrien
100050397Sobrien              types_match = comptypes (newtype, trytype);
100118334Speter	      if (types_match)
100250397Sobrien		oldtype = trytype;
100318334Speter	    }
100418334Speter	  /* Accept harmless mismatch in first argument type also.
100590075Sobrien	     This is for the ffs and fprintf builtins.  */
100618334Speter	  if (TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != 0
100750397Sobrien	      && TYPE_ARG_TYPES (oldtype) != 0
100850397Sobrien	      && TREE_VALUE (TYPE_ARG_TYPES (newtype)) != 0
100950397Sobrien	      && TREE_VALUE (TYPE_ARG_TYPES (oldtype)) != 0
101050397Sobrien	      && (TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (newtype)))
101150397Sobrien		  == TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (oldtype)))))
101218334Speter	    {
101318334Speter	      /* Function types may be shared, so we can't just modify
101418334Speter		 the return type of olddecl's function type.  */
101550397Sobrien	      tree trytype
101650397Sobrien		= build_function_type (TREE_TYPE (oldtype),
101790075Sobrien				       tree_cons (NULL_TREE,
101850397Sobrien						  TREE_VALUE (TYPE_ARG_TYPES (newtype)),
101950397Sobrien						  TREE_CHAIN (TYPE_ARG_TYPES (oldtype))));
102090075Sobrien	      trytype = build_type_attribute_variant (trytype,
102190075Sobrien						      TYPE_ATTRIBUTES (oldtype));
102290075Sobrien
102390075Sobrien	      types_match = comptypes (newtype, trytype);
102418334Speter	      if (types_match)
102550397Sobrien		oldtype = trytype;
102618334Speter	    }
102750397Sobrien	  if (! different_binding_level)
102850397Sobrien	    TREE_TYPE (olddecl) = oldtype;
102918334Speter	}
103096263Sobrien      else if (TYPE_ARG_TYPES (oldtype) == NULL
103196263Sobrien	       && TYPE_ARG_TYPES (newtype) != NULL)
103296263Sobrien	{
103396263Sobrien	  /* For bcmp, bzero, fputs the builtin type has arguments not
103496263Sobrien	     specified.  Use the ones from the prototype so that type checking
103596263Sobrien	     is done for them.  */
103696263Sobrien	  tree trytype
103796263Sobrien	    = build_function_type (TREE_TYPE (oldtype),
103896263Sobrien				   TYPE_ARG_TYPES (newtype));
103996263Sobrien	  trytype = build_type_attribute_variant (trytype,
104096263Sobrien						  TYPE_ATTRIBUTES (oldtype));
104196263Sobrien
104296263Sobrien	  oldtype = trytype;
104396263Sobrien	  if (! different_binding_level)
104496263Sobrien	    TREE_TYPE (olddecl) = oldtype;
104596263Sobrien	}
104618334Speter      if (!types_match)
104718334Speter	{
104818334Speter	  /* If types don't match for a built-in, throw away the built-in.  */
104918334Speter	  warning_with_decl (newdecl, "conflicting types for built-in function `%s'");
105018334Speter	  return 0;
105118334Speter	}
105218334Speter    }
105318334Speter  else if (TREE_CODE (olddecl) == FUNCTION_DECL
105418334Speter	   && DECL_SOURCE_LINE (olddecl) == 0)
105518334Speter    {
105618334Speter      /* A function declaration for a predeclared function
105718334Speter	 that isn't actually built in.  */
105818334Speter      if (!TREE_PUBLIC (newdecl))
105918334Speter	{
106018334Speter	  /* If you declare it as static, the
106118334Speter	     default definition is overridden.  */
106218334Speter	  return 0;
106318334Speter	}
106418334Speter      else if (!types_match)
106518334Speter	{
106618334Speter	  /* If the types don't match, preserve volatility indication.
106718334Speter	     Later on, we will discard everything else about the
106818334Speter	     default declaration.  */
106918334Speter	  TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
107018334Speter	}
107118334Speter    }
107218334Speter  /* Permit char *foo () to match void *foo (...) if not pedantic,
107318334Speter     if one of them came from a system header file.  */
107418334Speter  else if (!types_match
107518334Speter	   && TREE_CODE (olddecl) == FUNCTION_DECL
107618334Speter	   && TREE_CODE (newdecl) == FUNCTION_DECL
107718334Speter	   && TREE_CODE (TREE_TYPE (oldtype)) == POINTER_TYPE
107818334Speter	   && TREE_CODE (TREE_TYPE (newtype)) == POINTER_TYPE
107918334Speter	   && (DECL_IN_SYSTEM_HEADER (olddecl)
108018334Speter	       || DECL_IN_SYSTEM_HEADER (newdecl))
108118334Speter	   && ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (newtype))) == void_type_node
108218334Speter		&& TYPE_ARG_TYPES (oldtype) == 0
108318334Speter		&& self_promoting_args_p (TYPE_ARG_TYPES (newtype))
108418334Speter		&& TREE_TYPE (TREE_TYPE (oldtype)) == char_type_node)
108518334Speter	       ||
108618334Speter	       (TREE_TYPE (TREE_TYPE (newtype)) == char_type_node
108718334Speter		&& TYPE_ARG_TYPES (newtype) == 0
108818334Speter		&& self_promoting_args_p (TYPE_ARG_TYPES (oldtype))
108918334Speter		&& TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node)))
109018334Speter    {
109118334Speter      if (pedantic)
109218334Speter	pedwarn_with_decl (newdecl, "conflicting types for `%s'");
109318334Speter      /* Make sure we keep void * as ret type, not char *.  */
109418334Speter      if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node)
109518334Speter	TREE_TYPE (newdecl) = newtype = oldtype;
109618334Speter
109718334Speter      /* Set DECL_IN_SYSTEM_HEADER, so that if we see another declaration
109818334Speter	 we will come back here again.  */
109918334Speter      DECL_IN_SYSTEM_HEADER (newdecl) = 1;
110018334Speter    }
110118334Speter  else if (!types_match
110218334Speter	   /* Permit char *foo (int, ...); followed by char *foo ();
110318334Speter	      if not pedantic.  */
110418334Speter	   && ! (TREE_CODE (olddecl) == FUNCTION_DECL
110518334Speter		 && ! pedantic
110618334Speter		 /* Return types must still match.  */
110718334Speter		 && comptypes (TREE_TYPE (oldtype),
110818334Speter			       TREE_TYPE (newtype))
110918334Speter		 && TYPE_ARG_TYPES (newtype) == 0))
111018334Speter    {
111118334Speter      error_with_decl (newdecl, "conflicting types for `%s'");
111218334Speter      /* Check for function type mismatch
111318334Speter	 involving an empty arglist vs a nonempty one.  */
111418334Speter      if (TREE_CODE (olddecl) == FUNCTION_DECL
111518334Speter	  && comptypes (TREE_TYPE (oldtype),
111618334Speter			TREE_TYPE (newtype))
111718334Speter	  && ((TYPE_ARG_TYPES (oldtype) == 0
111818334Speter	       && DECL_INITIAL (olddecl) == 0)
111918334Speter	      ||
112018334Speter	      (TYPE_ARG_TYPES (newtype) == 0
112118334Speter	       && DECL_INITIAL (newdecl) == 0)))
112218334Speter	{
112318334Speter	  /* Classify the problem further.  */
112490075Sobrien	  tree t = TYPE_ARG_TYPES (oldtype);
112518334Speter	  if (t == 0)
112618334Speter	    t = TYPE_ARG_TYPES (newtype);
112718334Speter	  for (; t; t = TREE_CHAIN (t))
112818334Speter	    {
112990075Sobrien	      tree type = TREE_VALUE (t);
113018334Speter
113118334Speter	      if (TREE_CHAIN (t) == 0
113218334Speter		  && TYPE_MAIN_VARIANT (type) != void_type_node)
113318334Speter		{
113490075Sobrien		  error ("a parameter list with an ellipsis can't match an empty parameter name list declaration");
113518334Speter		  break;
113618334Speter		}
113718334Speter
1138117421Skan	      if (c_type_promotes_to (type) != type)
113918334Speter		{
114090075Sobrien		  error ("an argument type that has a default promotion can't match an empty parameter name list declaration");
114118334Speter		  break;
114218334Speter		}
114318334Speter	    }
114418334Speter	}
114518334Speter      error_with_decl (olddecl, "previous declaration of `%s'");
1146117421Skan
1147117421Skan      /* This is safer because the initializer might contain references
1148117421Skan	 to variables that were declared between olddecl and newdecl. This
1149117421Skan	 will make the initializer invalid for olddecl in case it gets
1150117421Skan	 assigned to olddecl below.  */
1151117421Skan      if (TREE_CODE (newdecl) == VAR_DECL)
1152117421Skan	DECL_INITIAL (newdecl) = 0;
115318334Speter    }
1154117421Skan  /* TLS cannot follow non-TLS declaration.  */
1155117421Skan  else if (TREE_CODE (olddecl) == VAR_DECL && TREE_CODE (newdecl) == VAR_DECL
1156117421Skan	   && !DECL_THREAD_LOCAL (olddecl) && DECL_THREAD_LOCAL (newdecl))
1157117421Skan    {
1158117421Skan      error_with_decl (newdecl, "thread-local declaration of `%s' follows non thread-local declaration");
1159117421Skan      error_with_decl (olddecl, "previous declaration of `%s'");
1160117421Skan    }
1161117421Skan  /* non-TLS declaration cannot follow TLS declaration.  */
1162117421Skan  else if (TREE_CODE (olddecl) == VAR_DECL && TREE_CODE (newdecl) == VAR_DECL
1163117421Skan	   && DECL_THREAD_LOCAL (olddecl) && !DECL_THREAD_LOCAL (newdecl))
1164117421Skan    {
1165117421Skan      error_with_decl (newdecl, "non thread-local declaration of `%s' follows thread-local declaration");
1166117421Skan      error_with_decl (olddecl, "previous declaration of `%s'");
1167117421Skan    }
116818334Speter  else
116918334Speter    {
117018334Speter      errmsg = redeclaration_error_message (newdecl, olddecl);
117118334Speter      if (errmsg)
117218334Speter	{
117352284Sobrien	  switch (errmsg)
117452284Sobrien	    {
117552284Sobrien	    case 1:
117652284Sobrien	      error_with_decl (newdecl, "redefinition of `%s'");
117752284Sobrien	      break;
117852284Sobrien	    case 2:
117952284Sobrien	      error_with_decl (newdecl, "redeclaration of `%s'");
118052284Sobrien	      break;
118152284Sobrien	    case 3:
118252284Sobrien	      error_with_decl (newdecl, "conflicting declarations of `%s'");
118352284Sobrien	      break;
118452284Sobrien	    default:
118552284Sobrien	      abort ();
118652284Sobrien	    }
118752284Sobrien
118818334Speter	  error_with_decl (olddecl,
118918334Speter			   ((DECL_INITIAL (olddecl)
119018334Speter			     && current_binding_level == global_binding_level)
119118334Speter			    ? "`%s' previously defined here"
119218334Speter			    : "`%s' previously declared here"));
119396263Sobrien	  return 0;
119418334Speter	}
119518334Speter      else if (TREE_CODE (newdecl) == TYPE_DECL
119690075Sobrien               && (DECL_IN_SYSTEM_HEADER (olddecl)
119718334Speter                   || DECL_IN_SYSTEM_HEADER (newdecl)))
119818334Speter	{
119918334Speter	  warning_with_decl (newdecl, "redefinition of `%s'");
120090075Sobrien	  warning_with_decl
120118334Speter	    (olddecl,
120218334Speter	     ((DECL_INITIAL (olddecl)
120318334Speter	       && current_binding_level == global_binding_level)
120418334Speter	      ? "`%s' previously defined here"
120518334Speter	      : "`%s' previously declared here"));
120618334Speter	}
120718334Speter      else if (TREE_CODE (olddecl) == FUNCTION_DECL
120818334Speter	       && DECL_INITIAL (olddecl) != 0
120918334Speter	       && TYPE_ARG_TYPES (oldtype) == 0
121018334Speter	       && TYPE_ARG_TYPES (newtype) != 0
121118334Speter	       && TYPE_ACTUAL_ARG_TYPES (oldtype) != 0)
121218334Speter	{
121390075Sobrien	  tree type, parm;
121490075Sobrien	  int nargs;
121518334Speter	  /* Prototype decl follows defn w/o prototype.  */
121618334Speter
121718334Speter	  for (parm = TYPE_ACTUAL_ARG_TYPES (oldtype),
121818334Speter	       type = TYPE_ARG_TYPES (newtype),
121918334Speter	       nargs = 1;
122052284Sobrien	       ;
122118334Speter	       parm = TREE_CHAIN (parm), type = TREE_CHAIN (type), nargs++)
122218334Speter	    {
122318334Speter	      if (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == void_type_node
122452284Sobrien		  && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
122552284Sobrien		{
122652284Sobrien		  warning_with_decl (newdecl, "prototype for `%s' follows");
122752284Sobrien		  warning_with_decl (olddecl, "non-prototype definition here");
122852284Sobrien		  break;
122952284Sobrien		}
123052284Sobrien	      if (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == void_type_node
123118334Speter		  || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
123218334Speter		{
123390075Sobrien		  error_with_decl (newdecl,
123490075Sobrien				   "prototype for `%s' follows and number of arguments doesn't match");
123552284Sobrien		  error_with_decl (olddecl, "non-prototype definition here");
123652284Sobrien		  errmsg = 1;
123718334Speter		  break;
123818334Speter		}
123918334Speter	      /* Type for passing arg must be consistent
124018334Speter		 with that declared for the arg.  */
1241117421Skan	      if (! comptypes (TREE_VALUE (parm), TREE_VALUE (type)))
124218334Speter		{
124352284Sobrien		  error_with_decl (newdecl,
124452284Sobrien				   "prototype for `%s' follows and argument %d doesn't match",
124552284Sobrien				   nargs);
124652284Sobrien		  error_with_decl (olddecl, "non-prototype definition here");
124752284Sobrien		  errmsg = 1;
124818334Speter		  break;
124918334Speter		}
125018334Speter	    }
125118334Speter	}
125218334Speter      /* Warn about mismatches in various flags.  */
125318334Speter      else
125418334Speter	{
125518334Speter	  /* Warn if function is now inline
125618334Speter	     but was previously declared not inline and has been called.  */
125718334Speter	  if (TREE_CODE (olddecl) == FUNCTION_DECL
125890075Sobrien	      && ! DECL_DECLARED_INLINE_P (olddecl)
125990075Sobrien	      && DECL_DECLARED_INLINE_P (newdecl)
126018334Speter	      && TREE_USED (olddecl))
126118334Speter	    warning_with_decl (newdecl,
126218334Speter			       "`%s' declared inline after being called");
126318334Speter	  if (TREE_CODE (olddecl) == FUNCTION_DECL
126490075Sobrien	      && ! DECL_DECLARED_INLINE_P (olddecl)
126590075Sobrien	      && DECL_DECLARED_INLINE_P (newdecl)
126618334Speter	      && DECL_INITIAL (olddecl) != 0)
126718334Speter	    warning_with_decl (newdecl,
126818334Speter			       "`%s' declared inline after its definition");
126918334Speter
127018334Speter	  /* If pedantic, warn when static declaration follows a non-static
127118334Speter	     declaration.  Otherwise, do so only for functions.  */
127218334Speter	  if ((pedantic || TREE_CODE (olddecl) == FUNCTION_DECL)
127318334Speter	      && TREE_PUBLIC (olddecl)
127418334Speter	      && !TREE_PUBLIC (newdecl))
127518334Speter	    warning_with_decl (newdecl, "static declaration for `%s' follows non-static");
127618334Speter
127752284Sobrien	  /* If warn_traditional, warn when a non-static function
127890075Sobrien	     declaration follows a static one.  */
127990075Sobrien	  if (warn_traditional && !in_system_header
128052284Sobrien	      && TREE_CODE (olddecl) == FUNCTION_DECL
128152284Sobrien	      && !TREE_PUBLIC (olddecl)
128252284Sobrien	      && TREE_PUBLIC (newdecl))
128352284Sobrien	    warning_with_decl (newdecl, "non-static declaration for `%s' follows static");
128452284Sobrien
128518334Speter	  /* Warn when const declaration follows a non-const
128618334Speter	     declaration, but not for functions.  */
128718334Speter	  if (TREE_CODE (olddecl) != FUNCTION_DECL
128818334Speter	      && !TREE_READONLY (olddecl)
128918334Speter	      && TREE_READONLY (newdecl))
129018334Speter	    warning_with_decl (newdecl, "const declaration for `%s' follows non-const");
129118334Speter	  /* These bits are logically part of the type, for variables.
129218334Speter	     But not for functions
129318334Speter	     (where qualifiers are not valid ANSI anyway).  */
129418334Speter	  else if (pedantic && TREE_CODE (olddecl) != FUNCTION_DECL
129518334Speter	      && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
129618334Speter		  || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl)))
129718334Speter	    pedwarn_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl");
129818334Speter	}
129918334Speter    }
130018334Speter
130118334Speter  /* Optionally warn about more than one declaration for the same name.  */
130218334Speter  if (errmsg == 0 && warn_redundant_decls && DECL_SOURCE_LINE (olddecl) != 0
130350397Sobrien      /* Don't warn about a function declaration
130418334Speter	 followed by a definition.  */
130518334Speter      && !(TREE_CODE (newdecl) == FUNCTION_DECL && DECL_INITIAL (newdecl) != 0
130618334Speter	   && DECL_INITIAL (olddecl) == 0)
130718334Speter      /* Don't warn about extern decl followed by (tentative) definition.  */
130818334Speter      && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl)))
130918334Speter    {
131018334Speter      warning_with_decl (newdecl, "redundant redeclaration of `%s' in same scope");
131118334Speter      warning_with_decl (olddecl, "previous declaration of `%s'");
131218334Speter    }
131318334Speter
131418334Speter  /* Copy all the DECL_... slots specified in the new decl
131518334Speter     except for any that we copy here from the old type.
131618334Speter
131718334Speter     Past this point, we don't change OLDTYPE and NEWTYPE
131818334Speter     even if we change the types of NEWDECL and OLDDECL.  */
131918334Speter
132018334Speter  if (types_match)
132118334Speter    {
132250397Sobrien      /* When copying info to olddecl, we store into write_olddecl
132350397Sobrien	 instead.  This allows us to avoid modifying olddecl when
132450397Sobrien	 different_binding_level is true.  */
132550397Sobrien      tree write_olddecl = different_binding_level ? newdecl : olddecl;
132650397Sobrien
132718334Speter      /* Merge the data types specified in the two decls.  */
132818334Speter      if (TREE_CODE (newdecl) != FUNCTION_DECL || !DECL_BUILT_IN (olddecl))
132950397Sobrien	{
133050397Sobrien	  if (different_binding_level)
133190075Sobrien	    {
133290075Sobrien	      if (TYPE_ARG_TYPES (oldtype) != 0
133390075Sobrien		  && TYPE_ARG_TYPES (newtype) == 0)
133490075Sobrien		TREE_TYPE (newdecl) = common_type (newtype, oldtype);
133590075Sobrien	      else
133690075Sobrien		TREE_TYPE (newdecl)
133790075Sobrien		  = build_type_attribute_variant
133890075Sobrien		    (newtype,
133990075Sobrien		     merge_attributes (TYPE_ATTRIBUTES (newtype),
134090075Sobrien				       TYPE_ATTRIBUTES (oldtype)));
134190075Sobrien	    }
134250397Sobrien	  else
134350397Sobrien	    TREE_TYPE (newdecl)
134450397Sobrien	      = TREE_TYPE (olddecl)
134550397Sobrien		= common_type (newtype, oldtype);
134650397Sobrien	}
134718334Speter
134818334Speter      /* Lay the type out, unless already done.  */
134918334Speter      if (oldtype != TREE_TYPE (newdecl))
135018334Speter	{
135118334Speter	  if (TREE_TYPE (newdecl) != error_mark_node)
135218334Speter	    layout_type (TREE_TYPE (newdecl));
135318334Speter	  if (TREE_CODE (newdecl) != FUNCTION_DECL
135418334Speter	      && TREE_CODE (newdecl) != TYPE_DECL
135518334Speter	      && TREE_CODE (newdecl) != CONST_DECL)
135618334Speter	    layout_decl (newdecl, 0);
135718334Speter	}
135818334Speter      else
135918334Speter	{
136018334Speter	  /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
136118334Speter	  DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
136290075Sobrien	  DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl);
136357844Sobrien	  DECL_MODE (newdecl) = DECL_MODE (olddecl);
136418334Speter	  if (TREE_CODE (olddecl) != FUNCTION_DECL)
136518334Speter	    if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
136690075Sobrien	      {
136790075Sobrien		DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
136890075Sobrien		DECL_USER_ALIGN (newdecl) |= DECL_ALIGN (olddecl);
136990075Sobrien	      }
137018334Speter	}
137118334Speter
137218334Speter      /* Keep the old rtl since we can safely use it.  */
137390075Sobrien      COPY_DECL_RTL (olddecl, newdecl);
137418334Speter
137518334Speter      /* Merge the type qualifiers.  */
137618334Speter      if (TREE_READONLY (newdecl))
137750397Sobrien	TREE_READONLY (write_olddecl) = 1;
137890075Sobrien
137918334Speter      if (TREE_THIS_VOLATILE (newdecl))
138018334Speter	{
138150397Sobrien	  TREE_THIS_VOLATILE (write_olddecl) = 1;
138290075Sobrien	  if (TREE_CODE (newdecl) == VAR_DECL
138390075Sobrien	      /* If an automatic variable is re-declared in the same
138490075Sobrien		 function scope, but the old declaration was not
138590075Sobrien		 volatile, make_var_volatile() would crash because the
138690075Sobrien		 variable would have been assigned to a pseudo, not a
138790075Sobrien		 MEM.  Since this duplicate declaration is invalid
138890075Sobrien		 anyway, we just skip the call.  */
138990075Sobrien	      && errmsg == 0)
139018334Speter	    make_var_volatile (newdecl);
139118334Speter	}
139218334Speter
139350397Sobrien      /* Keep source location of definition rather than declaration.  */
139450397Sobrien      /* When called with different_binding_level set, keep the old
139550397Sobrien	 information so that meaningful diagnostics can be given.  */
139650397Sobrien      if (DECL_INITIAL (newdecl) == 0 && DECL_INITIAL (olddecl) != 0
139750397Sobrien	  && ! different_binding_level)
139818334Speter	{
139918334Speter	  DECL_SOURCE_LINE (newdecl) = DECL_SOURCE_LINE (olddecl);
140018334Speter	  DECL_SOURCE_FILE (newdecl) = DECL_SOURCE_FILE (olddecl);
140118334Speter	}
140218334Speter
140318334Speter      /* Merge the unused-warning information.  */
140418334Speter      if (DECL_IN_SYSTEM_HEADER (olddecl))
140518334Speter	DECL_IN_SYSTEM_HEADER (newdecl) = 1;
140618334Speter      else if (DECL_IN_SYSTEM_HEADER (newdecl))
140750397Sobrien	DECL_IN_SYSTEM_HEADER (write_olddecl) = 1;
140818334Speter
140918334Speter      /* Merge the initialization information.  */
141050397Sobrien      /* When called with different_binding_level set, don't copy over
141150397Sobrien	 DECL_INITIAL, so that we don't accidentally change function
141250397Sobrien	 declarations into function definitions.  */
141350397Sobrien      if (DECL_INITIAL (newdecl) == 0 && ! different_binding_level)
141418334Speter	DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
141518334Speter
141618334Speter      /* Merge the section attribute.
141718334Speter         We want to issue an error if the sections conflict but that must be
141818334Speter	 done later in decl_attributes since we are called before attributes
141918334Speter	 are assigned.  */
142018334Speter      if (DECL_SECTION_NAME (newdecl) == NULL_TREE)
142118334Speter	DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl);
142218334Speter
142390075Sobrien      /* Copy the assembler name.
142490075Sobrien	 Currently, it can only be defined in the prototype.  */
142590075Sobrien      COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
142690075Sobrien
142718334Speter      if (TREE_CODE (newdecl) == FUNCTION_DECL)
142818334Speter	{
142918334Speter	  DECL_STATIC_CONSTRUCTOR(newdecl) |= DECL_STATIC_CONSTRUCTOR(olddecl);
143018334Speter	  DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
143190075Sobrien	  DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl);
143252284Sobrien	  DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl)
143352284Sobrien	    |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl);
143418334Speter	}
143518334Speter    }
143618334Speter  /* If cannot merge, then use the new type and qualifiers,
143718334Speter     and don't preserve the old rtl.  */
143850397Sobrien  else if (! different_binding_level)
143918334Speter    {
144018334Speter      TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
144118334Speter      TREE_READONLY (olddecl) = TREE_READONLY (newdecl);
144218334Speter      TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl);
144318334Speter      TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl);
144418334Speter    }
144518334Speter
144618334Speter  /* Merge the storage class information.  */
144796263Sobrien  merge_weak (newdecl, olddecl);
144896263Sobrien
144918334Speter  /* For functions, static overrides non-static.  */
145018334Speter  if (TREE_CODE (newdecl) == FUNCTION_DECL)
145118334Speter    {
145218334Speter      TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
145318334Speter      /* This is since we don't automatically
145418334Speter	 copy the attributes of NEWDECL into OLDDECL.  */
145550397Sobrien      /* No need to worry about different_binding_level here because
145650397Sobrien	 then TREE_PUBLIC (newdecl) was true.  */
145718334Speter      TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
145818334Speter      /* If this clears `static', clear it in the identifier too.  */
145918334Speter      if (! TREE_PUBLIC (olddecl))
146018334Speter	TREE_PUBLIC (DECL_NAME (olddecl)) = 0;
146118334Speter    }
146218334Speter  if (DECL_EXTERNAL (newdecl))
146318334Speter    {
146490075Sobrien      if (! different_binding_level)
146590075Sobrien	{
146690075Sobrien	  /* Don't mess with these flags on local externs; they remain
146790075Sobrien	     external even if there's a declaration at file scope which
146890075Sobrien	     isn't.  */
146990075Sobrien	  TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
147090075Sobrien	  DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
147190075Sobrien	}
147218334Speter      /* An extern decl does not override previous storage class.  */
147318334Speter      TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
147450397Sobrien      if (! DECL_EXTERNAL (newdecl))
147550397Sobrien	DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
147618334Speter    }
147718334Speter  else
147818334Speter    {
147918334Speter      TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
148018334Speter      TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
148118334Speter    }
148218334Speter
148350397Sobrien  if (TREE_CODE (newdecl) == FUNCTION_DECL)
148418334Speter    {
148590075Sobrien      /* If we're redefining a function previously defined as extern
148690075Sobrien	 inline, make sure we emit debug info for the inline before we
148790075Sobrien	 throw it away, in case it was inlined into a function that hasn't
148890075Sobrien	 been written out yet.  */
1489110623Skan      if (new_is_definition && DECL_INITIAL (olddecl))
149090075Sobrien	{
1491110623Skan	  if (TREE_USED (olddecl))
1492110623Skan	    (*debug_hooks->outlining_inline_function) (olddecl);
149390075Sobrien
149490075Sobrien	  /* The new defn must not be inline.  */
149590075Sobrien	  DECL_INLINE (newdecl) = 0;
149690075Sobrien	  DECL_UNINLINABLE (newdecl) = 1;
149790075Sobrien	}
149890075Sobrien      else
149990075Sobrien	{
150090075Sobrien	  /* If either decl says `inline', this fn is inline,
150190075Sobrien	     unless its definition was passed already.  */
150290075Sobrien	  if (DECL_DECLARED_INLINE_P (newdecl)
150390075Sobrien	      || DECL_DECLARED_INLINE_P (olddecl))
150490075Sobrien	    DECL_DECLARED_INLINE_P (newdecl) = 1;
150590075Sobrien
150690075Sobrien	  DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl)
150790075Sobrien	    = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl));
150890075Sobrien	}
150990075Sobrien
151018334Speter      if (DECL_BUILT_IN (olddecl))
151118334Speter	{
151250397Sobrien	  /* Get rid of any built-in function if new arg types don't match it
151350397Sobrien	     or if we have a function definition.  */
151450397Sobrien	  if (! types_match || new_is_definition)
151550397Sobrien	    {
151650397Sobrien	      if (! different_binding_level)
151750397Sobrien		{
151850397Sobrien		  TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
151990075Sobrien		  DECL_BUILT_IN_CLASS (olddecl) = NOT_BUILT_IN;
152050397Sobrien		}
152150397Sobrien	    }
152250397Sobrien	  else
152350397Sobrien	    {
152450397Sobrien	      /* If redeclaring a builtin function, and not a definition,
152550397Sobrien		 it stays built in.  */
152690075Sobrien	      DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl);
152750397Sobrien	      DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
152850397Sobrien	    }
152918334Speter	}
153090075Sobrien
153150397Sobrien      /* Also preserve various other info from the definition.  */
153250397Sobrien      if (! new_is_definition)
153350397Sobrien	{
153450397Sobrien	  DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
153550397Sobrien	  /* When called with different_binding_level set, don't copy over
153650397Sobrien	     DECL_INITIAL, so that we don't accidentally change function
153750397Sobrien	     declarations into function definitions.  */
153850397Sobrien	  if (! different_binding_level)
153950397Sobrien	    DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
154050397Sobrien	  DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl);
154190075Sobrien	  DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
154290075Sobrien	  DECL_NUM_STMTS (newdecl) = DECL_NUM_STMTS (olddecl);
154350397Sobrien	  DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
154490075Sobrien
154590075Sobrien	  /* Set DECL_INLINE on the declaration if we've got a body
154690075Sobrien	     from which to instantiate.  */
154790075Sobrien	  if (DECL_INLINE (olddecl) && ! DECL_UNINLINABLE (newdecl))
154890075Sobrien	    {
154990075Sobrien	      DECL_INLINE (newdecl) = 1;
155090075Sobrien	      DECL_ABSTRACT_ORIGIN (newdecl)
155190075Sobrien		= (different_binding_level
155290075Sobrien		   ? DECL_ORIGIN (olddecl)
155390075Sobrien		   : DECL_ABSTRACT_ORIGIN (olddecl));
155490075Sobrien	    }
155550397Sobrien	}
155690075Sobrien      else
155790075Sobrien	{
155890075Sobrien	  /* If a previous declaration said inline, mark the
155990075Sobrien	     definition as inlinable.  */
156090075Sobrien	  if (DECL_DECLARED_INLINE_P (newdecl)
156190075Sobrien	      && ! DECL_UNINLINABLE (newdecl))
156290075Sobrien	    DECL_INLINE (newdecl) = 1;
156390075Sobrien	}
156450397Sobrien    }
156550397Sobrien  if (different_binding_level)
156690075Sobrien    return 0;
156718334Speter
156818334Speter  /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
156950397Sobrien     But preserve OLDDECL's DECL_UID.  */
157018334Speter  {
157190075Sobrien    unsigned olddecl_uid = DECL_UID (olddecl);
157218334Speter
157390075Sobrien    memcpy ((char *) olddecl + sizeof (struct tree_common),
157490075Sobrien	    (char *) newdecl + sizeof (struct tree_common),
157590075Sobrien	    sizeof (struct tree_decl) - sizeof (struct tree_common));
157618334Speter    DECL_UID (olddecl) = olddecl_uid;
157718334Speter  }
157818334Speter
157950397Sobrien  /* NEWDECL contains the merged attribute lists.
158050397Sobrien     Update OLDDECL to be the same.  */
158190075Sobrien  DECL_ATTRIBUTES (olddecl) = DECL_ATTRIBUTES (newdecl);
158250397Sobrien
158318334Speter  return 1;
158418334Speter}
158518334Speter
158690075Sobrien/* Check whether decl-node X shadows an existing declaration.
158790075Sobrien   OLDLOCAL is the old IDENTIFIER_LOCAL_VALUE of the DECL_NAME of X,
158890075Sobrien   which might be a NULL_TREE.  */
158990075Sobrienstatic void
159090075Sobrienwarn_if_shadowing (x, oldlocal)
159190075Sobrien     tree x, oldlocal;
159290075Sobrien{
159390075Sobrien  tree name;
159490075Sobrien
159590075Sobrien  if (DECL_EXTERNAL (x))
159690075Sobrien    return;
159790075Sobrien
159890075Sobrien  name = DECL_NAME (x);
159990075Sobrien
160090075Sobrien  /* Warn if shadowing an argument at the top level of the body.  */
160190075Sobrien  if (oldlocal != 0
160290075Sobrien      /* This warning doesn't apply to the parms of a nested fcn.  */
160390075Sobrien      && ! current_binding_level->parm_flag
160490075Sobrien      /* Check that this is one level down from the parms.  */
160590075Sobrien      && current_binding_level->level_chain->parm_flag
160690075Sobrien      /* Check that the decl being shadowed
160790075Sobrien	 comes from the parm level, one level up.  */
160890075Sobrien      && chain_member (oldlocal, current_binding_level->level_chain->names))
160990075Sobrien    {
161090075Sobrien      if (TREE_CODE (oldlocal) == PARM_DECL)
161190075Sobrien	pedwarn ("declaration of `%s' shadows a parameter",
161290075Sobrien		 IDENTIFIER_POINTER (name));
161390075Sobrien      else
161490075Sobrien	pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
161590075Sobrien		 IDENTIFIER_POINTER (name));
161690075Sobrien    }
161790075Sobrien  /* Maybe warn if shadowing something else.  */
161890075Sobrien  else if (warn_shadow
161990075Sobrien	   /* No shadow warnings for internally generated vars.  */
162090075Sobrien	   && DECL_SOURCE_LINE (x) != 0
162190075Sobrien	   /* No shadow warnings for vars made for inlining.  */
162290075Sobrien	   && ! DECL_FROM_INLINE (x))
162390075Sobrien    {
162490075Sobrien      if (TREE_CODE (x) == PARM_DECL
162590075Sobrien	  && current_binding_level->level_chain->parm_flag)
162690075Sobrien	/* Don't warn about the parm names in function declarator
162790075Sobrien	   within a function declarator.
162890075Sobrien	   It would be nice to avoid warning in any function
162990075Sobrien	   declarator in a declaration, as opposed to a definition,
163090075Sobrien	   but there is no way to tell it's not a definition.  */
163190075Sobrien	;
163290075Sobrien      else if (oldlocal)
163390075Sobrien	{
163490075Sobrien	  if (TREE_CODE (oldlocal) == PARM_DECL)
163590075Sobrien	    shadow_warning ("a parameter", name, oldlocal);
163690075Sobrien	  else
163790075Sobrien	    shadow_warning ("a previous local", name, oldlocal);
163890075Sobrien	}
163990075Sobrien      else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
164090075Sobrien	       && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
164190075Sobrien	shadow_warning ("a global declaration", name,
164290075Sobrien			IDENTIFIER_GLOBAL_VALUE (name));
164390075Sobrien    }
164490075Sobrien}
164590075Sobrien
164618334Speter/* Record a decl-node X as belonging to the current lexical scope.
164718334Speter   Check for errors (such as an incompatible declaration for the same
164818334Speter   name already seen in the same scope).
164918334Speter
165018334Speter   Returns either X or an old decl for the same name.
165118334Speter   If an old decl is returned, it may have been smashed
165218334Speter   to agree with what X says.  */
165318334Speter
165418334Spetertree
165518334Speterpushdecl (x)
165618334Speter     tree x;
165718334Speter{
165890075Sobrien  tree t;
165990075Sobrien  tree name = DECL_NAME (x);
166090075Sobrien  struct binding_level *b = current_binding_level;
166118334Speter
166290075Sobrien  /* Functions need the lang_decl data.  */
166390075Sobrien  if (TREE_CODE (x) == FUNCTION_DECL && ! DECL_LANG_SPECIFIC (x))
166490075Sobrien    DECL_LANG_SPECIFIC (x) = (struct lang_decl *)
166590075Sobrien      ggc_alloc_cleared (sizeof (struct lang_decl));
166690075Sobrien
166718334Speter  DECL_CONTEXT (x) = current_function_decl;
166818334Speter  /* A local extern declaration for a function doesn't constitute nesting.
166918334Speter     A local auto declaration does, since it's a forward decl
167018334Speter     for a nested function coming later.  */
167190075Sobrien  if ((TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL)
167290075Sobrien      && DECL_INITIAL (x) == 0 && DECL_EXTERNAL (x))
167318334Speter    DECL_CONTEXT (x) = 0;
167418334Speter
167518334Speter  if (name)
167618334Speter    {
167750397Sobrien      int different_binding_level = 0;
167818334Speter
167990075Sobrien      if (warn_nested_externs
168090075Sobrien	  && DECL_EXTERNAL (x)
168190075Sobrien	  && b != global_binding_level
168290075Sobrien	  && x != IDENTIFIER_IMPLICIT_DECL (name)
168390075Sobrien	  /* No error messages for __FUNCTION__ and __PRETTY_FUNCTION__.  */
168490075Sobrien	  && !DECL_IN_SYSTEM_HEADER (x))
168590075Sobrien	warning ("nested extern declaration of `%s'",
168690075Sobrien		 IDENTIFIER_POINTER (name));
168790075Sobrien
168850397Sobrien      t = lookup_name_current_level (name);
1689117421Skan      if (! t && DECL_EXTERNAL (x) && TREE_PUBLIC (x))
169050397Sobrien	{
169196263Sobrien	  t = IDENTIFIER_GLOBAL_VALUE (name);
169250397Sobrien	  /* Type decls at global scope don't conflict with externs declared
169350397Sobrien	     inside lexical blocks.  */
169496263Sobrien	  if (! t || TREE_CODE (t) == TYPE_DECL)
169596263Sobrien	    /* If there's no visible global declaration, try for an
169696263Sobrien               invisible one.  */
169796263Sobrien	    t = IDENTIFIER_LIMBO_VALUE (name);
169850397Sobrien	  different_binding_level = 1;
169950397Sobrien	}
170018334Speter      if (t != 0 && t == error_mark_node)
170118334Speter	/* error_mark_node is 0 for a while during initialization!  */
170218334Speter	{
170318334Speter	  t = 0;
170418334Speter	  error_with_decl (x, "`%s' used prior to declaration");
170518334Speter	}
170618334Speter
170750397Sobrien      /* If this decl is `static' and an implicit decl was seen previously,
1708117421Skan	 warn.  */
1709117421Skan      if (TREE_PUBLIC (name)
171050397Sobrien	  /* Don't test for DECL_EXTERNAL, because grokdeclarator
171150397Sobrien	     sets this for all functions.  */
171250397Sobrien	  && ! TREE_PUBLIC (x)
171350397Sobrien	  && (TREE_CODE (x) == FUNCTION_DECL || b == global_binding_level)
171450397Sobrien	  /* We used to warn also for explicit extern followed by static,
171550397Sobrien	     but sometimes you need to do it that way.  */
171650397Sobrien	  && IDENTIFIER_IMPLICIT_DECL (name) != 0)
171718334Speter	{
171850397Sobrien	  pedwarn ("`%s' was declared implicitly `extern' and later `static'",
171950397Sobrien		   IDENTIFIER_POINTER (name));
172050397Sobrien	  pedwarn_with_file_and_line
172150397Sobrien	    (DECL_SOURCE_FILE (IDENTIFIER_IMPLICIT_DECL (name)),
172250397Sobrien	     DECL_SOURCE_LINE (IDENTIFIER_IMPLICIT_DECL (name)),
172350397Sobrien	     "previous declaration of `%s'",
172450397Sobrien	     IDENTIFIER_POINTER (name));
172550397Sobrien	  TREE_THIS_VOLATILE (name) = 1;
172650397Sobrien	}
172750397Sobrien
172850397Sobrien      if (t != 0 && duplicate_decls (x, t, different_binding_level))
172950397Sobrien	{
173018334Speter	  if (TREE_CODE (t) == PARM_DECL)
173118334Speter	    {
173218334Speter	      /* Don't allow more than one "real" duplicate
173318334Speter		 of a forward parm decl.  */
173418334Speter	      TREE_ASM_WRITTEN (t) = TREE_ASM_WRITTEN (x);
173518334Speter	      return t;
173618334Speter	    }
173750397Sobrien	  return t;
173818334Speter	}
173918334Speter
174018334Speter      /* If we are processing a typedef statement, generate a whole new
1741117421Skan	 ..._TYPE node (which will be just a variant of the existing
174218334Speter	 ..._TYPE node with identical properties) and then install the
174318334Speter	 TYPE_DECL node generated to represent the typedef name as the
174418334Speter	 TYPE_NAME of this brand new (duplicate) ..._TYPE node.
174518334Speter
174618334Speter	 The whole point here is to end up with a situation where each
174718334Speter	 and every ..._TYPE node the compiler creates will be uniquely
174818334Speter	 associated with AT MOST one node representing a typedef name.
174918334Speter	 This way, even though the compiler substitutes corresponding
175018334Speter	 ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very
175118334Speter	 early on, later parts of the compiler can always do the reverse
175218334Speter	 translation and get back the corresponding typedef name.  For
175318334Speter	 example, given:
175418334Speter
175518334Speter		typedef struct S MY_TYPE;
175618334Speter		MY_TYPE object;
175718334Speter
175818334Speter	 Later parts of the compiler might only know that `object' was of
175950397Sobrien	 type `struct S' if it were not for code just below.  With this
176018334Speter	 code however, later parts of the compiler see something like:
176118334Speter
176218334Speter		struct S' == struct S
176318334Speter		typedef struct S' MY_TYPE;
176418334Speter		struct S' object;
176518334Speter
176618334Speter	 And they can then deduce (from the node for type struct S') that
176718334Speter	 the original object declaration was:
176818334Speter
176918334Speter		MY_TYPE object;
177018334Speter
177118334Speter	 Being able to do this is important for proper support of protoize,
177218334Speter	 and also for generating precise symbolic debugging information
177318334Speter	 which takes full account of the programmer's (typedef) vocabulary.
177418334Speter
177518334Speter         Obviously, we don't want to generate a duplicate ..._TYPE node if
177618334Speter	 the TYPE_DECL node that we are now processing really represents a
177718334Speter	 standard built-in type.
177818334Speter
177918334Speter         Since all standard types are effectively declared at line zero
178018334Speter         in the source file, we can easily check to see if we are working
178118334Speter         on a standard type by checking the current value of lineno.  */
178218334Speter
178318334Speter      if (TREE_CODE (x) == TYPE_DECL)
178490075Sobrien	{
178590075Sobrien	  if (DECL_SOURCE_LINE (x) == 0)
178690075Sobrien	    {
178718334Speter	      if (TYPE_NAME (TREE_TYPE (x)) == 0)
178890075Sobrien		TYPE_NAME (TREE_TYPE (x)) = x;
178990075Sobrien	    }
179090075Sobrien	  else if (TREE_TYPE (x) != error_mark_node
179150397Sobrien		   && DECL_ORIGINAL_TYPE (x) == NULL_TREE)
179290075Sobrien	    {
179390075Sobrien	      tree tt = TREE_TYPE (x);
179450397Sobrien	      DECL_ORIGINAL_TYPE (x) = tt;
179590075Sobrien	      tt = build_type_copy (tt);
179690075Sobrien	      TYPE_NAME (tt) = x;
179790075Sobrien	      TREE_USED (tt) = TREE_USED (x);
179890075Sobrien	      TREE_TYPE (x) = tt;
179990075Sobrien	    }
180090075Sobrien	}
180118334Speter
180218334Speter      /* Multiple external decls of the same identifier ought to match.
180318334Speter	 We get warnings about inline functions where they are defined.
180418334Speter	 Avoid duplicate warnings where they are used.  */
180590075Sobrien      if (TREE_PUBLIC (x)
180690075Sobrien	  && ! (TREE_CODE (x) == FUNCTION_DECL && DECL_INLINE (x)))
180718334Speter	{
180818334Speter	  tree decl;
180918334Speter
1810117421Skan	  if (IDENTIFIER_LIMBO_VALUE (name) != 0)
181118334Speter	    /* Decls in limbo are always extern, so no need to check that.  */
181218334Speter	    decl = IDENTIFIER_LIMBO_VALUE (name);
181318334Speter	  else
181418334Speter	    decl = 0;
181518334Speter
181618334Speter	  if (decl && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl))
181718334Speter	      /* If old decl is built-in, we already warned if we should.  */
181818334Speter	      && !DECL_BUILT_IN (decl))
181918334Speter	    {
182018334Speter	      pedwarn_with_decl (x,
182118334Speter				 "type mismatch with previous external decl");
182218334Speter	      pedwarn_with_decl (decl, "previous external decl of `%s'");
182318334Speter	    }
182418334Speter	}
182518334Speter
182618334Speter      /* If a function has had an implicit declaration, and then is defined,
182718334Speter	 make sure they are compatible.  */
182818334Speter
182918334Speter      if (IDENTIFIER_IMPLICIT_DECL (name) != 0
183018334Speter	  && IDENTIFIER_GLOBAL_VALUE (name) == 0
183118334Speter	  && TREE_CODE (x) == FUNCTION_DECL
183218334Speter	  && ! comptypes (TREE_TYPE (x),
183318334Speter			  TREE_TYPE (IDENTIFIER_IMPLICIT_DECL (name))))
183418334Speter	{
183518334Speter	  warning_with_decl (x, "type mismatch with previous implicit declaration");
183618334Speter	  warning_with_decl (IDENTIFIER_IMPLICIT_DECL (name),
183718334Speter			     "previous implicit declaration of `%s'");
183818334Speter	}
183918334Speter
184018334Speter      /* This name is new in its binding level.
184118334Speter	 Install the new declaration and return it.  */
184218334Speter      if (b == global_binding_level)
184318334Speter	{
184418334Speter	  /* Install a global value.  */
184590075Sobrien
184618334Speter	  /* If the first global decl has external linkage,
184718334Speter	     warn if we later see static one.  */
184818334Speter	  if (IDENTIFIER_GLOBAL_VALUE (name) == 0 && TREE_PUBLIC (x))
184918334Speter	    TREE_PUBLIC (name) = 1;
185018334Speter
185118334Speter	  IDENTIFIER_GLOBAL_VALUE (name) = x;
185218334Speter
185318334Speter	  /* We no longer care about any previous block level declarations.  */
185418334Speter	  IDENTIFIER_LIMBO_VALUE (name) = 0;
185518334Speter
185618334Speter	  /* Don't forget if the function was used via an implicit decl.  */
185718334Speter	  if (IDENTIFIER_IMPLICIT_DECL (name)
185818334Speter	      && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
185918334Speter	    TREE_USED (x) = 1, TREE_USED (name) = 1;
186018334Speter
186118334Speter	  /* Don't forget if its address was taken in that way.  */
186218334Speter	  if (IDENTIFIER_IMPLICIT_DECL (name)
186318334Speter	      && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
186418334Speter	    TREE_ADDRESSABLE (x) = 1;
186518334Speter
186618334Speter	  /* Warn about mismatches against previous implicit decl.  */
186718334Speter	  if (IDENTIFIER_IMPLICIT_DECL (name) != 0
186818334Speter	      /* If this real decl matches the implicit, don't complain.  */
186918334Speter	      && ! (TREE_CODE (x) == FUNCTION_DECL
187018334Speter		    && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (x)))
187118334Speter			== integer_type_node)))
187218334Speter	    pedwarn ("`%s' was previously implicitly declared to return `int'",
187318334Speter		     IDENTIFIER_POINTER (name));
187418334Speter
187518334Speter	  /* If this decl is `static' and an `extern' was seen previously,
187618334Speter	     that is erroneous.  */
187718334Speter	  if (TREE_PUBLIC (name)
187818334Speter	      && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x))
187918334Speter	    {
188018334Speter	      /* Okay to redeclare an ANSI built-in as static.  */
188118334Speter	      if (t != 0 && DECL_BUILT_IN (t))
188218334Speter		;
188318334Speter	      /* Okay to declare a non-ANSI built-in as anything.  */
188418334Speter	      else if (t != 0 && DECL_BUILT_IN_NONANSI (t))
188518334Speter		;
188650397Sobrien	      /* Okay to have global type decl after an earlier extern
188750397Sobrien		 declaration inside a lexical block.  */
188850397Sobrien	      else if (TREE_CODE (x) == TYPE_DECL)
188950397Sobrien		;
189018334Speter	      else if (IDENTIFIER_IMPLICIT_DECL (name))
189150397Sobrien		{
189250397Sobrien		  if (! TREE_THIS_VOLATILE (name))
189350397Sobrien		    pedwarn ("`%s' was declared implicitly `extern' and later `static'",
189450397Sobrien			     IDENTIFIER_POINTER (name));
189550397Sobrien		}
189618334Speter	      else
189718334Speter		pedwarn ("`%s' was declared `extern' and later `static'",
189818334Speter			 IDENTIFIER_POINTER (name));
189918334Speter	    }
190018334Speter	}
190118334Speter      else
190218334Speter	{
190318334Speter	  /* Here to install a non-global value.  */
190418334Speter	  tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
190518334Speter	  tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
190690075Sobrien
190718334Speter	  IDENTIFIER_LOCAL_VALUE (name) = x;
190818334Speter
190918334Speter	  /* If this is an extern function declaration, see if we
191018334Speter	     have a global definition or declaration for the function.  */
191118334Speter	  if (oldlocal == 0
191218334Speter	      && oldglobal != 0
191318334Speter	      && TREE_CODE (x) == FUNCTION_DECL
191490075Sobrien	      && TREE_CODE (oldglobal) == FUNCTION_DECL
191590075Sobrien	      && DECL_EXTERNAL (x)
191690075Sobrien	      && ! DECL_DECLARED_INLINE_P (x))
191718334Speter	    {
191818334Speter	      /* We have one.  Their types must agree.  */
191918334Speter	      if (! comptypes (TREE_TYPE (x),
192018334Speter			       TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name))))
192118334Speter		pedwarn_with_decl (x, "extern declaration of `%s' doesn't match global one");
192218334Speter	      else
192318334Speter		{
192418334Speter		  /* Inner extern decl is inline if global one is.
192518334Speter		     Copy enough to really inline it.  */
192690075Sobrien		  if (DECL_DECLARED_INLINE_P (oldglobal))
192718334Speter		    {
192890075Sobrien		      DECL_DECLARED_INLINE_P (x)
192990075Sobrien		        = DECL_DECLARED_INLINE_P (oldglobal);
193018334Speter		      DECL_INLINE (x) = DECL_INLINE (oldglobal);
193118334Speter		      DECL_INITIAL (x) = (current_function_decl == oldglobal
193218334Speter					  ? 0 : DECL_INITIAL (oldglobal));
193318334Speter		      DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
193490075Sobrien		      DECL_NUM_STMTS (x) = DECL_NUM_STMTS (oldglobal);
193518334Speter		      DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
193618334Speter		      DECL_RESULT (x) = DECL_RESULT (oldglobal);
193718334Speter		      TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
193890075Sobrien		      DECL_ABSTRACT_ORIGIN (x)
193990075Sobrien			= DECL_ABSTRACT_ORIGIN (oldglobal);
194018334Speter		    }
194118334Speter		  /* Inner extern decl is built-in if global one is.  */
194218334Speter		  if (DECL_BUILT_IN (oldglobal))
194318334Speter		    {
194490075Sobrien		      DECL_BUILT_IN_CLASS (x) = DECL_BUILT_IN_CLASS (oldglobal);
194518334Speter		      DECL_FUNCTION_CODE (x) = DECL_FUNCTION_CODE (oldglobal);
194618334Speter		    }
194718334Speter		  /* Keep the arg types from a file-scope fcn defn.  */
194818334Speter		  if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != 0
194918334Speter		      && DECL_INITIAL (oldglobal)
195018334Speter		      && TYPE_ARG_TYPES (TREE_TYPE (x)) == 0)
195118334Speter		    TREE_TYPE (x) = TREE_TYPE (oldglobal);
195218334Speter		}
195318334Speter	    }
195418334Speter
195590075Sobrien#if 0
195690075Sobrien	  /* This case is probably sometimes the right thing to do.  */
195718334Speter	  /* If we have a local external declaration,
195818334Speter	     then any file-scope declaration should not
195918334Speter	     have been static.  */
196018334Speter	  if (oldlocal == 0 && oldglobal != 0
196118334Speter	      && !TREE_PUBLIC (oldglobal)
196218334Speter	      && DECL_EXTERNAL (x) && TREE_PUBLIC (x))
196318334Speter	    warning ("`%s' locally external but globally static",
196418334Speter		     IDENTIFIER_POINTER (name));
196518334Speter#endif
196618334Speter
196718334Speter	  /* If we have a local external declaration,
196818334Speter	     and no file-scope declaration has yet been seen,
196918334Speter	     then if we later have a file-scope decl it must not be static.  */
197018334Speter	  if (oldlocal == 0
197118334Speter	      && DECL_EXTERNAL (x)
197218334Speter	      && TREE_PUBLIC (x))
197318334Speter	    {
197450397Sobrien	      if (oldglobal == 0)
197590075Sobrien		TREE_PUBLIC (name) = 1;
197618334Speter
197718334Speter	      /* Save this decl, so that we can do type checking against
197818334Speter		 other decls after it falls out of scope.
197918334Speter
198018334Speter		 Only save it once.  This prevents temporary decls created in
198118334Speter		 expand_inline_function from being used here, since this
198218334Speter		 will have been set when the inline function was parsed.
198318334Speter		 It also helps give slightly better warnings.  */
198418334Speter	      if (IDENTIFIER_LIMBO_VALUE (name) == 0)
198518334Speter		IDENTIFIER_LIMBO_VALUE (name) = x;
198618334Speter	    }
198718334Speter
198890075Sobrien	  warn_if_shadowing (x, oldlocal);
198918334Speter
199018334Speter	  /* If storing a local value, there may already be one (inherited).
199118334Speter	     If so, record it for restoration when this binding level ends.  */
199218334Speter	  if (oldlocal != 0)
199318334Speter	    b->shadowed = tree_cons (name, oldlocal, b->shadowed);
199418334Speter	}
199518334Speter
1996117421Skan      /* Keep list of variables in this level with incomplete type.
199790075Sobrien	 If the input is erroneous, we can have error_mark in the type
199890075Sobrien	 slot (e.g. "f(void a, ...)") - that doesn't count as an
199990075Sobrien	 incomplete type.  */
200090075Sobrien      if (TREE_TYPE (x) != error_mark_node
200190075Sobrien	  && !COMPLETE_TYPE_P (TREE_TYPE (x)))
200290075Sobrien	{
200390075Sobrien	  tree element = TREE_TYPE (x);
200490075Sobrien
200590075Sobrien	  while (TREE_CODE (element) == ARRAY_TYPE)
200690075Sobrien	    element = TREE_TYPE (element);
200790075Sobrien	  if (TREE_CODE (element) == RECORD_TYPE
200890075Sobrien	      || TREE_CODE (element) == UNION_TYPE)
2009117421Skan	    b->incomplete_list = tree_cons (NULL_TREE, x, b->incomplete_list);
201090075Sobrien	}
201118334Speter    }
201218334Speter
201318334Speter  /* Put decls on list in reverse order.
201418334Speter     We will reverse them later if necessary.  */
201518334Speter  TREE_CHAIN (x) = b->names;
201618334Speter  b->names = x;
201718334Speter
201818334Speter  return x;
201918334Speter}
202018334Speter
202118334Speter/* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate.  */
202218334Speter
202318334Spetertree
202418334Speterpushdecl_top_level (x)
202518334Speter     tree x;
202618334Speter{
202790075Sobrien  tree t;
202890075Sobrien  struct binding_level *b = current_binding_level;
202918334Speter
203018334Speter  current_binding_level = global_binding_level;
203118334Speter  t = pushdecl (x);
203218334Speter  current_binding_level = b;
203318334Speter  return t;
203418334Speter}
203518334Speter
203618334Speter/* Generate an implicit declaration for identifier FUNCTIONID
203718334Speter   as a function of type int ().  Print a warning if appropriate.  */
203818334Speter
203918334Spetertree
204018334Speterimplicitly_declare (functionid)
204118334Speter     tree functionid;
204218334Speter{
204390075Sobrien  tree decl;
204418334Speter  int traditional_warning = 0;
204518334Speter  /* Only one "implicit declaration" warning per identifier.  */
204618334Speter  int implicit_warning;
204718334Speter
204818334Speter  /* We used to reuse an old implicit decl here,
204918334Speter     but this loses with inline functions because it can clobber
205018334Speter     the saved decl chains.  */
205190075Sobrien#if 0
205290075Sobrien  if (IDENTIFIER_IMPLICIT_DECL (functionid) != 0)
205318334Speter    decl = IDENTIFIER_IMPLICIT_DECL (functionid);
205490075Sobrien  else
205590075Sobrien#endif
205618334Speter    decl = build_decl (FUNCTION_DECL, functionid, default_function_type);
205718334Speter
205818334Speter  /* Warn of implicit decl following explicit local extern decl.
205918334Speter     This is probably a program designed for traditional C.  */
206018334Speter  if (TREE_PUBLIC (functionid) && IDENTIFIER_GLOBAL_VALUE (functionid) == 0)
206118334Speter    traditional_warning = 1;
206218334Speter
206318334Speter  /* Warn once of an implicit declaration.  */
206418334Speter  implicit_warning = (IDENTIFIER_IMPLICIT_DECL (functionid) == 0);
206518334Speter
206618334Speter  DECL_EXTERNAL (decl) = 1;
206718334Speter  TREE_PUBLIC (decl) = 1;
206818334Speter
206918334Speter  /* Record that we have an implicit decl and this is it.  */
207018334Speter  IDENTIFIER_IMPLICIT_DECL (functionid) = decl;
207118334Speter
207218334Speter  /* ANSI standard says implicit declarations are in the innermost block.
2073117421Skan     So we record the decl in the standard fashion.  */
207418334Speter  pushdecl (decl);
207518334Speter
2076117421Skan  /* This is a no-op in c-lang.c or something real in objc-act.c.  */
2077117421Skan  if (flag_objc)
2078117421Skan    objc_check_decl (decl);
207918334Speter
208090075Sobrien  rest_of_decl_compilation (decl, NULL, 0, 0);
208118334Speter
208290075Sobrien  if (implicit_warning)
208390075Sobrien    implicit_decl_warning (functionid);
208418334Speter  else if (warn_traditional && traditional_warning)
208518334Speter    warning ("function `%s' was previously declared within a block",
208618334Speter	     IDENTIFIER_POINTER (functionid));
208718334Speter
208818334Speter  /* Write a record describing this implicit function declaration to the
208918334Speter     prototypes file (if requested).  */
209018334Speter
209118334Speter  gen_aux_info_record (decl, 0, 1, 0);
209218334Speter
209390075Sobrien  /* Possibly apply some default attributes to this implicit declaration.  */
209490075Sobrien  decl_attributes (&decl, NULL_TREE, 0);
209518334Speter
209618334Speter  return decl;
209718334Speter}
209818334Speter
209990075Sobrienvoid
210090075Sobrienimplicit_decl_warning (id)
210190075Sobrien     tree id;
210290075Sobrien{
210390075Sobrien  const char *name = IDENTIFIER_POINTER (id);
210490075Sobrien  if (mesg_implicit_function_declaration == 2)
210590075Sobrien    error ("implicit declaration of function `%s'", name);
210690075Sobrien  else if (mesg_implicit_function_declaration == 1)
210790075Sobrien    warning ("implicit declaration of function `%s'", name);
210890075Sobrien}
210990075Sobrien
211018334Speter/* Return zero if the declaration NEWDECL is valid
211118334Speter   when the declaration OLDDECL (assumed to be for the same name)
211218334Speter   has already been seen.
211352284Sobrien   Otherwise return 1 if NEWDECL is a redefinition, 2 if it is a redeclaration,
211452284Sobrien   and 3 if it is a conflicting declaration.  */
211518334Speter
211652284Sobrienstatic int
211718334Speterredeclaration_error_message (newdecl, olddecl)
211818334Speter     tree newdecl, olddecl;
211918334Speter{
212018334Speter  if (TREE_CODE (newdecl) == TYPE_DECL)
212118334Speter    {
2122117421Skan      /* Do not complain about type redeclarations where at least one
2123117421Skan	 declaration was in a system header.  */
212418334Speter      if (DECL_IN_SYSTEM_HEADER (olddecl) || DECL_IN_SYSTEM_HEADER (newdecl))
212518334Speter	return 0;
212652284Sobrien      return 1;
212718334Speter    }
212818334Speter  else if (TREE_CODE (newdecl) == FUNCTION_DECL)
212918334Speter    {
213018334Speter      /* Declarations of functions can insist on internal linkage
213118334Speter	 but they can't be inconsistent with internal linkage,
213218334Speter	 so there can be no error on that account.
213318334Speter	 However defining the same name twice is no good.  */
213418334Speter      if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0
213518334Speter	  /* However, defining once as extern inline and a second
213618334Speter	     time in another way is ok.  */
213790075Sobrien	  && ! (DECL_DECLARED_INLINE_P (olddecl) && DECL_EXTERNAL (olddecl)
213890075Sobrien	       && ! (DECL_DECLARED_INLINE_P (newdecl)
213990075Sobrien		     && DECL_EXTERNAL (newdecl))))
214052284Sobrien	return 1;
214118334Speter      return 0;
214218334Speter    }
214390075Sobrien  else if (DECL_CONTEXT (newdecl) == NULL_TREE)
214418334Speter    {
214518334Speter      /* Objects declared at top level:  */
214618334Speter      /* If at least one is a reference, it's ok.  */
214718334Speter      if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
214818334Speter	return 0;
214918334Speter      /* Reject two definitions.  */
215018334Speter      if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0)
215152284Sobrien	return 1;
215218334Speter      /* Now we have two tentative defs, or one tentative and one real def.  */
215318334Speter      /* Insist that the linkage match.  */
215418334Speter      if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl))
215552284Sobrien	return 3;
215618334Speter      return 0;
215718334Speter    }
215818334Speter  else if (current_binding_level->parm_flag
215918334Speter	   && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl))
216018334Speter    return 0;
216118334Speter  else
216218334Speter    {
216318334Speter      /* Newdecl has block scope.  If olddecl has block scope also, then
216418334Speter	 reject two definitions, and reject a definition together with an
216518334Speter	 external reference.  Otherwise, it is OK, because newdecl must
216618334Speter	 be an extern reference to olddecl.  */
216718334Speter      if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl))
216818334Speter	  && DECL_CONTEXT (newdecl) == DECL_CONTEXT (olddecl))
216952284Sobrien	return 2;
217018334Speter      return 0;
217118334Speter    }
217218334Speter}
217318334Speter
217418334Speter/* Get the LABEL_DECL corresponding to identifier ID as a label.
217518334Speter   Create one if none exists so far for the current function.
217618334Speter   This function is called for both label definitions and label references.  */
217718334Speter
217818334Spetertree
217918334Speterlookup_label (id)
218018334Speter     tree id;
218118334Speter{
218290075Sobrien  tree decl = IDENTIFIER_LABEL_VALUE (id);
218318334Speter
218418334Speter  if (current_function_decl == 0)
218518334Speter    {
218618334Speter      error ("label %s referenced outside of any function",
218718334Speter	     IDENTIFIER_POINTER (id));
218818334Speter      return 0;
218918334Speter    }
219018334Speter
219118334Speter  /* Use a label already defined or ref'd with this name.  */
219218334Speter  if (decl != 0)
219318334Speter    {
219418334Speter      /* But not if it is inherited and wasn't declared to be inheritable.  */
219518334Speter      if (DECL_CONTEXT (decl) != current_function_decl
219618334Speter	  && ! C_DECLARED_LABEL_FLAG (decl))
219718334Speter	return shadow_label (id);
219818334Speter      return decl;
219918334Speter    }
220018334Speter
220118334Speter  decl = build_decl (LABEL_DECL, id, void_type_node);
220218334Speter
220318334Speter  /* A label not explicitly declared must be local to where it's ref'd.  */
220418334Speter  DECL_CONTEXT (decl) = current_function_decl;
220518334Speter
220618334Speter  DECL_MODE (decl) = VOIDmode;
220718334Speter
220818334Speter  /* Say where one reference is to the label,
220918334Speter     for the sake of the error if it is not defined.  */
221018334Speter  DECL_SOURCE_LINE (decl) = lineno;
221118334Speter  DECL_SOURCE_FILE (decl) = input_filename;
221218334Speter
221318334Speter  IDENTIFIER_LABEL_VALUE (id) = decl;
221418334Speter
221518334Speter  named_labels = tree_cons (NULL_TREE, decl, named_labels);
221618334Speter
221718334Speter  return decl;
221818334Speter}
221918334Speter
222018334Speter/* Make a label named NAME in the current function,
222118334Speter   shadowing silently any that may be inherited from containing functions
222218334Speter   or containing scopes.
222318334Speter
222418334Speter   Note that valid use, if the label being shadowed
222518334Speter   comes from another scope in the same function,
222618334Speter   requires calling declare_nonlocal_label right away.  */
222718334Speter
222818334Spetertree
222918334Spetershadow_label (name)
223018334Speter     tree name;
223118334Speter{
223290075Sobrien  tree decl = IDENTIFIER_LABEL_VALUE (name);
223318334Speter
223418334Speter  if (decl != 0)
223518334Speter    {
223690075Sobrien      tree dup;
223718334Speter
223818334Speter      /* Check to make sure that the label hasn't already been declared
223918334Speter	 at this label scope */
224018334Speter      for (dup = named_labels; dup; dup = TREE_CHAIN (dup))
224118334Speter	if (TREE_VALUE (dup) == decl)
224218334Speter	  {
224390075Sobrien	    error ("duplicate label declaration `%s'",
224418334Speter		   IDENTIFIER_POINTER (name));
224518334Speter	    error_with_decl (TREE_VALUE (dup),
224618334Speter			     "this is a previous declaration");
224718334Speter	    /* Just use the previous declaration.  */
224818334Speter	    return lookup_label (name);
224918334Speter	  }
225018334Speter
225118334Speter      shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
225218334Speter      IDENTIFIER_LABEL_VALUE (name) = decl = 0;
225318334Speter    }
225418334Speter
225518334Speter  return lookup_label (name);
225618334Speter}
225718334Speter
225818334Speter/* Define a label, specifying the location in the source file.
225918334Speter   Return the LABEL_DECL node for the label, if the definition is valid.
226018334Speter   Otherwise return 0.  */
226118334Speter
226218334Spetertree
226318334Speterdefine_label (filename, line, name)
226490075Sobrien     const char *filename;
226518334Speter     int line;
226618334Speter     tree name;
226718334Speter{
226818334Speter  tree decl = lookup_label (name);
226918334Speter
227018334Speter  /* If label with this name is known from an outer context, shadow it.  */
227118334Speter  if (decl != 0 && DECL_CONTEXT (decl) != current_function_decl)
227218334Speter    {
227318334Speter      shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
227418334Speter      IDENTIFIER_LABEL_VALUE (name) = 0;
227518334Speter      decl = lookup_label (name);
227618334Speter    }
227718334Speter
227890075Sobrien  if (warn_traditional && !in_system_header && lookup_name (name))
227990075Sobrien    warning_with_file_and_line (filename, line,
228090075Sobrien				"traditional C lacks a separate namespace for labels, identifier `%s' conflicts",
228190075Sobrien				IDENTIFIER_POINTER (name));
228290075Sobrien
228318334Speter  if (DECL_INITIAL (decl) != 0)
228418334Speter    {
228590075Sobrien      error_with_file_and_line (filename, line, "duplicate label `%s'",
228690075Sobrien				IDENTIFIER_POINTER (name));
228718334Speter      return 0;
228818334Speter    }
228918334Speter  else
229018334Speter    {
229118334Speter      /* Mark label as having been defined.  */
229218334Speter      DECL_INITIAL (decl) = error_mark_node;
229318334Speter      /* Say where in the source.  */
229418334Speter      DECL_SOURCE_FILE (decl) = filename;
229518334Speter      DECL_SOURCE_LINE (decl) = line;
229618334Speter      return decl;
229718334Speter    }
229818334Speter}
229918334Speter
230018334Speter/* Return the list of declarations of the current level.
230118334Speter   Note that this list is in reverse order unless/until
230218334Speter   you nreverse it; and when you do nreverse it, you must
230318334Speter   store the result back using `storedecls' or you will lose.  */
230418334Speter
230518334Spetertree
230618334Spetergetdecls ()
230718334Speter{
230818334Speter  return current_binding_level->names;
230918334Speter}
231018334Speter
231118334Speter/* Return the list of type-tags (for structs, etc) of the current level.  */
231218334Speter
231318334Spetertree
231418334Spetergettags ()
231518334Speter{
231618334Speter  return current_binding_level->tags;
231718334Speter}
231818334Speter
231918334Speter/* Store the list of declarations of the current level.
232018334Speter   This is done for the parameter declarations of a function being defined,
232118334Speter   after they are modified in the light of any missing parameters.  */
232218334Speter
232318334Speterstatic void
232418334Speterstoredecls (decls)
232518334Speter     tree decls;
232618334Speter{
232718334Speter  current_binding_level->names = decls;
232818334Speter}
232918334Speter
233018334Speter/* Similarly, store the list of tags of the current level.  */
233118334Speter
233218334Speterstatic void
233318334Speterstoretags (tags)
233418334Speter     tree tags;
233518334Speter{
233618334Speter  current_binding_level->tags = tags;
233718334Speter}
233818334Speter
233918334Speter/* Given NAME, an IDENTIFIER_NODE,
234018334Speter   return the structure (or union or enum) definition for that name.
234118334Speter   Searches binding levels from BINDING_LEVEL up to the global level.
234218334Speter   If THISLEVEL_ONLY is nonzero, searches only the specified context
234318334Speter   (but skips any tag-transparent contexts to find one that is
234418334Speter   meaningful for tags).
234518334Speter   CODE says which kind of type the caller wants;
234618334Speter   it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
234718334Speter   If the wrong kind of type is found, an error is reported.  */
234818334Speter
234918334Speterstatic tree
235018334Speterlookup_tag (code, name, binding_level, thislevel_only)
235118334Speter     enum tree_code code;
235218334Speter     struct binding_level *binding_level;
235318334Speter     tree name;
235418334Speter     int thislevel_only;
235518334Speter{
235690075Sobrien  struct binding_level *level;
235790075Sobrien  int thislevel = 1;
235818334Speter
235918334Speter  for (level = binding_level; level; level = level->level_chain)
236018334Speter    {
236190075Sobrien      tree tail;
236218334Speter      for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
236318334Speter	{
236418334Speter	  if (TREE_PURPOSE (tail) == name)
236518334Speter	    {
236618334Speter	      if (TREE_CODE (TREE_VALUE (tail)) != code)
236718334Speter		{
236818334Speter		  /* Definition isn't the kind we were looking for.  */
236918334Speter		  pending_invalid_xref = name;
237018334Speter		  pending_invalid_xref_file = input_filename;
237118334Speter		  pending_invalid_xref_line = lineno;
237290075Sobrien		  /* If in the same binding level as a declaration as a tag
237390075Sobrien		     of a different type, this must not be allowed to
237490075Sobrien		     shadow that tag, so give the error immediately.
237590075Sobrien		     (For example, "struct foo; union foo;" is invalid.)  */
237690075Sobrien		  if (thislevel)
237790075Sobrien		    pending_xref_error ();
237818334Speter		}
237918334Speter	      return TREE_VALUE (tail);
238018334Speter	    }
238118334Speter	}
238290075Sobrien      if (! level->tag_transparent)
238390075Sobrien	{
238490075Sobrien	  if (thislevel_only)
238590075Sobrien	    return NULL_TREE;
238690075Sobrien	  thislevel = 0;
238790075Sobrien	}
238818334Speter    }
238918334Speter  return NULL_TREE;
239018334Speter}
239118334Speter
239218334Speter/* Print an error message now
239318334Speter   for a recent invalid struct, union or enum cross reference.
239418334Speter   We don't print them immediately because they are not invalid
239518334Speter   when used in the `struct foo;' construct for shadowing.  */
239618334Speter
239718334Spetervoid
239818334Speterpending_xref_error ()
239918334Speter{
240018334Speter  if (pending_invalid_xref != 0)
240118334Speter    error_with_file_and_line (pending_invalid_xref_file,
240218334Speter			      pending_invalid_xref_line,
240318334Speter			      "`%s' defined as wrong kind of tag",
240418334Speter			      IDENTIFIER_POINTER (pending_invalid_xref));
240518334Speter  pending_invalid_xref = 0;
240618334Speter}
240718334Speter
240818334Speter/* Given a type, find the tag that was defined for it and return the tag name.
240918334Speter   Otherwise return 0.  */
241018334Speter
241118334Speterstatic tree
241218334Speterlookup_tag_reverse (type)
241318334Speter     tree type;
241418334Speter{
241590075Sobrien  struct binding_level *level;
241618334Speter
241718334Speter  for (level = current_binding_level; level; level = level->level_chain)
241818334Speter    {
241990075Sobrien      tree tail;
242018334Speter      for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
242118334Speter	{
242218334Speter	  if (TREE_VALUE (tail) == type)
242318334Speter	    return TREE_PURPOSE (tail);
242418334Speter	}
242518334Speter    }
242618334Speter  return NULL_TREE;
242718334Speter}
242818334Speter
242918334Speter/* Look up NAME in the current binding level and its superiors
243018334Speter   in the namespace of variables, functions and typedefs.
243118334Speter   Return a ..._DECL node of some kind representing its definition,
243218334Speter   or return 0 if it is undefined.  */
243318334Speter
243418334Spetertree
243518334Speterlookup_name (name)
243618334Speter     tree name;
243718334Speter{
243890075Sobrien  tree val;
243990075Sobrien
244018334Speter  if (current_binding_level != global_binding_level
244118334Speter      && IDENTIFIER_LOCAL_VALUE (name))
244218334Speter    val = IDENTIFIER_LOCAL_VALUE (name);
244318334Speter  else
244418334Speter    val = IDENTIFIER_GLOBAL_VALUE (name);
244518334Speter  return val;
244618334Speter}
244718334Speter
244818334Speter/* Similar to `lookup_name' but look only at current binding level.  */
244918334Speter
245018334Spetertree
245118334Speterlookup_name_current_level (name)
245218334Speter     tree name;
245318334Speter{
245490075Sobrien  tree t;
245518334Speter
245618334Speter  if (current_binding_level == global_binding_level)
245718334Speter    return IDENTIFIER_GLOBAL_VALUE (name);
245818334Speter
245918334Speter  if (IDENTIFIER_LOCAL_VALUE (name) == 0)
246018334Speter    return 0;
246118334Speter
246218334Speter  for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
246318334Speter    if (DECL_NAME (t) == name)
246418334Speter      break;
246518334Speter
246618334Speter  return t;
246718334Speter}
246818334Speter
246918334Speter/* Create the predefined scalar types of C,
247050397Sobrien   and some nodes representing standard constants (0, 1, (void *) 0).
247118334Speter   Initialize the global binding level.
247218334Speter   Make definitions for built-in primitive functions.  */
247318334Speter
247418334Spetervoid
247590075Sobrienc_init_decl_processing ()
247618334Speter{
247790075Sobrien  tree endlink;
247890075Sobrien  tree ptr_ftype_void, ptr_ftype_ptr;
247918334Speter
248090075Sobrien  /* Adds some ggc roots, and reserved words for c-parse.in.  */
248190075Sobrien  c_parse_init ();
248290075Sobrien
248318334Speter  current_function_decl = NULL;
248418334Speter  named_labels = NULL;
248518334Speter  current_binding_level = NULL_BINDING_LEVEL;
248618334Speter  free_binding_level = NULL_BINDING_LEVEL;
248790075Sobrien
248890075Sobrien  /* Make the binding_level structure for global names.  */
248990075Sobrien  pushlevel (0);
249018334Speter  global_binding_level = current_binding_level;
249118334Speter
249290075Sobrien  build_common_tree_nodes (flag_signed_char);
249318334Speter
249490075Sobrien  c_common_nodes_and_builtins ();
249518334Speter
249618334Speter  boolean_type_node = integer_type_node;
249718334Speter  boolean_true_node = integer_one_node;
249818334Speter  boolean_false_node = integer_zero_node;
249918334Speter
250096263Sobrien  c_bool_type_node = make_unsigned_type (BOOL_TYPE_SIZE);
250190075Sobrien  TREE_SET_CODE (c_bool_type_node, BOOLEAN_TYPE);
250290075Sobrien  TYPE_MAX_VALUE (c_bool_type_node) = build_int_2 (1, 0);
250390075Sobrien  TREE_TYPE (TYPE_MAX_VALUE (c_bool_type_node)) = c_bool_type_node;
250490075Sobrien  TYPE_PRECISION (c_bool_type_node) = 1;
250590075Sobrien  pushdecl (build_decl (TYPE_DECL, get_identifier ("_Bool"),
250690075Sobrien			c_bool_type_node));
250790075Sobrien  c_bool_false_node = build_int_2 (0, 0);
250890075Sobrien  TREE_TYPE (c_bool_false_node) = c_bool_type_node;
250990075Sobrien  c_bool_true_node = build_int_2 (1, 0);
251090075Sobrien  TREE_TYPE (c_bool_true_node) = c_bool_type_node;
251118334Speter
251290075Sobrien  endlink = void_list_node;
251350397Sobrien  ptr_ftype_void = build_function_type (ptr_type_node, endlink);
251450397Sobrien  ptr_ftype_ptr
251550397Sobrien    = build_function_type (ptr_type_node,
251650397Sobrien			   tree_cons (NULL_TREE, ptr_type_node, endlink));
251750397Sobrien
251890075Sobrien  pedantic_lvalues = pedantic;
251918334Speter
252090075Sobrien  make_fname_decl = c_make_fname_decl;
252190075Sobrien  start_fname_decls ();
252290075Sobrien}
252318334Speter
252490075Sobrien/* Create the VAR_DECL for __FUNCTION__ etc. ID is the name to give the
252590075Sobrien   decl, NAME is the initialization string and TYPE_DEP indicates whether
252690075Sobrien   NAME depended on the type of the function.  As we don't yet implement
252790075Sobrien   delayed emission of static data, we mark the decl as emitted
252890075Sobrien   so it is not placed in the output.  Anything using it must therefore pull
252990075Sobrien   out the STRING_CST initializer directly.  This does mean that these names
253090075Sobrien   are string merging candidates, which is wrong for C99's __func__.  FIXME.  */
253118334Speter
253290075Sobrienstatic tree
253390075Sobrienc_make_fname_decl (id, type_dep)
253490075Sobrien     tree id;
253590075Sobrien     int type_dep;
253690075Sobrien{
253790075Sobrien  const char *name = fname_as_string (type_dep);
253890075Sobrien  tree decl, type, init;
253990075Sobrien  size_t length = strlen (name);
254018334Speter
254190075Sobrien  type =  build_array_type
254290075Sobrien          (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
254390075Sobrien	   build_index_type (size_int (length)));
254418334Speter
254590075Sobrien  decl = build_decl (VAR_DECL, id, type);
254690075Sobrien  /* We don't push the decl, so have to set its context here.  */
254790075Sobrien  DECL_CONTEXT (decl) = current_function_decl;
254890075Sobrien
254990075Sobrien  TREE_STATIC (decl) = 1;
255090075Sobrien  TREE_READONLY (decl) = 1;
255190075Sobrien  DECL_ARTIFICIAL (decl) = 1;
255290075Sobrien
255390075Sobrien  init = build_string (length + 1, name);
255490075Sobrien  TREE_TYPE (init) = type;
255590075Sobrien  DECL_INITIAL (decl) = init;
255618334Speter
255790075Sobrien  TREE_USED (decl) = 1;
255890075Sobrien
255990075Sobrien  finish_decl (decl, init, NULL_TREE);
256018334Speter
256190075Sobrien  return decl;
256218334Speter}
256318334Speter
256418334Speter/* Return a definition for a builtin function named NAME and whose data type
256518334Speter   is TYPE.  TYPE should be a function type with argument types.
256618334Speter   FUNCTION_CODE tells later passes how to compile calls to this function.
256718334Speter   See tree.h for its possible values.
256818334Speter
256918334Speter   If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
2570117421Skan   the name to be called if we can't opencode the function.  If
2571117421Skan   ATTRS is nonzero, use that for the function's attribute list.  */
257218334Speter
257318334Spetertree
2574117421Skanbuiltin_function (name, type, function_code, class, library_name, attrs)
257552284Sobrien     const char *name;
257618334Speter     tree type;
257790075Sobrien     int function_code;
257890075Sobrien     enum built_in_class class;
257952284Sobrien     const char *library_name;
2580117421Skan     tree attrs;
258118334Speter{
258218334Speter  tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
258318334Speter  DECL_EXTERNAL (decl) = 1;
258418334Speter  TREE_PUBLIC (decl) = 1;
258518334Speter  if (library_name)
258690075Sobrien    SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
258790075Sobrien  make_decl_rtl (decl, NULL);
258818334Speter  pushdecl (decl);
258990075Sobrien  DECL_BUILT_IN_CLASS (decl) = class;
259090075Sobrien  DECL_FUNCTION_CODE (decl) = function_code;
259190075Sobrien
259218334Speter  /* Warn if a function in the namespace for users
259318334Speter     is used without an occasion to consider it declared.  */
259418334Speter  if (name[0] != '_' || name[1] != '_')
259518334Speter    C_DECL_ANTICIPATED (decl) = 1;
259618334Speter
259790075Sobrien  /* Possibly apply some default attributes to this built-in function.  */
2598117421Skan  if (attrs)
2599117421Skan    decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
2600117421Skan  else
2601117421Skan    decl_attributes (&decl, NULL_TREE, 0);
260290075Sobrien
260318334Speter  return decl;
260418334Speter}
260590075Sobrien
260690075Sobrien/* Apply default attributes to a function, if a system function with default
260790075Sobrien   attributes.  */
260890075Sobrien
260990075Sobrienvoid
2610117421Skanc_insert_default_attributes (decl)
261190075Sobrien     tree decl;
261290075Sobrien{
261390075Sobrien  if (!TREE_PUBLIC (decl))
261490075Sobrien    return;
261590075Sobrien  c_common_insert_default_attributes (decl);
261690075Sobrien}
261718334Speter
261818334Speter/* Called when a declaration is seen that contains no names to declare.
261918334Speter   If its type is a reference to a structure, union or enum inherited
262018334Speter   from a containing scope, shadow that tag name for the current scope
262118334Speter   with a forward reference.
262218334Speter   If its type defines a new named structure or union
262318334Speter   or defines an enum, it is valid but we need not do anything here.
262418334Speter   Otherwise, it is an error.  */
262518334Speter
262618334Spetervoid
262718334Spetershadow_tag (declspecs)
262818334Speter     tree declspecs;
262918334Speter{
263018334Speter  shadow_tag_warned (declspecs, 0);
263118334Speter}
263218334Speter
263318334Spetervoid
263418334Spetershadow_tag_warned (declspecs, warned)
263518334Speter     tree declspecs;
263618334Speter     int warned;
263718334Speter     /* 1 => we have done a pedwarn.  2 => we have done a warning, but
263818334Speter	no pedwarn.  */
263918334Speter{
264018334Speter  int found_tag = 0;
264190075Sobrien  tree link;
264250397Sobrien  tree specs, attrs;
264318334Speter
264418334Speter  pending_invalid_xref = 0;
264518334Speter
264650397Sobrien  /* Remove the attributes from declspecs, since they will confuse the
264750397Sobrien     following code.  */
264850397Sobrien  split_specs_attrs (declspecs, &specs, &attrs);
264950397Sobrien
265050397Sobrien  for (link = specs; link; link = TREE_CHAIN (link))
265118334Speter    {
265290075Sobrien      tree value = TREE_VALUE (link);
265390075Sobrien      enum tree_code code = TREE_CODE (value);
265418334Speter
265518334Speter      if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
265618334Speter	/* Used to test also that TYPE_SIZE (value) != 0.
265718334Speter	   That caused warning for `struct foo;' at top level in the file.  */
265818334Speter	{
265990075Sobrien	  tree name = lookup_tag_reverse (value);
266090075Sobrien	  tree t;
266118334Speter
266218334Speter	  found_tag++;
266318334Speter
266418334Speter	  if (name == 0)
266518334Speter	    {
266618334Speter	      if (warned != 1 && code != ENUMERAL_TYPE)
266718334Speter		/* Empty unnamed enum OK */
266818334Speter		{
266918334Speter		  pedwarn ("unnamed struct/union that defines no instances");
267018334Speter		  warned = 1;
267118334Speter		}
267218334Speter	    }
267318334Speter	  else
267418334Speter	    {
267518334Speter	      t = lookup_tag (code, name, current_binding_level, 1);
267618334Speter
267718334Speter	      if (t == 0)
267818334Speter		{
267918334Speter		  t = make_node (code);
268018334Speter		  pushtag (name, t);
268118334Speter		}
268218334Speter	    }
268318334Speter	}
268418334Speter      else
268518334Speter	{
268618334Speter	  if (!warned && ! in_system_header)
268718334Speter	    {
268818334Speter	      warning ("useless keyword or type name in empty declaration");
268918334Speter	      warned = 2;
269018334Speter	    }
269118334Speter	}
269218334Speter    }
269318334Speter
269418334Speter  if (found_tag > 1)
269518334Speter    error ("two types specified in one empty declaration");
269618334Speter
269718334Speter  if (warned != 1)
269818334Speter    {
269918334Speter      if (found_tag == 0)
270018334Speter	pedwarn ("empty declaration");
270118334Speter    }
270218334Speter}
270318334Speter
270490075Sobrien/* Construct an array declarator.  EXPR is the expression inside [], or
270590075Sobrien   NULL_TREE.  QUALS are the type qualifiers inside the [] (to be applied
270690075Sobrien   to the pointer to which a parameter array is converted).  STATIC_P is
2707117421Skan   nonzero if "static" is inside the [], zero otherwise.  VLA_UNSPEC_P
2708117421Skan   is nonzero is the array is [*], a VLA of unspecified length which is
270990075Sobrien   nevertheless a complete type (not currently implemented by GCC),
271090075Sobrien   zero otherwise.  The declarator is constructed as an ARRAY_REF
271190075Sobrien   (to be decoded by grokdeclarator), whose operand 0 is what's on the
271290075Sobrien   left of the [] (filled by in set_array_declarator_type) and operand 1
271390075Sobrien   is the expression inside; whose TREE_TYPE is the type qualifiers and
271490075Sobrien   which has TREE_STATIC set if "static" is used.  */
271590075Sobrien
271690075Sobrientree
271790075Sobrienbuild_array_declarator (expr, quals, static_p, vla_unspec_p)
271890075Sobrien     tree expr;
271990075Sobrien     tree quals;
272090075Sobrien     int static_p;
272190075Sobrien     int vla_unspec_p;
272290075Sobrien{
272390075Sobrien  tree decl;
272490075Sobrien  decl = build_nt (ARRAY_REF, NULL_TREE, expr);
272590075Sobrien  TREE_TYPE (decl) = quals;
272690075Sobrien  TREE_STATIC (decl) = (static_p ? 1 : 0);
272790075Sobrien  if (pedantic && !flag_isoc99)
272890075Sobrien    {
272990075Sobrien      if (static_p || quals != NULL_TREE)
2730117421Skan	pedwarn ("ISO C90 does not support `static' or type qualifiers in parameter array declarators");
273190075Sobrien      if (vla_unspec_p)
2732117421Skan	pedwarn ("ISO C90 does not support `[*]' array declarators");
273390075Sobrien    }
273490075Sobrien  if (vla_unspec_p)
273590075Sobrien    warning ("GCC does not yet properly implement `[*]' array declarators");
273690075Sobrien  return decl;
273790075Sobrien}
273890075Sobrien
273990075Sobrien/* Set the type of an array declarator.  DECL is the declarator, as
274090075Sobrien   constructed by build_array_declarator; TYPE is what appears on the left
2741117421Skan   of the [] and goes in operand 0.  ABSTRACT_P is nonzero if it is an
274290075Sobrien   abstract declarator, zero otherwise; this is used to reject static and
274390075Sobrien   type qualifiers in abstract declarators, where they are not in the
274490075Sobrien   C99 grammar.  */
274590075Sobrien
274690075Sobrientree
274790075Sobrienset_array_declarator_type (decl, type, abstract_p)
274890075Sobrien     tree decl;
274990075Sobrien     tree type;
275090075Sobrien     int abstract_p;
275190075Sobrien{
275290075Sobrien  TREE_OPERAND (decl, 0) = type;
275390075Sobrien  if (abstract_p && (TREE_TYPE (decl) != NULL_TREE || TREE_STATIC (decl)))
275490075Sobrien    error ("static or type qualifiers in abstract declarator");
275590075Sobrien  return decl;
275690075Sobrien}
275790075Sobrien
275818334Speter/* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
275918334Speter
276018334Spetertree
276118334Spetergroktypename (typename)
276218334Speter     tree typename;
276318334Speter{
276490075Sobrien  tree specs, attrs;
276590075Sobrien
276618334Speter  if (TREE_CODE (typename) != TREE_LIST)
276718334Speter    return typename;
276890075Sobrien
276990075Sobrien  split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs);
277090075Sobrien
277196263Sobrien  typename = grokdeclarator (TREE_VALUE (typename), specs, TYPENAME, 0);
277290075Sobrien
277390075Sobrien  /* Apply attributes.  */
277490075Sobrien  decl_attributes (&typename, attrs, 0);
277590075Sobrien
277690075Sobrien  return typename;
277718334Speter}
277818334Speter
277918334Speter/* Return a PARM_DECL node for a given pair of specs and declarator.  */
278018334Speter
278118334Spetertree
278218334Spetergroktypename_in_parm_context (typename)
278318334Speter     tree typename;
278418334Speter{
278518334Speter  if (TREE_CODE (typename) != TREE_LIST)
278618334Speter    return typename;
278718334Speter  return grokdeclarator (TREE_VALUE (typename),
278818334Speter			 TREE_PURPOSE (typename),
278996263Sobrien			 PARM, 0);
279018334Speter}
279118334Speter
279218334Speter/* Decode a declarator in an ordinary declaration or data definition.
279318334Speter   This is called as soon as the type information and variable name
279418334Speter   have been parsed, before parsing the initializer if any.
279518334Speter   Here we create the ..._DECL node, fill in its type,
279618334Speter   and put it on the list of decls for the current context.
279718334Speter   The ..._DECL node is returned as the value.
279818334Speter
279918334Speter   Exception: for arrays where the length is not specified,
280018334Speter   the type is left null, to be filled in by `finish_decl'.
280118334Speter
280218334Speter   Function definitions do not come here; they go to start_function
280318334Speter   instead.  However, external and forward declarations of functions
280418334Speter   do go through here.  Structure field declarations are done by
280518334Speter   grokfield and not through here.  */
280618334Speter
280718334Spetertree
280890075Sobrienstart_decl (declarator, declspecs, initialized, attributes)
280918334Speter     tree declarator, declspecs;
281018334Speter     int initialized;
281190075Sobrien     tree attributes;
281218334Speter{
281390075Sobrien  tree decl;
281490075Sobrien  tree tem;
281590075Sobrien
281690075Sobrien  /* An object declared as __attribute__((deprecated)) suppresses
281790075Sobrien     warnings of uses of other deprecated items.  */
281890075Sobrien  if (lookup_attribute ("deprecated", attributes))
281990075Sobrien    deprecated_state = DEPRECATED_SUPPRESS;
282018334Speter
282190075Sobrien  decl = grokdeclarator (declarator, declspecs,
282296263Sobrien			 NORMAL, initialized);
282390075Sobrien
282490075Sobrien  deprecated_state = DEPRECATED_NORMAL;
282518334Speter
282690075Sobrien  if (warn_main > 0 && TREE_CODE (decl) != FUNCTION_DECL
282790075Sobrien      && MAIN_NAME_P (DECL_NAME (decl)))
282850397Sobrien    warning_with_decl (decl, "`%s' is usually a function");
282950397Sobrien
283018334Speter  if (initialized)
283118334Speter    /* Is it valid for this decl to have an initializer at all?
283218334Speter       If not, set INITIALIZED to zero, which will indirectly
283318334Speter       tell `finish_decl' to ignore the initializer once it is parsed.  */
283418334Speter    switch (TREE_CODE (decl))
283518334Speter      {
283618334Speter      case TYPE_DECL:
2837107593Sobrien	error ("typedef `%s' is initialized (use __typeof__ instead)",
2838104761Skan	       IDENTIFIER_POINTER (DECL_NAME (decl)));
2839104761Skan	initialized = 0;
284018334Speter	break;
284118334Speter
284218334Speter      case FUNCTION_DECL:
284318334Speter	error ("function `%s' is initialized like a variable",
284418334Speter	       IDENTIFIER_POINTER (DECL_NAME (decl)));
284518334Speter	initialized = 0;
284618334Speter	break;
284718334Speter
284818334Speter      case PARM_DECL:
284918334Speter	/* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE.  */
285018334Speter	error ("parameter `%s' is initialized",
285118334Speter	       IDENTIFIER_POINTER (DECL_NAME (decl)));
285218334Speter	initialized = 0;
285318334Speter	break;
285418334Speter
285518334Speter      default:
285618334Speter	/* Don't allow initializations for incomplete types
285718334Speter	   except for arrays which might be completed by the initialization.  */
285890075Sobrien
285990075Sobrien	/* This can happen if the array size is an undefined macro.  We already
286090075Sobrien	   gave a warning, so we don't need another one.  */
286190075Sobrien	if (TREE_TYPE (decl) == error_mark_node)
286290075Sobrien	  initialized = 0;
286390075Sobrien	else if (COMPLETE_TYPE_P (TREE_TYPE (decl)))
286418334Speter	  {
286518334Speter	    /* A complete type is ok if size is fixed.  */
286618334Speter
286718334Speter	    if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST
286818334Speter		|| C_DECL_VARIABLE_SIZE (decl))
286918334Speter	      {
287018334Speter		error ("variable-sized object may not be initialized");
287118334Speter		initialized = 0;
287218334Speter	      }
287318334Speter	  }
287418334Speter	else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE)
287518334Speter	  {
287618334Speter	    error ("variable `%s' has initializer but incomplete type",
287718334Speter		   IDENTIFIER_POINTER (DECL_NAME (decl)));
287818334Speter	    initialized = 0;
287918334Speter	  }
288090075Sobrien	else if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
288118334Speter	  {
288218334Speter	    error ("elements of array `%s' have incomplete type",
288318334Speter		   IDENTIFIER_POINTER (DECL_NAME (decl)));
288418334Speter	    initialized = 0;
288518334Speter	  }
288618334Speter      }
288718334Speter
288818334Speter  if (initialized)
288918334Speter    {
289090075Sobrien#if 0
289190075Sobrien      /* Seems redundant with grokdeclarator.  */
289218334Speter      if (current_binding_level != global_binding_level
289318334Speter	  && DECL_EXTERNAL (decl)
289418334Speter	  && TREE_CODE (decl) != FUNCTION_DECL)
289518334Speter	warning ("declaration of `%s' has `extern' and is initialized",
289618334Speter		 IDENTIFIER_POINTER (DECL_NAME (decl)));
289718334Speter#endif
289818334Speter      DECL_EXTERNAL (decl) = 0;
289918334Speter      if (current_binding_level == global_binding_level)
290018334Speter	TREE_STATIC (decl) = 1;
290118334Speter
290218334Speter      /* Tell `pushdecl' this is an initialized decl
290318334Speter	 even though we don't yet have the initializer expression.
290418334Speter	 Also tell `finish_decl' it may store the real initializer.  */
290518334Speter      DECL_INITIAL (decl) = error_mark_node;
290618334Speter    }
290718334Speter
290818334Speter  /* If this is a function declaration, write a record describing it to the
290918334Speter     prototypes file (if requested).  */
291018334Speter
291118334Speter  if (TREE_CODE (decl) == FUNCTION_DECL)
291218334Speter    gen_aux_info_record (decl, 0, 0, TYPE_ARG_TYPES (TREE_TYPE (decl)) != 0);
291318334Speter
291450397Sobrien  /* ANSI specifies that a tentative definition which is not merged with
291550397Sobrien     a non-tentative definition behaves exactly like a definition with an
291650397Sobrien     initializer equal to zero.  (Section 3.7.2)
2917117421Skan
2918117421Skan     -fno-common gives strict ANSI behavior, though this tends to break
2919117421Skan     a large body of code that grew up without this rule.
2920117421Skan
2921117421Skan     Thread-local variables are never common, since there's no entrenched
2922117421Skan     body of code to break, and it allows more efficient variable references
2923117421Skan     in the presense of dynamic linking.  */
2924117421Skan
2925117421Skan  if (TREE_CODE (decl) == VAR_DECL
2926117421Skan      && !initialized
2927117421Skan      && TREE_PUBLIC (decl)
2928117421Skan      && !DECL_THREAD_LOCAL (decl)
2929117421Skan      && !flag_no_common)
293050397Sobrien    DECL_COMMON (decl) = 1;
293118334Speter
293218334Speter  /* Set attributes here so if duplicate decl, will have proper attributes.  */
293390075Sobrien  decl_attributes (&decl, attributes, 0);
293418334Speter
293596263Sobrien  /* If #pragma weak was used, mark the decl weak now.  */
293696263Sobrien  if (current_binding_level == global_binding_level)
293796263Sobrien    maybe_apply_pragma_weak (decl);
293896263Sobrien
293990075Sobrien  if (TREE_CODE (decl) == FUNCTION_DECL
294090075Sobrien      && DECL_DECLARED_INLINE_P (decl)
294190075Sobrien      && DECL_UNINLINABLE (decl)
294290075Sobrien      && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl)))
294390075Sobrien    warning_with_decl (decl,
294490075Sobrien		       "inline function `%s' given attribute noinline");
294590075Sobrien
294618334Speter  /* Add this decl to the current binding level.
294718334Speter     TEM may equal DECL or it may be a previous decl of the same name.  */
294818334Speter  tem = pushdecl (decl);
294918334Speter
295018334Speter  /* For a local variable, define the RTL now.  */
295118334Speter  if (current_binding_level != global_binding_level
295218334Speter      /* But not if this is a duplicate decl
295318334Speter	 and we preserved the rtl from the previous one
295418334Speter	 (which may or may not happen).  */
295590075Sobrien      && !DECL_RTL_SET_P (tem)
295690075Sobrien      && !DECL_CONTEXT (tem))
295718334Speter    {
295890075Sobrien      if (TREE_TYPE (tem) != error_mark_node
295990075Sobrien	  && COMPLETE_TYPE_P (TREE_TYPE (tem)))
296018334Speter	expand_decl (tem);
296118334Speter      else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
296218334Speter	       && DECL_INITIAL (tem) != 0)
296318334Speter	expand_decl (tem);
296418334Speter    }
296518334Speter
296618334Speter  return tem;
296718334Speter}
296818334Speter
296918334Speter/* Finish processing of a declaration;
297018334Speter   install its initial value.
297118334Speter   If the length of an array type is not known before,
297218334Speter   it must be determined now, from the initial value, or it is an error.  */
297318334Speter
297418334Spetervoid
297518334Speterfinish_decl (decl, init, asmspec_tree)
297618334Speter     tree decl, init;
297718334Speter     tree asmspec_tree;
297818334Speter{
297990075Sobrien  tree type = TREE_TYPE (decl);
298018334Speter  int was_incomplete = (DECL_SIZE (decl) == 0);
298190075Sobrien  const char *asmspec = 0;
298218334Speter
298390075Sobrien  /* If a name was specified, get the string.  */
298496263Sobrien  if (current_binding_level == global_binding_level)
298596263Sobrien    asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree);
298618334Speter  if (asmspec_tree)
298718334Speter    asmspec = TREE_STRING_POINTER (asmspec_tree);
298818334Speter
298918334Speter  /* If `start_decl' didn't like having an initialization, ignore it now.  */
299018334Speter  if (init != 0 && DECL_INITIAL (decl) == 0)
299118334Speter    init = 0;
299290075Sobrien
299318334Speter  /* Don't crash if parm is initialized.  */
299418334Speter  if (TREE_CODE (decl) == PARM_DECL)
299518334Speter    init = 0;
299618334Speter
299718334Speter  if (init)
2998104761Skan    store_init_value (decl, init);
299918334Speter
300018334Speter  /* Deduce size of array from initialization, if not already known */
300118334Speter  if (TREE_CODE (type) == ARRAY_TYPE
300218334Speter      && TYPE_DOMAIN (type) == 0
300318334Speter      && TREE_CODE (decl) != TYPE_DECL)
300418334Speter    {
300518334Speter      int do_default
300618334Speter	= (TREE_STATIC (decl)
300718334Speter	   /* Even if pedantic, an external linkage array
300818334Speter	      may have incomplete type at first.  */
300918334Speter	   ? pedantic && !TREE_PUBLIC (decl)
301018334Speter	   : !DECL_EXTERNAL (decl));
301118334Speter      int failure
301218334Speter	= complete_array_type (type, DECL_INITIAL (decl), do_default);
301318334Speter
301418334Speter      /* Get the completed type made by complete_array_type.  */
301518334Speter      type = TREE_TYPE (decl);
301618334Speter
301718334Speter      if (failure == 1)
301818334Speter	error_with_decl (decl, "initializer fails to determine size of `%s'");
301918334Speter
302090075Sobrien      else if (failure == 2)
302118334Speter	{
302218334Speter	  if (do_default)
302318334Speter	    error_with_decl (decl, "array size missing in `%s'");
302418334Speter	  /* If a `static' var's size isn't known,
302518334Speter	     make it extern as well as static, so it does not get
302618334Speter	     allocated.
302718334Speter	     If it is not `static', then do not mark extern;
302818334Speter	     finish_incomplete_decl will give it a default size
302918334Speter	     and it will get allocated.  */
303018334Speter	  else if (!pedantic && TREE_STATIC (decl) && ! TREE_PUBLIC (decl))
303118334Speter	    DECL_EXTERNAL (decl) = 1;
303218334Speter	}
303318334Speter
303418334Speter      /* TYPE_MAX_VALUE is always one less than the number of elements
303518334Speter	 in the array, because we start counting at zero.  Therefore,
303618334Speter	 warn only if the value is less than zero.  */
303790075Sobrien      else if (pedantic && TYPE_DOMAIN (type) != 0
303890075Sobrien	      && tree_int_cst_sgn (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) < 0)
303918334Speter	error_with_decl (decl, "zero or negative size array `%s'");
304018334Speter
304118334Speter      layout_decl (decl, 0);
304218334Speter    }
304318334Speter
304418334Speter  if (TREE_CODE (decl) == VAR_DECL)
304518334Speter    {
304690075Sobrien      if (DECL_SIZE (decl) == 0 && TREE_TYPE (decl) != error_mark_node
304790075Sobrien	  && COMPLETE_TYPE_P (TREE_TYPE (decl)))
304818334Speter	layout_decl (decl, 0);
304918334Speter
305018334Speter      if (DECL_SIZE (decl) == 0
305190075Sobrien	  /* Don't give an error if we already gave one earlier.  */
305290075Sobrien	  && TREE_TYPE (decl) != error_mark_node
305318334Speter	  && (TREE_STATIC (decl)
305418334Speter	      ?
305518334Speter		/* A static variable with an incomplete type
305618334Speter		   is an error if it is initialized.
305718334Speter		   Also if it is not file scope.
305818334Speter		   Otherwise, let it through, but if it is not `extern'
305918334Speter		   then it may cause an error message later.  */
306050397Sobrien		(DECL_INITIAL (decl) != 0
306190075Sobrien		 || DECL_CONTEXT (decl) != 0)
306218334Speter	      :
306318334Speter		/* An automatic variable with an incomplete type
306418334Speter		   is an error.  */
306518334Speter		!DECL_EXTERNAL (decl)))
306618334Speter	{
306718334Speter	  error_with_decl (decl, "storage size of `%s' isn't known");
306818334Speter	  TREE_TYPE (decl) = error_mark_node;
306918334Speter	}
307018334Speter
307118334Speter      if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
307218334Speter	  && DECL_SIZE (decl) != 0)
307318334Speter	{
307418334Speter	  if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
307518334Speter	    constant_expression_warning (DECL_SIZE (decl));
307618334Speter	  else
307718334Speter	    error_with_decl (decl, "storage size of `%s' isn't constant");
307818334Speter	}
307950397Sobrien
308090075Sobrien      if (TREE_USED (type))
308150397Sobrien	TREE_USED (decl) = 1;
308218334Speter    }
308318334Speter
308418334Speter  /* If this is a function and an assembler name is specified, it isn't
308518334Speter     builtin any more.  Also reset DECL_RTL so we can give it its new
308618334Speter     name.  */
308718334Speter  if (TREE_CODE (decl) == FUNCTION_DECL && asmspec)
308890075Sobrien    {
308990075Sobrien      DECL_BUILT_IN_CLASS (decl) = NOT_BUILT_IN;
309090075Sobrien      SET_DECL_RTL (decl, NULL_RTX);
309190075Sobrien      SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
309290075Sobrien    }
309318334Speter
309418334Speter  /* Output the assembler code and/or RTL code for variables and functions,
309518334Speter     unless the type is an undefined structure or union.
309618334Speter     If not, it will get done when the type is completed.  */
309718334Speter
309818334Speter  if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
309918334Speter    {
3100117421Skan      /* This is a no-op in c-lang.c or something real in objc-act.c.  */
3101117421Skan      if (flag_objc)
3102117421Skan	objc_check_decl (decl);
310390075Sobrien
310490075Sobrien      if (!DECL_CONTEXT (decl))
310518334Speter	{
310690075Sobrien	  if (DECL_INITIAL (decl) == NULL_TREE
310790075Sobrien	      || DECL_INITIAL (decl) == error_mark_node)
310890075Sobrien	    /* Don't output anything
310990075Sobrien	       when a tentative file-scope definition is seen.
311090075Sobrien	       But at end of compilation, do output code for them.  */
311190075Sobrien	    DECL_DEFER_OUTPUT (decl) = 1;
311250397Sobrien	  rest_of_decl_compilation (decl, asmspec,
311350397Sobrien				    (DECL_CONTEXT (decl) == 0
311490075Sobrien				     || TREE_ASM_WRITTEN (decl)), 0);
311518334Speter	}
311618334Speter      else
311718334Speter	{
311890075Sobrien	  /* This is a local variable.  If there is an ASMSPEC, the
311990075Sobrien	     user has requested that we handle it specially.  */
312090075Sobrien	  if (asmspec)
312190075Sobrien	    {
312290075Sobrien	      /* In conjunction with an ASMSPEC, the `register'
312390075Sobrien		 keyword indicates that we should place the variable
312490075Sobrien		 in a particular register.  */
312590075Sobrien	      if (DECL_REGISTER (decl))
312690075Sobrien		DECL_C_HARD_REGISTER (decl) = 1;
312790075Sobrien
312890075Sobrien	      /* If this is not a static variable, issue a warning.
312990075Sobrien		 It doesn't make any sense to give an ASMSPEC for an
313090075Sobrien		 ordinary, non-register local variable.  Historically,
313190075Sobrien		 GCC has accepted -- but ignored -- the ASMSPEC in
313290075Sobrien		 this case.  */
313390075Sobrien	      if (TREE_CODE (decl) == VAR_DECL
313490075Sobrien		  && !DECL_REGISTER (decl)
313590075Sobrien		  && !TREE_STATIC (decl))
313690075Sobrien		warning_with_decl (decl,
313790075Sobrien				   "ignoring asm-specifier for non-static local variable `%s'");
313890075Sobrien	      else
313990075Sobrien		SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
314090075Sobrien	    }
314190075Sobrien
314290075Sobrien	  if (TREE_CODE (decl) != FUNCTION_DECL)
314390075Sobrien	    add_decl_stmt (decl);
314418334Speter	}
314590075Sobrien
314618334Speter      if (DECL_CONTEXT (decl) != 0)
314718334Speter	{
314818334Speter	  /* Recompute the RTL of a local array now
314918334Speter	     if it used to be an incomplete type.  */
315018334Speter	  if (was_incomplete
315118334Speter	      && ! TREE_STATIC (decl) && ! DECL_EXTERNAL (decl))
315218334Speter	    {
315318334Speter	      /* If we used it already as memory, it must stay in memory.  */
315418334Speter	      TREE_ADDRESSABLE (decl) = TREE_USED (decl);
315518334Speter	      /* If it's still incomplete now, no init will save it.  */
315618334Speter	      if (DECL_SIZE (decl) == 0)
315718334Speter		DECL_INITIAL (decl) = 0;
315818334Speter	    }
315918334Speter	}
316018334Speter    }
316118334Speter
316218334Speter  if (TREE_CODE (decl) == TYPE_DECL)
316318334Speter    {
3164117421Skan      /* This is a no-op in c-lang.c or something real in objc-act.c.  */
3165117421Skan      if (flag_objc)
3166117421Skan	objc_check_decl (decl);
316790075Sobrien      rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == 0, 0);
316818334Speter    }
316918334Speter
317018334Speter  /* At the end of a declaration, throw away any variable type sizes
317118334Speter     of types defined inside that declaration.  There is no use
317218334Speter     computing them in the following function definition.  */
317318334Speter  if (current_binding_level == global_binding_level)
317418334Speter    get_pending_sizes ();
317518334Speter
3176117421Skan  /* Install a cleanup (aka destructor) if one was given.  */
3177117421Skan  if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl))
3178117421Skan    {
3179117421Skan      tree attr = lookup_attribute ("cleanup", DECL_ATTRIBUTES (decl));
3180117421Skan      if (attr)
3181117421Skan	{
3182117421Skan	  static bool eh_initialized_p;
318318334Speter
3184117421Skan	  tree cleanup_id = TREE_VALUE (TREE_VALUE (attr));
3185117421Skan	  tree cleanup_decl = lookup_name (cleanup_id);
3186117421Skan	  tree cleanup;
3187117421Skan
3188117421Skan	  /* Build "cleanup(&decl)" for the destructor.  */
3189117421Skan	  cleanup = build_unary_op (ADDR_EXPR, decl, 0);
3190117421Skan	  cleanup = build_tree_list (NULL_TREE, cleanup);
3191117421Skan	  cleanup = build_function_call (cleanup_decl, cleanup);
3192117421Skan
3193117421Skan	  /* Don't warn about decl unused; the cleanup uses it.  */
3194117421Skan	  TREE_USED (decl) = 1;
3195117421Skan
3196117421Skan	  /* Initialize EH, if we've been told to do so.  */
3197117421Skan	  if (flag_exceptions && !eh_initialized_p)
3198117421Skan	    {
3199117421Skan	      eh_initialized_p = true;
3200117421Skan	      eh_personality_libfunc
3201117421Skan		= init_one_libfunc (USING_SJLJ_EXCEPTIONS
3202117421Skan				    ? "__gcc_personality_sj0"
3203117421Skan				    : "__gcc_personality_v0");
3204117421Skan	      using_eh_for_cleanups ();
3205117421Skan	    }
3206117421Skan
3207117421Skan	  add_stmt (build_stmt (CLEANUP_STMT, decl, cleanup));
3208117421Skan	}
3209117421Skan    }
321018334Speter}
321118334Speter
321218334Speter/* Given a parsed parameter declaration,
321318334Speter   decode it into a PARM_DECL and push that on the current binding level.
321418334Speter   Also, for the sake of forward parm decls,
321518334Speter   record the given order of parms in `parm_order'.  */
321618334Speter
321718334Spetervoid
321818334Speterpush_parm_decl (parm)
321918334Speter     tree parm;
322018334Speter{
322118334Speter  tree decl;
322218334Speter  int old_immediate_size_expand = immediate_size_expand;
322318334Speter  /* Don't try computing parm sizes now -- wait till fn is called.  */
322418334Speter  immediate_size_expand = 0;
322518334Speter
322618334Speter  decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)),
322796263Sobrien			 TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0);
322890075Sobrien  decl_attributes (&decl, TREE_VALUE (parm), 0);
322918334Speter
323018334Speter#if 0
323118334Speter  if (DECL_NAME (decl))
323218334Speter    {
323318334Speter      tree olddecl;
323418334Speter      olddecl = lookup_name (DECL_NAME (decl));
323518334Speter      if (pedantic && olddecl != 0 && TREE_CODE (olddecl) == TYPE_DECL)
323690075Sobrien	pedwarn_with_decl (decl,
323790075Sobrien			   "ISO C forbids parameter `%s' shadowing typedef");
323818334Speter    }
323918334Speter#endif
324018334Speter
324118334Speter  decl = pushdecl (decl);
324218334Speter
324318334Speter  immediate_size_expand = old_immediate_size_expand;
324418334Speter
324518334Speter  current_binding_level->parm_order
324618334Speter    = tree_cons (NULL_TREE, decl, current_binding_level->parm_order);
324718334Speter
324818334Speter  /* Add this decl to the current binding level.  */
324918334Speter  finish_decl (decl, NULL_TREE, NULL_TREE);
325018334Speter}
325118334Speter
325218334Speter/* Clear the given order of parms in `parm_order'.
325318334Speter   Used at start of parm list,
325418334Speter   and also at semicolon terminating forward decls.  */
325518334Speter
325618334Spetervoid
325718334Speterclear_parm_order ()
325818334Speter{
325918334Speter  current_binding_level->parm_order = NULL_TREE;
326018334Speter}
326118334Speter
326290075Sobrien/* Build a COMPOUND_LITERAL_EXPR.  TYPE is the type given in the compound
326390075Sobrien   literal, which may be an incomplete array type completed by the
326490075Sobrien   initializer; INIT is a CONSTRUCTOR that initializes the compound
326590075Sobrien   literal.  */
326690075Sobrien
326790075Sobrientree
326890075Sobrienbuild_compound_literal (type, init)
326990075Sobrien     tree type;
327090075Sobrien     tree init;
327190075Sobrien{
327290075Sobrien  /* We do not use start_decl here because we have a type, not a declarator;
327390075Sobrien     and do not use finish_decl because the decl should be stored inside
327490075Sobrien     the COMPOUND_LITERAL_EXPR rather than added elsewhere as a DECL_STMT.  */
327590075Sobrien  tree decl = build_decl (VAR_DECL, NULL_TREE, type);
327690075Sobrien  tree complit;
327790075Sobrien  tree stmt;
327890075Sobrien  DECL_EXTERNAL (decl) = 0;
327990075Sobrien  TREE_PUBLIC (decl) = 0;
328090075Sobrien  TREE_STATIC (decl) = (current_binding_level == global_binding_level);
328190075Sobrien  DECL_CONTEXT (decl) = current_function_decl;
328290075Sobrien  TREE_USED (decl) = 1;
328390075Sobrien  TREE_TYPE (decl) = type;
3284102790Skan  TREE_READONLY (decl) = TREE_READONLY (type);
328590075Sobrien  store_init_value (decl, init);
328690075Sobrien
328790075Sobrien  if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
328890075Sobrien    {
328990075Sobrien      int failure = complete_array_type (type, DECL_INITIAL (decl), 1);
329090075Sobrien      if (failure)
329190075Sobrien	abort ();
329290075Sobrien    }
329390075Sobrien
329490075Sobrien  type = TREE_TYPE (decl);
329590075Sobrien  if (type == error_mark_node || !COMPLETE_TYPE_P (type))
329690075Sobrien    return error_mark_node;
329790075Sobrien
329890075Sobrien  stmt = build_stmt (DECL_STMT, decl);
329990075Sobrien  complit = build1 (COMPOUND_LITERAL_EXPR, TREE_TYPE (decl), stmt);
330090075Sobrien  TREE_SIDE_EFFECTS (complit) = 1;
330190075Sobrien
330290075Sobrien  layout_decl (decl, 0);
330390075Sobrien
330490075Sobrien  if (TREE_STATIC (decl))
330590075Sobrien    {
330690075Sobrien      /* This decl needs a name for the assembler output.  We also need
3307102790Skan	 a unique suffix to be added to the name.  */
3308102790Skan      char *name;
3309102790Skan      extern int var_labelno;
3310102790Skan
3311102790Skan      ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal", var_labelno);
3312102790Skan      var_labelno++;
3313102790Skan      DECL_NAME (decl) = get_identifier (name);
3314102790Skan      DECL_DEFER_OUTPUT (decl) = 1;
3315102790Skan      DECL_COMDAT (decl) = 1;
3316102790Skan      DECL_ARTIFICIAL (decl) = 1;
3317102790Skan      pushdecl (decl);
331890075Sobrien      rest_of_decl_compilation (decl, NULL, 1, 0);
331990075Sobrien    }
332090075Sobrien
332190075Sobrien  return complit;
332290075Sobrien}
332390075Sobrien
332418334Speter/* Make TYPE a complete type based on INITIAL_VALUE.
332518334Speter   Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
332618334Speter   2 if there was no information (in which case assume 1 if DO_DEFAULT).  */
332718334Speter
332818334Speterint
332918334Spetercomplete_array_type (type, initial_value, do_default)
333018334Speter     tree type;
333118334Speter     tree initial_value;
333218334Speter     int do_default;
333318334Speter{
333490075Sobrien  tree maxindex = NULL_TREE;
333518334Speter  int value = 0;
333618334Speter
333718334Speter  if (initial_value)
333818334Speter    {
333918334Speter      /* Note MAXINDEX  is really the maximum index,
334018334Speter	 one less than the size.  */
334118334Speter      if (TREE_CODE (initial_value) == STRING_CST)
334218334Speter	{
334318334Speter	  int eltsize
334418334Speter	    = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
334518334Speter	  maxindex = build_int_2 ((TREE_STRING_LENGTH (initial_value)
334618334Speter				   / eltsize) - 1, 0);
334718334Speter	}
334818334Speter      else if (TREE_CODE (initial_value) == CONSTRUCTOR)
334918334Speter	{
335018334Speter	  tree elts = CONSTRUCTOR_ELTS (initial_value);
335190075Sobrien	  maxindex = build_int_2 (-1, -1);
335218334Speter	  for (; elts; elts = TREE_CHAIN (elts))
335318334Speter	    {
335418334Speter	      if (TREE_PURPOSE (elts))
335518334Speter		maxindex = TREE_PURPOSE (elts);
335618334Speter	      else
335790075Sobrien		maxindex = fold (build (PLUS_EXPR, integer_type_node,
335890075Sobrien					maxindex, integer_one_node));
335918334Speter	    }
336018334Speter	  maxindex = copy_node (maxindex);
336118334Speter	}
336218334Speter      else
336318334Speter	{
336418334Speter	  /* Make an error message unless that happened already.  */
336518334Speter	  if (initial_value != error_mark_node)
336618334Speter	    value = 1;
336718334Speter
336818334Speter	  /* Prevent further error messages.  */
336918334Speter	  maxindex = build_int_2 (0, 0);
337018334Speter	}
337118334Speter    }
337218334Speter
337318334Speter  if (!maxindex)
337418334Speter    {
337518334Speter      if (do_default)
337618334Speter	maxindex = build_int_2 (0, 0);
337718334Speter      value = 2;
337818334Speter    }
337918334Speter
338018334Speter  if (maxindex)
338118334Speter    {
338218334Speter      TYPE_DOMAIN (type) = build_index_type (maxindex);
338318334Speter      if (!TREE_TYPE (maxindex))
338418334Speter	TREE_TYPE (maxindex) = TYPE_DOMAIN (type);
338518334Speter    }
338618334Speter
338718334Speter  /* Lay out the type now that we can get the real answer.  */
338818334Speter
338918334Speter  layout_type (type);
339018334Speter
339118334Speter  return value;
339218334Speter}
339318334Speter
3394117421Skan/* Determine whether TYPE is a structure with a flexible array member,
3395117421Skan   or a union containing such a structure (possibly recursively).  */
3396117421Skan
3397117421Skanstatic bool
3398117421Skanflexible_array_type_p (type)
3399117421Skan     tree type;
3400117421Skan{
3401117421Skan  tree x;
3402117421Skan  switch (TREE_CODE (type))
3403117421Skan    {
3404117421Skan    case RECORD_TYPE:
3405117421Skan      x = TYPE_FIELDS (type);
3406117421Skan      if (x == NULL_TREE)
3407117421Skan	return false;
3408117421Skan      while (TREE_CHAIN (x) != NULL_TREE)
3409117421Skan	x = TREE_CHAIN (x);
3410117421Skan      if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
3411117421Skan	  && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
3412117421Skan	  && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
3413117421Skan	  && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
3414117421Skan	return true;
3415117421Skan      return false;
3416117421Skan    case UNION_TYPE:
3417117421Skan      for (x = TYPE_FIELDS (type); x != NULL_TREE; x = TREE_CHAIN (x))
3418117421Skan	{
3419117421Skan	  if (flexible_array_type_p (TREE_TYPE (x)))
3420117421Skan	    return true;
3421117421Skan	}
3422117421Skan      return false;
3423117421Skan    default:
3424117421Skan    return false;
3425117421Skan  }
3426117421Skan}
3427117421Skan
342818334Speter/* Given declspecs and a declarator,
342918334Speter   determine the name and type of the object declared
343018334Speter   and construct a ..._DECL node for it.
343118334Speter   (In one case we can return a ..._TYPE node instead.
343218334Speter    For invalid input we sometimes return 0.)
343318334Speter
343418334Speter   DECLSPECS is a chain of tree_list nodes whose value fields
343518334Speter    are the storage classes and type specifiers.
343618334Speter
343718334Speter   DECL_CONTEXT says which syntactic context this declaration is in:
343818334Speter     NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
343918334Speter     FUNCDEF for a function definition.  Like NORMAL but a few different
344018334Speter      error messages in each case.  Return value may be zero meaning
344118334Speter      this definition is too screwy to try to parse.
344218334Speter     PARM for a parameter declaration (either within a function prototype
344318334Speter      or before a function body).  Make a PARM_DECL, or return void_type_node.
344418334Speter     TYPENAME if for a typename (in a cast or sizeof).
344518334Speter      Don't make a DECL node; just return the ..._TYPE node.
344618334Speter     FIELD for a struct or union field; make a FIELD_DECL.
344796263Sobrien     BITFIELD for a field with specified width.
344818334Speter   INITIALIZED is 1 if the decl has an initializer.
344918334Speter
345018334Speter   In the TYPENAME case, DECLARATOR is really an absolute declarator.
345118334Speter   It may also be so in the PARM case, for a prototype where the
345218334Speter   argument type is specified but not the name.
345318334Speter
345418334Speter   This function is where the complicated C meanings of `static'
345518334Speter   and `extern' are interpreted.  */
345618334Speter
345718334Speterstatic tree
345896263Sobriengrokdeclarator (declarator, declspecs, decl_context, initialized)
345918334Speter     tree declspecs;
346018334Speter     tree declarator;
346118334Speter     enum decl_context decl_context;
346218334Speter     int initialized;
346318334Speter{
346418334Speter  int specbits = 0;
346518334Speter  tree spec;
346618334Speter  tree type = NULL_TREE;
346718334Speter  int longlong = 0;
346818334Speter  int constp;
346952284Sobrien  int restrictp;
347018334Speter  int volatilep;
347152284Sobrien  int type_quals = TYPE_UNQUALIFIED;
347218334Speter  int inlinep;
347318334Speter  int explicit_int = 0;
347418334Speter  int explicit_char = 0;
347518334Speter  int defaulted_int = 0;
347618334Speter  tree typedef_decl = 0;
347796263Sobrien  const char *name;
347818334Speter  tree typedef_type = 0;
347918334Speter  int funcdef_flag = 0;
348018334Speter  enum tree_code innermost_code = ERROR_MARK;
348196263Sobrien  int bitfield = 0;
348218334Speter  int size_varies = 0;
348390075Sobrien  tree decl_attr = NULL_TREE;
348490075Sobrien  tree array_ptr_quals = NULL_TREE;
348590075Sobrien  int array_parm_static = 0;
348690075Sobrien  tree returned_attrs = NULL_TREE;
348718334Speter
348896263Sobrien  if (decl_context == BITFIELD)
348996263Sobrien    bitfield = 1, decl_context = FIELD;
349096263Sobrien
349118334Speter  if (decl_context == FUNCDEF)
349218334Speter    funcdef_flag = 1, decl_context = NORMAL;
349318334Speter
349418334Speter  /* Look inside a declarator for the name being declared
349518334Speter     and get it as a string, for an error message.  */
349618334Speter  {
349790075Sobrien    tree decl = declarator;
349818334Speter    name = 0;
349918334Speter
350018334Speter    while (decl)
350118334Speter      switch (TREE_CODE (decl))
350218334Speter	{
350318334Speter	case ARRAY_REF:
350418334Speter	case INDIRECT_REF:
350518334Speter	case CALL_EXPR:
350618334Speter	  innermost_code = TREE_CODE (decl);
350718334Speter	  decl = TREE_OPERAND (decl, 0);
350818334Speter	  break;
350918334Speter
351090075Sobrien	case TREE_LIST:
351190075Sobrien	  decl = TREE_VALUE (decl);
351290075Sobrien	  break;
351390075Sobrien
351418334Speter	case IDENTIFIER_NODE:
351518334Speter	  name = IDENTIFIER_POINTER (decl);
351618334Speter	  decl = 0;
351718334Speter	  break;
351818334Speter
351918334Speter	default:
352018334Speter	  abort ();
352118334Speter	}
352218334Speter    if (name == 0)
352318334Speter      name = "type name";
352418334Speter  }
352518334Speter
352618334Speter  /* A function definition's declarator must have the form of
352718334Speter     a function declarator.  */
352818334Speter
352918334Speter  if (funcdef_flag && innermost_code != CALL_EXPR)
353018334Speter    return 0;
353118334Speter
353218334Speter  /* Anything declared one level down from the top level
353318334Speter     must be one of the parameters of a function
353418334Speter     (because the body is at least two levels down).  */
353518334Speter
353618334Speter  /* If this looks like a function definition, make it one,
353718334Speter     even if it occurs where parms are expected.
353818334Speter     Then store_parm_decls will reject it and not use it as a parm.  */
353918334Speter  if (decl_context == NORMAL && !funcdef_flag
354018334Speter      && current_binding_level->parm_flag)
354118334Speter    decl_context = PARM;
354218334Speter
354318334Speter  /* Look through the decl specs and record which ones appear.
354418334Speter     Some typespecs are defined as built-in typenames.
354518334Speter     Others, the ones that are modifiers of other types,
354618334Speter     are represented by bits in SPECBITS: set the bits for
354718334Speter     the modifiers that appear.  Storage class keywords are also in SPECBITS.
354818334Speter
354918334Speter     If there is a typedef name or a type, store the type in TYPE.
355018334Speter     This includes builtin typedefs such as `int'.
355118334Speter
355218334Speter     Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char'
355318334Speter     and did not come from a user typedef.
355418334Speter
355518334Speter     Set LONGLONG if `long' is mentioned twice.  */
355618334Speter
355718334Speter  for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
355818334Speter    {
355990075Sobrien      tree id = TREE_VALUE (spec);
356018334Speter
356190075Sobrien      /* If the entire declaration is itself tagged as deprecated then
356290075Sobrien         suppress reports of deprecated items.  */
356390075Sobrien      if (id && TREE_DEPRECATED (id))
356490075Sobrien        {
356590075Sobrien	  if (deprecated_state != DEPRECATED_SUPPRESS)
356690075Sobrien	    warn_deprecated_use (id);
356790075Sobrien        }
356890075Sobrien
356918334Speter      if (id == ridpointers[(int) RID_INT])
357018334Speter	explicit_int = 1;
357118334Speter      if (id == ridpointers[(int) RID_CHAR])
357218334Speter	explicit_char = 1;
357318334Speter
357490075Sobrien      if (TREE_CODE (id) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (id))
357590075Sobrien	{
357690075Sobrien	  enum rid i = C_RID_CODE (id);
357790075Sobrien	  if ((int) i <= (int) RID_LAST_MODIFIER)
357890075Sobrien	    {
3579117421Skan	      if (i == RID_LONG && (specbits & (1 << (int) RID_LONG)))
358090075Sobrien		{
358190075Sobrien		  if (longlong)
358290075Sobrien		    error ("`long long long' is too long for GCC");
358390075Sobrien		  else
358490075Sobrien		    {
358590075Sobrien		      if (pedantic && !flag_isoc99 && ! in_system_header
358690075Sobrien			  && warn_long_long)
3587117421Skan			pedwarn ("ISO C90 does not support `long long'");
358890075Sobrien		      longlong = 1;
358990075Sobrien		    }
359090075Sobrien		}
359190075Sobrien	      else if (specbits & (1 << (int) i))
3592117421Skan		{
3593117421Skan		  if (i == RID_CONST || i == RID_VOLATILE || i == RID_RESTRICT)
3594117421Skan		    {
3595117421Skan		      if (!flag_isoc99)
3596117421Skan			pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
3597117421Skan		    }
3598117421Skan		  else
3599117421Skan		    error ("duplicate `%s'", IDENTIFIER_POINTER (id));
3600117421Skan		}
3601117421Skan
3602117421Skan	      /* Diagnose "__thread extern".  Recall that this list
3603117421Skan		 is in the reverse order seen in the text.  */
3604117421Skan	      if (i == RID_THREAD
3605117421Skan		  && (specbits & (1 << (int) RID_EXTERN
3606117421Skan				  | 1 << (int) RID_STATIC)))
3607117421Skan		{
3608117421Skan		  if (specbits & 1 << (int) RID_EXTERN)
3609117421Skan		    error ("`__thread' before `extern'");
3610117421Skan		  else
3611117421Skan		    error ("`__thread' before `static'");
3612117421Skan		}
3613117421Skan
361490075Sobrien	      specbits |= 1 << (int) i;
361590075Sobrien	      goto found;
361690075Sobrien	    }
361790075Sobrien	}
361818334Speter      if (type)
361918334Speter	error ("two or more data types in declaration of `%s'", name);
362018334Speter      /* Actual typedefs come to us as TYPE_DECL nodes.  */
362118334Speter      else if (TREE_CODE (id) == TYPE_DECL)
362218334Speter	{
362390075Sobrien	  if (TREE_TYPE (id) == error_mark_node)
362490075Sobrien	    ; /* Allow the type to default to int to avoid cascading errors.  */
362590075Sobrien	  else
362690075Sobrien	    {
362790075Sobrien	      type = TREE_TYPE (id);
362890075Sobrien	      decl_attr = DECL_ATTRIBUTES (id);
362990075Sobrien	      typedef_decl = id;
363090075Sobrien	    }
363118334Speter	}
363218334Speter      /* Built-in types come as identifiers.  */
363318334Speter      else if (TREE_CODE (id) == IDENTIFIER_NODE)
363418334Speter	{
363590075Sobrien	  tree t = lookup_name (id);
363618334Speter	  if (TREE_TYPE (t) == error_mark_node)
363718334Speter	    ;
363818334Speter	  else if (!t || TREE_CODE (t) != TYPE_DECL)
363918334Speter	    error ("`%s' fails to be a typedef or built in type",
364018334Speter		   IDENTIFIER_POINTER (id));
364118334Speter	  else
364218334Speter	    {
364318334Speter	      type = TREE_TYPE (t);
364418334Speter	      typedef_decl = t;
364518334Speter	    }
364618334Speter	}
364718334Speter      else if (TREE_CODE (id) != ERROR_MARK)
364818334Speter	type = id;
364918334Speter
365090075Sobrien    found:
365190075Sobrien      ;
365218334Speter    }
365318334Speter
365418334Speter  typedef_type = type;
365518334Speter  if (type)
365618334Speter    size_varies = C_TYPE_VARIABLE_SIZE (type);
365718334Speter
365818334Speter  /* No type at all: default to `int', and set DEFAULTED_INT
365918334Speter     because it was not a user-defined typedef.  */
366018334Speter
366118334Speter  if (type == 0)
366218334Speter    {
366350397Sobrien      if ((! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
366450397Sobrien			  | (1 << (int) RID_SIGNED)
366590075Sobrien			  | (1 << (int) RID_UNSIGNED)
366690075Sobrien			  | (1 << (int) RID_COMPLEX))))
366750397Sobrien	  /* Don't warn about typedef foo = bar.  */
366850397Sobrien	  && ! (specbits & (1 << (int) RID_TYPEDEF) && initialized)
366990075Sobrien	  && ! in_system_header)
367050397Sobrien	{
367190075Sobrien	  /* Issue a warning if this is an ISO C 99 program or if -Wreturn-type
367252284Sobrien	     and this is a function, or if -Wimplicit; prefer the former
367352284Sobrien	     warning since it is more explicit.  */
367490075Sobrien	  if ((warn_implicit_int || warn_return_type || flag_isoc99)
367590075Sobrien	      && funcdef_flag)
367650397Sobrien	    warn_about_return_type = 1;
367790075Sobrien	  else if (warn_implicit_int || flag_isoc99)
367890075Sobrien	    pedwarn_c99 ("type defaults to `int' in declaration of `%s'",
367990075Sobrien			 name);
368050397Sobrien	}
368150397Sobrien
368218334Speter      defaulted_int = 1;
368318334Speter      type = integer_type_node;
368418334Speter    }
368518334Speter
368618334Speter  /* Now process the modifiers that were specified
368718334Speter     and check for invalid combinations.  */
368818334Speter
368918334Speter  /* Long double is a special combination.  */
369018334Speter
369150397Sobrien  if ((specbits & 1 << (int) RID_LONG) && ! longlong
369218334Speter      && TYPE_MAIN_VARIANT (type) == double_type_node)
369318334Speter    {
369490075Sobrien      specbits &= ~(1 << (int) RID_LONG);
369518334Speter      type = long_double_type_node;
369618334Speter    }
369718334Speter
369818334Speter  /* Check all other uses of type modifiers.  */
369918334Speter
370018334Speter  if (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
370118334Speter		  | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED)))
370218334Speter    {
370318334Speter      int ok = 0;
370418334Speter
370550397Sobrien      if ((specbits & 1 << (int) RID_LONG)
370650397Sobrien	  && (specbits & 1 << (int) RID_SHORT))
370750397Sobrien	error ("both long and short specified for `%s'", name);
370818334Speter      else if (((specbits & 1 << (int) RID_LONG)
370918334Speter		|| (specbits & 1 << (int) RID_SHORT))
371018334Speter	       && explicit_char)
371118334Speter	error ("long or short specified with char for `%s'", name);
371218334Speter      else if (((specbits & 1 << (int) RID_LONG)
371318334Speter		|| (specbits & 1 << (int) RID_SHORT))
371418334Speter	       && TREE_CODE (type) == REAL_TYPE)
371550397Sobrien	{
371650397Sobrien	  static int already = 0;
371750397Sobrien
371850397Sobrien	  error ("long or short specified with floating type for `%s'", name);
371950397Sobrien	  if (! already && ! pedantic)
372050397Sobrien	    {
372150397Sobrien	      error ("the only valid combination is `long double'");
372250397Sobrien	      already = 1;
372350397Sobrien	    }
372450397Sobrien	}
372518334Speter      else if ((specbits & 1 << (int) RID_SIGNED)
372618334Speter	       && (specbits & 1 << (int) RID_UNSIGNED))
372750397Sobrien	error ("both signed and unsigned specified for `%s'", name);
372850397Sobrien      else if (TREE_CODE (type) != INTEGER_TYPE)
372950397Sobrien	error ("long, short, signed or unsigned invalid for `%s'", name);
373018334Speter      else
373118334Speter	{
373218334Speter	  ok = 1;
3733117421Skan	  if (!explicit_int && !defaulted_int && !explicit_char)
373418334Speter	    {
3735117421Skan	      error ("long, short, signed or unsigned used invalidly for `%s'",
3736117421Skan		     name);
3737117421Skan	      ok = 0;
373818334Speter	    }
373918334Speter	}
374018334Speter
374118334Speter      /* Discard the type modifiers if they are invalid.  */
374218334Speter      if (! ok)
374318334Speter	{
374418334Speter	  specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
374518334Speter			| (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED));
374618334Speter	  longlong = 0;
374718334Speter	}
374818334Speter    }
374918334Speter
375018334Speter  if ((specbits & (1 << (int) RID_COMPLEX))
375118334Speter      && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
375218334Speter    {
375318334Speter      error ("complex invalid for `%s'", name);
375490075Sobrien      specbits &= ~(1 << (int) RID_COMPLEX);
375518334Speter    }
375618334Speter
375718334Speter  /* Decide whether an integer type is signed or not.
375896263Sobrien     Optionally treat bitfields as signed by default.  */
375918334Speter  if (specbits & 1 << (int) RID_UNSIGNED
376018334Speter      || (bitfield && ! flag_signed_bitfields
376118334Speter	  && (explicit_int || defaulted_int || explicit_char
376218334Speter	      /* A typedef for plain `int' without `signed'
376318334Speter		 can be controlled just like plain `int'.  */
376418334Speter	      || ! (typedef_decl != 0
376518334Speter		    && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
376618334Speter	  && TREE_CODE (type) != ENUMERAL_TYPE
376718334Speter	  && !(specbits & 1 << (int) RID_SIGNED)))
376818334Speter    {
376918334Speter      if (longlong)
377018334Speter	type = long_long_unsigned_type_node;
377118334Speter      else if (specbits & 1 << (int) RID_LONG)
377218334Speter	type = long_unsigned_type_node;
377318334Speter      else if (specbits & 1 << (int) RID_SHORT)
377418334Speter	type = short_unsigned_type_node;
377518334Speter      else if (type == char_type_node)
377618334Speter	type = unsigned_char_type_node;
377718334Speter      else if (typedef_decl)
3778117421Skan	type = c_common_unsigned_type (type);
377918334Speter      else
378018334Speter	type = unsigned_type_node;
378118334Speter    }
378218334Speter  else if ((specbits & 1 << (int) RID_SIGNED)
378318334Speter	   && type == char_type_node)
378418334Speter    type = signed_char_type_node;
378518334Speter  else if (longlong)
378618334Speter    type = long_long_integer_type_node;
378718334Speter  else if (specbits & 1 << (int) RID_LONG)
378818334Speter    type = long_integer_type_node;
378918334Speter  else if (specbits & 1 << (int) RID_SHORT)
379018334Speter    type = short_integer_type_node;
379118334Speter
379218334Speter  if (specbits & 1 << (int) RID_COMPLEX)
379318334Speter    {
379490075Sobrien      if (pedantic && !flag_isoc99)
3795117421Skan	pedwarn ("ISO C90 does not support complex types");
379618334Speter      /* If we just have "complex", it is equivalent to
379718334Speter	 "complex double", but if any modifiers at all are specified it is
379818334Speter	 the complex form of TYPE.  E.g, "complex short" is
379918334Speter	 "complex short int".  */
380018334Speter
380118334Speter      if (defaulted_int && ! longlong
380218334Speter	  && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
380318334Speter			    | (1 << (int) RID_SIGNED)
380418334Speter			    | (1 << (int) RID_UNSIGNED))))
380590075Sobrien	{
380690075Sobrien	  if (pedantic)
380790075Sobrien	    pedwarn ("ISO C does not support plain `complex' meaning `double complex'");
380890075Sobrien	  type = complex_double_type_node;
380990075Sobrien	}
381018334Speter      else if (type == integer_type_node)
381190075Sobrien	{
381290075Sobrien	  if (pedantic)
381390075Sobrien	    pedwarn ("ISO C does not support complex integer types");
381490075Sobrien	  type = complex_integer_type_node;
381590075Sobrien	}
381618334Speter      else if (type == float_type_node)
381718334Speter	type = complex_float_type_node;
381818334Speter      else if (type == double_type_node)
381918334Speter	type = complex_double_type_node;
382018334Speter      else if (type == long_double_type_node)
382118334Speter	type = complex_long_double_type_node;
382218334Speter      else
382390075Sobrien	{
382490075Sobrien	  if (pedantic)
382590075Sobrien	    pedwarn ("ISO C does not support complex integer types");
382690075Sobrien	  type = build_complex_type (type);
382790075Sobrien	}
382818334Speter    }
382918334Speter
383052284Sobrien  /* Figure out the type qualifiers for the declaration.  There are
383152284Sobrien     two ways a declaration can become qualified.  One is something
383252284Sobrien     like `const int i' where the `const' is explicit.  Another is
383352284Sobrien     something like `typedef const int CI; CI i' where the type of the
383452284Sobrien     declaration contains the `const'.  */
383518334Speter  constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (type);
383652284Sobrien  restrictp = !! (specbits & 1 << (int) RID_RESTRICT) + TYPE_RESTRICT (type);
383718334Speter  volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type);
383818334Speter  inlinep = !! (specbits & (1 << (int) RID_INLINE));
383990075Sobrien  if (constp > 1 && ! flag_isoc99)
384018334Speter    pedwarn ("duplicate `const'");
384190075Sobrien  if (restrictp > 1 && ! flag_isoc99)
384252284Sobrien    pedwarn ("duplicate `restrict'");
384390075Sobrien  if (volatilep > 1 && ! flag_isoc99)
384418334Speter    pedwarn ("duplicate `volatile'");
384552284Sobrien  if (! flag_gen_aux_info && (TYPE_QUALS (type)))
384618334Speter    type = TYPE_MAIN_VARIANT (type);
384752284Sobrien  type_quals = ((constp ? TYPE_QUAL_CONST : 0)
384852284Sobrien		| (restrictp ? TYPE_QUAL_RESTRICT : 0)
384952284Sobrien		| (volatilep ? TYPE_QUAL_VOLATILE : 0));
385018334Speter
385118334Speter  /* Warn if two storage classes are given. Default to `auto'.  */
385218334Speter
385318334Speter  {
385418334Speter    int nclasses = 0;
385518334Speter
385618334Speter    if (specbits & 1 << (int) RID_AUTO) nclasses++;
385718334Speter    if (specbits & 1 << (int) RID_STATIC) nclasses++;
385818334Speter    if (specbits & 1 << (int) RID_EXTERN) nclasses++;
385918334Speter    if (specbits & 1 << (int) RID_REGISTER) nclasses++;
386018334Speter    if (specbits & 1 << (int) RID_TYPEDEF) nclasses++;
386118334Speter
3862117421Skan    /* "static __thread" and "extern __thread" are allowed.  */
3863117421Skan    if ((specbits & (1 << (int) RID_THREAD
3864117421Skan		     | 1 << (int) RID_STATIC
3865117421Skan		     | 1 << (int) RID_EXTERN)) == (1 << (int) RID_THREAD))
3866117421Skan      nclasses++;
3867117421Skan
386818334Speter    /* Warn about storage classes that are invalid for certain
386918334Speter       kinds of declarations (parameters, typenames, etc.).  */
387018334Speter
387118334Speter    if (nclasses > 1)
387218334Speter      error ("multiple storage classes in declaration of `%s'", name);
387318334Speter    else if (funcdef_flag
387418334Speter	     && (specbits
387518334Speter		 & ((1 << (int) RID_REGISTER)
387618334Speter		    | (1 << (int) RID_AUTO)
3877117421Skan		    | (1 << (int) RID_TYPEDEF)
3878117421Skan		    | (1 << (int) RID_THREAD))))
387918334Speter      {
388018334Speter	if (specbits & 1 << (int) RID_AUTO
388118334Speter	    && (pedantic || current_binding_level == global_binding_level))
388218334Speter	  pedwarn ("function definition declared `auto'");
388318334Speter	if (specbits & 1 << (int) RID_REGISTER)
388418334Speter	  error ("function definition declared `register'");
388518334Speter	if (specbits & 1 << (int) RID_TYPEDEF)
388618334Speter	  error ("function definition declared `typedef'");
3887117421Skan	if (specbits & 1 << (int) RID_THREAD)
3888117421Skan	  error ("function definition declared `__thread'");
388990075Sobrien	specbits &= ~((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER)
3890117421Skan		      | (1 << (int) RID_AUTO) | (1 << (int) RID_THREAD));
389118334Speter      }
389218334Speter    else if (decl_context != NORMAL && nclasses > 0)
389318334Speter      {
389418334Speter	if (decl_context == PARM && specbits & 1 << (int) RID_REGISTER)
389518334Speter	  ;
389618334Speter	else
389718334Speter	  {
389890075Sobrien	    switch (decl_context)
389990075Sobrien	      {
390090075Sobrien	      case FIELD:
390190075Sobrien		error ("storage class specified for structure field `%s'",
390290075Sobrien		       name);
390390075Sobrien		break;
390490075Sobrien	      case PARM:
390590075Sobrien		error ("storage class specified for parameter `%s'", name);
390690075Sobrien		break;
390790075Sobrien	      default:
390890075Sobrien		error ("storage class specified for typename");
390990075Sobrien		break;
391090075Sobrien	      }
391190075Sobrien	    specbits &= ~((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER)
391290075Sobrien			  | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC)
3913117421Skan			  | (1 << (int) RID_EXTERN) | (1 << (int) RID_THREAD));
391418334Speter	  }
391518334Speter      }
391618334Speter    else if (specbits & 1 << (int) RID_EXTERN && initialized && ! funcdef_flag)
391718334Speter      {
391818334Speter	/* `extern' with initialization is invalid if not at top level.  */
391918334Speter	if (current_binding_level == global_binding_level)
392018334Speter	  warning ("`%s' initialized and declared `extern'", name);
392118334Speter	else
392218334Speter	  error ("`%s' has both `extern' and initializer", name);
392318334Speter      }
3924117421Skan    else if (current_binding_level == global_binding_level)
3925117421Skan      {
3926117421Skan	if (specbits & 1 << (int) RID_AUTO)
3927117421Skan	  error ("top-level declaration of `%s' specifies `auto'", name);
3928117421Skan      }
3929117421Skan    else
3930117421Skan      {
3931117421Skan	if (specbits & 1 << (int) RID_EXTERN && funcdef_flag)
3932117421Skan	  error ("nested function `%s' declared `extern'", name);
3933117421Skan	else if ((specbits & (1 << (int) RID_THREAD
3934117421Skan			       | 1 << (int) RID_EXTERN
3935117421Skan			       | 1 << (int) RID_STATIC))
3936117421Skan		 == (1 << (int) RID_THREAD))
3937117421Skan	  {
3938117421Skan	    error ("function-scope `%s' implicitly auto and declared `__thread'",
3939117421Skan		   name);
3940117421Skan	    specbits &= ~(1 << (int) RID_THREAD);
3941117421Skan	  }
3942117421Skan      }
394318334Speter  }
394418334Speter
394518334Speter  /* Now figure out the structure of the declarator proper.
394618334Speter     Descend through it, creating more complex types, until we reach
394718334Speter     the declared identifier (or NULL_TREE, in an absolute declarator).  */
394818334Speter
394918334Speter  while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE)
395018334Speter    {
395118334Speter      if (type == error_mark_node)
395218334Speter	{
395318334Speter	  declarator = TREE_OPERAND (declarator, 0);
395418334Speter	  continue;
395518334Speter	}
395618334Speter
395718334Speter      /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]),
395818334Speter	 an INDIRECT_REF (for *...),
395918334Speter	 a CALL_EXPR (for ...(...)),
396090075Sobrien	 a TREE_LIST (for nested attributes),
396118334Speter	 an identifier (for the name being declared)
396218334Speter	 or a null pointer (for the place in an absolute declarator
396318334Speter	 where the name was omitted).
396418334Speter	 For the last two cases, we have just exited the loop.
396518334Speter
396618334Speter	 At this point, TYPE is the type of elements of an array,
396718334Speter	 or for a function to return, or for a pointer to point to.
396818334Speter	 After this sequence of ifs, TYPE is the type of the
396918334Speter	 array or function or pointer, and DECLARATOR has had its
397018334Speter	 outermost layer removed.  */
397118334Speter
397290075Sobrien      if (array_ptr_quals != NULL_TREE || array_parm_static)
397318334Speter	{
397490075Sobrien	  /* Only the innermost declarator (making a parameter be of
397590075Sobrien	     array type which is converted to pointer type)
397690075Sobrien	     may have static or type qualifiers.  */
397790075Sobrien	  error ("static or type qualifiers in non-parameter array declarator");
397890075Sobrien	  array_ptr_quals = NULL_TREE;
397990075Sobrien	  array_parm_static = 0;
398090075Sobrien	}
398190075Sobrien
398290075Sobrien      if (TREE_CODE (declarator) == TREE_LIST)
398390075Sobrien	{
398490075Sobrien	  /* We encode a declarator with embedded attributes using
398590075Sobrien	     a TREE_LIST.  */
398690075Sobrien	  tree attrs = TREE_PURPOSE (declarator);
398790075Sobrien	  tree inner_decl;
398890075Sobrien	  int attr_flags = 0;
398990075Sobrien	  declarator = TREE_VALUE (declarator);
399090075Sobrien	  inner_decl = declarator;
399190075Sobrien	  while (inner_decl != NULL_TREE
399290075Sobrien		 && TREE_CODE (inner_decl) == TREE_LIST)
399390075Sobrien	    inner_decl = TREE_VALUE (inner_decl);
399490075Sobrien	  if (inner_decl == NULL_TREE
399590075Sobrien	      || TREE_CODE (inner_decl) == IDENTIFIER_NODE)
399690075Sobrien	    attr_flags |= (int) ATTR_FLAG_DECL_NEXT;
399796263Sobrien	  else if (TREE_CODE (inner_decl) == CALL_EXPR)
399890075Sobrien	    attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT;
399996263Sobrien	  else if (TREE_CODE (inner_decl) == ARRAY_REF)
400090075Sobrien	    attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT;
400190075Sobrien	  returned_attrs = decl_attributes (&type,
400290075Sobrien					    chainon (returned_attrs, attrs),
400390075Sobrien					    attr_flags);
400490075Sobrien	}
400590075Sobrien      else if (TREE_CODE (declarator) == ARRAY_REF)
400690075Sobrien	{
400790075Sobrien	  tree itype = NULL_TREE;
400890075Sobrien	  tree size = TREE_OPERAND (declarator, 1);
400918334Speter	  /* The index is a signed object `sizetype' bits wide.  */
4010117421Skan	  tree index_type = c_common_signed_type (sizetype);
401118334Speter
401290075Sobrien	  array_ptr_quals = TREE_TYPE (declarator);
401390075Sobrien	  array_parm_static = TREE_STATIC (declarator);
401490075Sobrien
401518334Speter	  declarator = TREE_OPERAND (declarator, 0);
401618334Speter
401718334Speter	  /* Check for some types that there cannot be arrays of.  */
401818334Speter
401990075Sobrien	  if (VOID_TYPE_P (type))
402018334Speter	    {
402118334Speter	      error ("declaration of `%s' as array of voids", name);
402218334Speter	      type = error_mark_node;
402318334Speter	    }
402418334Speter
402518334Speter	  if (TREE_CODE (type) == FUNCTION_TYPE)
402618334Speter	    {
402718334Speter	      error ("declaration of `%s' as array of functions", name);
402818334Speter	      type = error_mark_node;
402918334Speter	    }
403018334Speter
4031117421Skan	  if (pedantic && flexible_array_type_p (type))
4032117421Skan	    pedwarn ("invalid use of structure with flexible array member");
4033117421Skan
403418334Speter	  if (size == error_mark_node)
403518334Speter	    type = error_mark_node;
403618334Speter
403718334Speter	  if (type == error_mark_node)
403818334Speter	    continue;
403918334Speter
404018334Speter	  /* If size was specified, set ITYPE to a range-type for that size.
404118334Speter	     Otherwise, ITYPE remains null.  finish_decl may figure it out
404218334Speter	     from an initial value.  */
404318334Speter
404418334Speter	  if (size)
404518334Speter	    {
404618334Speter	      /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
404718334Speter	      STRIP_TYPE_NOPS (size);
404818334Speter
404990075Sobrien	      if (! INTEGRAL_TYPE_P (TREE_TYPE (size)))
405018334Speter		{
405118334Speter		  error ("size of array `%s' has non-integer type", name);
405218334Speter		  size = integer_one_node;
405318334Speter		}
405418334Speter
405518334Speter	      if (pedantic && integer_zerop (size))
405690075Sobrien		pedwarn ("ISO C forbids zero-size array `%s'", name);
405718334Speter
405818334Speter	      if (TREE_CODE (size) == INTEGER_CST)
405918334Speter		{
406018334Speter		  constant_expression_warning (size);
406118334Speter		  if (tree_int_cst_sgn (size) < 0)
406218334Speter		    {
406318334Speter		      error ("size of array `%s' is negative", name);
406418334Speter		      size = integer_one_node;
406518334Speter		    }
406618334Speter		}
406718334Speter	      else
406818334Speter		{
406918334Speter		  /* Make sure the array size remains visibly nonconstant
407018334Speter		     even if it is (eg) a const variable with known value.  */
407118334Speter		  size_varies = 1;
407218334Speter
4073102790Skan		  if (!flag_isoc99 && pedantic)
407418334Speter		    {
407518334Speter		      if (TREE_CONSTANT (size))
4076117421Skan			pedwarn ("ISO C90 forbids array `%s' whose size can't be evaluated",
407790075Sobrien				 name);
407818334Speter		      else
4079117421Skan			pedwarn ("ISO C90 forbids variable-size array `%s'",
408090075Sobrien				 name);
408118334Speter		    }
408218334Speter		}
408318334Speter
408490075Sobrien	      if (integer_zerop (size))
408550397Sobrien		{
408690075Sobrien		  /* A zero-length array cannot be represented with an
408790075Sobrien		     unsigned index type, which is what we'll get with
408890075Sobrien		     build_index_type.  Create an open-ended range instead.  */
408990075Sobrien		  itype = build_range_type (sizetype, size, NULL_TREE);
409050397Sobrien		}
409190075Sobrien	      else
409290075Sobrien		{
409390075Sobrien		  /* Compute the maximum valid index, that is, size - 1.
409490075Sobrien		     Do the calculation in index_type, so that if it is
409590075Sobrien		     a variable the computations will be done in the
409690075Sobrien		     proper mode.  */
409790075Sobrien	          itype = fold (build (MINUS_EXPR, index_type,
409890075Sobrien				       convert (index_type, size),
409990075Sobrien				       convert (index_type, size_one_node)));
410050397Sobrien
410190075Sobrien	          /* If that overflowed, the array is too big.
410290075Sobrien		     ??? While a size of INT_MAX+1 technically shouldn't
410390075Sobrien		     cause an overflow (because we subtract 1), the overflow
410490075Sobrien		     is recorded during the conversion to index_type, before
410590075Sobrien		     the subtraction.  Handling this case seems like an
410690075Sobrien		     unnecessary complication.  */
410790075Sobrien		  if (TREE_OVERFLOW (itype))
410890075Sobrien		    {
410990075Sobrien		      error ("size of array `%s' is too large", name);
411090075Sobrien		      type = error_mark_node;
411190075Sobrien		      continue;
411290075Sobrien		    }
411390075Sobrien
411490075Sobrien		  if (size_varies)
4115117421Skan		    {
4116117421Skan		      /* We must be able to distinguish the
4117117421Skan			 SAVE_EXPR_CONTEXT for the variably-sized type
4118117421Skan			 so that we can set it correctly in
4119117421Skan			 set_save_expr_context.  The convention is
4120117421Skan			 that all SAVE_EXPRs that need to be reset
4121117421Skan			 have NULL_TREE for their SAVE_EXPR_CONTEXT.  */
4122117421Skan		      tree cfd = current_function_decl;
4123117421Skan		      if (decl_context == PARM)
4124117421Skan			current_function_decl = NULL_TREE;
4125117421Skan		      itype = variable_size (itype);
4126117421Skan		      if (decl_context == PARM)
4127117421Skan			current_function_decl = cfd;
4128117421Skan		    }
412990075Sobrien		  itype = build_index_type (itype);
413090075Sobrien		}
413118334Speter	    }
413290075Sobrien	  else if (decl_context == FIELD)
413390075Sobrien	    {
413490075Sobrien	      if (pedantic && !flag_isoc99 && !in_system_header)
4135117421Skan		pedwarn ("ISO C90 does not support flexible array members");
413618334Speter
413790075Sobrien	      /* ISO C99 Flexible array members are effectively identical
413890075Sobrien		 to GCC's zero-length array extension.  */
413990075Sobrien	      itype = build_range_type (sizetype, size_zero_node, NULL_TREE);
414090075Sobrien	    }
414118334Speter
414290075Sobrien	  /* If pedantic, complain about arrays of incomplete types.  */
414390075Sobrien
414490075Sobrien	  if (pedantic && !COMPLETE_TYPE_P (type))
414590075Sobrien	    pedwarn ("array type has incomplete element type");
414690075Sobrien
414790075Sobrien#if 0
414890075Sobrien	  /* We shouldn't have a function type here at all!
414990075Sobrien	     Functions aren't allowed as array elements.  */
415018334Speter	  if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
415118334Speter	      && (constp || volatilep))
415290075Sobrien	    pedwarn ("ISO C forbids const or volatile function types");
415318334Speter#endif
415418334Speter
415518334Speter	  /* Build the array type itself, then merge any constancy or
415618334Speter	     volatility into the target type.  We must do it in this order
415718334Speter	     to ensure that the TYPE_MAIN_VARIANT field of the array type
415818334Speter	     is set correctly.  */
415918334Speter
416018334Speter	  type = build_array_type (type, itype);
416152284Sobrien	  if (type_quals)
416252284Sobrien	    type = c_build_qualified_type (type, type_quals);
416318334Speter
416418334Speter	  if (size_varies)
416518334Speter	    C_TYPE_VARIABLE_SIZE (type) = 1;
416690075Sobrien
416790075Sobrien	  /* The GCC extension for zero-length arrays differs from
416890075Sobrien	     ISO flexible array members in that sizeof yields zero.  */
416990075Sobrien	  if (size && integer_zerop (size))
417090075Sobrien	    {
417190075Sobrien	      layout_type (type);
417290075Sobrien	      TYPE_SIZE (type) = bitsize_zero_node;
417390075Sobrien	      TYPE_SIZE_UNIT (type) = size_zero_node;
417490075Sobrien	    }
417590075Sobrien	  if (decl_context != PARM
417690075Sobrien	      && (array_ptr_quals != NULL_TREE || array_parm_static))
417790075Sobrien	    {
417890075Sobrien	      error ("static or type qualifiers in non-parameter array declarator");
417990075Sobrien	      array_ptr_quals = NULL_TREE;
418090075Sobrien	      array_parm_static = 0;
418190075Sobrien	    }
418218334Speter	}
418318334Speter      else if (TREE_CODE (declarator) == CALL_EXPR)
418418334Speter	{
418518334Speter	  tree arg_types;
418618334Speter
418718334Speter	  /* Declaring a function type.
418818334Speter	     Make sure we have a valid type for the function to return.  */
418918334Speter	  if (type == error_mark_node)
419018334Speter	    continue;
419118334Speter
419218334Speter	  size_varies = 0;
419318334Speter
419418334Speter	  /* Warn about some types functions can't return.  */
419518334Speter
419618334Speter	  if (TREE_CODE (type) == FUNCTION_TYPE)
419718334Speter	    {
419818334Speter	      error ("`%s' declared as function returning a function", name);
419918334Speter	      type = integer_type_node;
420018334Speter	    }
420118334Speter	  if (TREE_CODE (type) == ARRAY_TYPE)
420218334Speter	    {
420318334Speter	      error ("`%s' declared as function returning an array", name);
420418334Speter	      type = integer_type_node;
420518334Speter	    }
420618334Speter
420718334Speter	  /* Construct the function type and go to the next
420818334Speter	     inner layer of declarator.  */
420918334Speter
421018334Speter	  arg_types = grokparms (TREE_OPERAND (declarator, 1),
421118334Speter				 funcdef_flag
421218334Speter				 /* Say it's a definition
421318334Speter				    only for the CALL_EXPR
421418334Speter				    closest to the identifier.  */
421518334Speter				 && TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE);
421652284Sobrien	  /* Type qualifiers before the return type of the function
421752284Sobrien	     qualify the return type, not the function type.  */
421852284Sobrien	  if (type_quals)
421990075Sobrien	    {
422090075Sobrien	      /* Type qualifiers on a function return type are normally
422190075Sobrien		 permitted by the standard but have no effect, so give a
422290075Sobrien		 warning at -W.  Qualifiers on a void return type have
422390075Sobrien		 meaning as a GNU extension, and are banned on function
422490075Sobrien		 definitions in ISO C.  FIXME: strictly we shouldn't
422590075Sobrien		 pedwarn for qualified void return types except on function
422690075Sobrien		 definitions, but not doing so could lead to the undesirable
422790075Sobrien		 state of a "volatile void" function return type not being
422890075Sobrien		 warned about, and a use of the function being compiled
422990075Sobrien		 with GNU semantics, with no diagnostics under -pedantic.  */
423090075Sobrien	      if (VOID_TYPE_P (type) && pedantic && !in_system_header)
423190075Sobrien		pedwarn ("ISO C forbids qualified void function return type");
423290075Sobrien	      else if (extra_warnings
423390075Sobrien		       && !(VOID_TYPE_P (type)
423490075Sobrien			    && type_quals == TYPE_QUAL_VOLATILE))
423590075Sobrien		warning ("type qualifiers ignored on function return type");
423690075Sobrien
423790075Sobrien	      type = c_build_qualified_type (type, type_quals);
423890075Sobrien	    }
423952284Sobrien	  type_quals = TYPE_UNQUALIFIED;
424018334Speter
424118334Speter	  type = build_function_type (type, arg_types);
424218334Speter	  declarator = TREE_OPERAND (declarator, 0);
424318334Speter
424418334Speter	  /* Set the TYPE_CONTEXTs for each tagged type which is local to
424518334Speter	     the formal parameter list of this FUNCTION_TYPE to point to
424618334Speter	     the FUNCTION_TYPE node itself.  */
424718334Speter
424818334Speter	  {
424990075Sobrien	    tree link;
425018334Speter
425150397Sobrien	    for (link = last_function_parm_tags;
425218334Speter		 link;
425318334Speter		 link = TREE_CHAIN (link))
425418334Speter	      TYPE_CONTEXT (TREE_VALUE (link)) = type;
425518334Speter	  }
425618334Speter	}
425718334Speter      else if (TREE_CODE (declarator) == INDIRECT_REF)
425818334Speter	{
425918334Speter	  /* Merge any constancy or volatility into the target type
426018334Speter	     for the pointer.  */
426118334Speter
426218334Speter	  if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
426352284Sobrien	      && type_quals)
426490075Sobrien	    pedwarn ("ISO C forbids qualified function types");
426552284Sobrien	  if (type_quals)
426652284Sobrien	    type = c_build_qualified_type (type, type_quals);
426752284Sobrien	  type_quals = TYPE_UNQUALIFIED;
426818334Speter	  size_varies = 0;
426918334Speter
427018334Speter	  type = build_pointer_type (type);
427118334Speter
427218334Speter	  /* Process a list of type modifier keywords
427318334Speter	     (such as const or volatile) that were given inside the `*'.  */
427418334Speter
427518334Speter	  if (TREE_TYPE (declarator))
427618334Speter	    {
427790075Sobrien	      tree typemodlist;
427818334Speter	      int erred = 0;
427952284Sobrien
428052284Sobrien	      constp = 0;
428152284Sobrien	      volatilep = 0;
428252284Sobrien	      restrictp = 0;
428318334Speter	      for (typemodlist = TREE_TYPE (declarator); typemodlist;
428418334Speter		   typemodlist = TREE_CHAIN (typemodlist))
428518334Speter		{
428652284Sobrien		  tree qualifier = TREE_VALUE (typemodlist);
428752284Sobrien
428890075Sobrien		  if (C_IS_RESERVED_WORD (qualifier))
428918334Speter		    {
429090075Sobrien		      if (C_RID_CODE (qualifier) == RID_CONST)
429190075Sobrien			constp++;
429290075Sobrien		      else if (C_RID_CODE (qualifier) == RID_VOLATILE)
429390075Sobrien			volatilep++;
429490075Sobrien		      else if (C_RID_CODE (qualifier) == RID_RESTRICT)
429590075Sobrien			restrictp++;
429690075Sobrien		      else
429790075Sobrien			erred++;
429818334Speter		    }
429990075Sobrien		  else
430090075Sobrien		    erred++;
430118334Speter		}
430290075Sobrien
430390075Sobrien	      if (erred)
430490075Sobrien		error ("invalid type modifier within pointer declarator");
430590075Sobrien	      if (constp > 1 && ! flag_isoc99)
430618334Speter		pedwarn ("duplicate `const'");
430790075Sobrien	      if (volatilep > 1 && ! flag_isoc99)
430818334Speter		pedwarn ("duplicate `volatile'");
430990075Sobrien	      if (restrictp > 1 && ! flag_isoc99)
431052284Sobrien		pedwarn ("duplicate `restrict'");
431152284Sobrien
431252284Sobrien	      type_quals = ((constp ? TYPE_QUAL_CONST : 0)
431352284Sobrien			    | (restrictp ? TYPE_QUAL_RESTRICT : 0)
431452284Sobrien			    | (volatilep ? TYPE_QUAL_VOLATILE : 0));
431518334Speter	    }
431618334Speter
431718334Speter	  declarator = TREE_OPERAND (declarator, 0);
431818334Speter	}
431918334Speter      else
432018334Speter	abort ();
432118334Speter
432218334Speter    }
432318334Speter
432418334Speter  /* Now TYPE has the actual type.  */
432518334Speter
432650397Sobrien  /* Did array size calculations overflow?  */
432750397Sobrien
432850397Sobrien  if (TREE_CODE (type) == ARRAY_TYPE
432990075Sobrien      && COMPLETE_TYPE_P (type)
433050397Sobrien      && TREE_OVERFLOW (TYPE_SIZE (type)))
433190075Sobrien    {
433290075Sobrien      error ("size of array `%s' is too large", name);
433390075Sobrien      /* If we proceed with the array type as it is, we'll eventually
433490075Sobrien	 crash in tree_low_cst().  */
433590075Sobrien      type = error_mark_node;
433690075Sobrien    }
433750397Sobrien
433818334Speter  /* If this is declaring a typedef name, return a TYPE_DECL.  */
433918334Speter
434018334Speter  if (specbits & (1 << (int) RID_TYPEDEF))
434118334Speter    {
434218334Speter      tree decl;
434318334Speter      /* Note that the grammar rejects storage classes
434418334Speter	 in typenames, fields or parameters */
434518334Speter      if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
434652284Sobrien	  && type_quals)
434790075Sobrien	pedwarn ("ISO C forbids qualified function types");
434852284Sobrien      if (type_quals)
434952284Sobrien	type = c_build_qualified_type (type, type_quals);
435018334Speter      decl = build_decl (TYPE_DECL, declarator, type);
435118334Speter      if ((specbits & (1 << (int) RID_SIGNED))
435218334Speter	  || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
435318334Speter	C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
435490075Sobrien      decl_attributes (&decl, returned_attrs, 0);
435518334Speter      return decl;
435618334Speter    }
435718334Speter
435818334Speter  /* Detect the case of an array type of unspecified size
435918334Speter     which came, as such, direct from a typedef name.
436018334Speter     We must copy the type, so that each identifier gets
436118334Speter     a distinct type, so that each identifier's size can be
436218334Speter     controlled separately by its own initializer.  */
436318334Speter
436418334Speter  if (type != 0 && typedef_type != 0
436590075Sobrien      && TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0
436690075Sobrien      && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type))
436718334Speter    {
436818334Speter      type = build_array_type (TREE_TYPE (type), 0);
436918334Speter      if (size_varies)
437018334Speter	C_TYPE_VARIABLE_SIZE (type) = 1;
437118334Speter    }
437218334Speter
437318334Speter  /* If this is a type name (such as, in a cast or sizeof),
437418334Speter     compute the type and return it now.  */
437518334Speter
437618334Speter  if (decl_context == TYPENAME)
437718334Speter    {
437818334Speter      /* Note that the grammar rejects storage classes
437918334Speter	 in typenames, fields or parameters */
438018334Speter      if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
438152284Sobrien	  && type_quals)
438290075Sobrien	pedwarn ("ISO C forbids const or volatile function types");
438352284Sobrien      if (type_quals)
438452284Sobrien	type = c_build_qualified_type (type, type_quals);
438590075Sobrien      decl_attributes (&type, returned_attrs, 0);
438618334Speter      return type;
438718334Speter    }
438818334Speter
438918334Speter  /* Aside from typedefs and type names (handle above),
439018334Speter     `void' at top level (not within pointer)
439118334Speter     is allowed only in public variables.
439218334Speter     We don't complain about parms either, but that is because
439318334Speter     a better error message can be made later.  */
439418334Speter
439590075Sobrien  if (VOID_TYPE_P (type) && decl_context != PARM
439618334Speter      && ! ((decl_context != FIELD && TREE_CODE (type) != FUNCTION_TYPE)
439718334Speter	    && ((specbits & (1 << (int) RID_EXTERN))
439818334Speter		|| (current_binding_level == global_binding_level
439918334Speter		    && !(specbits
440018334Speter			 & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER)))))))
440118334Speter    {
440218334Speter      error ("variable or field `%s' declared void", name);
440318334Speter      type = integer_type_node;
440418334Speter    }
440518334Speter
440618334Speter  /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
440718334Speter     or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE.  */
440818334Speter
440918334Speter  {
441090075Sobrien    tree decl;
441118334Speter
441218334Speter    if (decl_context == PARM)
441318334Speter      {
441490075Sobrien	tree type_as_written;
441590075Sobrien	tree promoted_type;
441618334Speter
441718334Speter	/* A parameter declared as an array of T is really a pointer to T.
441818334Speter	   One declared as a function is really a pointer to a function.  */
441918334Speter
442018334Speter	if (TREE_CODE (type) == ARRAY_TYPE)
442118334Speter	  {
442218334Speter	    /* Transfer const-ness of array into that of type pointed to.  */
442318334Speter	    type = TREE_TYPE (type);
442452284Sobrien	    if (type_quals)
442552284Sobrien	      type = c_build_qualified_type (type, type_quals);
442618334Speter	    type = build_pointer_type (type);
442752284Sobrien	    type_quals = TYPE_UNQUALIFIED;
442890075Sobrien	    if (array_ptr_quals)
442990075Sobrien	      {
443090075Sobrien		tree new_ptr_quals, new_ptr_attrs;
443190075Sobrien		int erred = 0;
443290075Sobrien		split_specs_attrs (array_ptr_quals, &new_ptr_quals, &new_ptr_attrs);
443390075Sobrien		/* We don't yet implement attributes in this context.  */
443490075Sobrien		if (new_ptr_attrs != NULL_TREE)
443590075Sobrien		  warning ("attributes in parameter array declarator ignored");
443690075Sobrien
443790075Sobrien		constp = 0;
443890075Sobrien		volatilep = 0;
443990075Sobrien		restrictp = 0;
444090075Sobrien		for (; new_ptr_quals; new_ptr_quals = TREE_CHAIN (new_ptr_quals))
444190075Sobrien		  {
444290075Sobrien		    tree qualifier = TREE_VALUE (new_ptr_quals);
444390075Sobrien
444490075Sobrien		    if (C_IS_RESERVED_WORD (qualifier))
444590075Sobrien		      {
444690075Sobrien			if (C_RID_CODE (qualifier) == RID_CONST)
444790075Sobrien			  constp++;
444890075Sobrien			else if (C_RID_CODE (qualifier) == RID_VOLATILE)
444990075Sobrien			  volatilep++;
445090075Sobrien			else if (C_RID_CODE (qualifier) == RID_RESTRICT)
445190075Sobrien			  restrictp++;
445290075Sobrien			else
445390075Sobrien			  erred++;
445490075Sobrien		      }
445590075Sobrien		    else
445690075Sobrien		      erred++;
445790075Sobrien		  }
445890075Sobrien
445990075Sobrien		if (erred)
446090075Sobrien		  error ("invalid type modifier within array declarator");
446190075Sobrien
446290075Sobrien		type_quals = ((constp ? TYPE_QUAL_CONST : 0)
446390075Sobrien			      | (restrictp ? TYPE_QUAL_RESTRICT : 0)
446490075Sobrien			      | (volatilep ? TYPE_QUAL_VOLATILE : 0));
446590075Sobrien	      }
446618334Speter	    size_varies = 0;
446718334Speter	  }
446818334Speter	else if (TREE_CODE (type) == FUNCTION_TYPE)
446918334Speter	  {
447052284Sobrien	    if (pedantic && type_quals)
447190075Sobrien	      pedwarn ("ISO C forbids qualified function types");
447252284Sobrien	    if (type_quals)
447352284Sobrien	      type = c_build_qualified_type (type, type_quals);
447418334Speter	    type = build_pointer_type (type);
447552284Sobrien	    type_quals = TYPE_UNQUALIFIED;
447618334Speter	  }
447790075Sobrien	else if (type_quals)
447890075Sobrien	  type = c_build_qualified_type (type, type_quals);
447990075Sobrien
448090075Sobrien	type_as_written = type;
448118334Speter
448218334Speter	decl = build_decl (PARM_DECL, declarator, type);
448318334Speter	if (size_varies)
448418334Speter	  C_DECL_VARIABLE_SIZE (decl) = 1;
448518334Speter
448618334Speter	/* Compute the type actually passed in the parmlist,
448718334Speter	   for the case where there is no prototype.
448818334Speter	   (For example, shorts and chars are passed as ints.)
448918334Speter	   When there is a prototype, this is overridden later.  */
449018334Speter
449190075Sobrien	if (type == error_mark_node)
449290075Sobrien	  promoted_type = type;
449390075Sobrien	else
4494117421Skan	  promoted_type = c_type_promotes_to (type);
449518334Speter
449690075Sobrien	DECL_ARG_TYPE (decl) = promoted_type;
449718334Speter	DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written;
449818334Speter      }
449918334Speter    else if (decl_context == FIELD)
450018334Speter      {
450118334Speter	/* Structure field.  It may not be a function.  */
450296263Sobrien
450318334Speter	if (TREE_CODE (type) == FUNCTION_TYPE)
450418334Speter	  {
450518334Speter	    error ("field `%s' declared as a function", name);
450618334Speter	    type = build_pointer_type (type);
450718334Speter	  }
450890075Sobrien	else if (TREE_CODE (type) != ERROR_MARK
450990075Sobrien	         && !COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (type))
451018334Speter	  {
451118334Speter	    error ("field `%s' has incomplete type", name);
451218334Speter	    type = error_mark_node;
451318334Speter	  }
451418334Speter	/* Move type qualifiers down to element of an array.  */
451552284Sobrien	if (TREE_CODE (type) == ARRAY_TYPE && type_quals)
451618334Speter	  {
451752284Sobrien	    type = build_array_type (c_build_qualified_type (TREE_TYPE (type),
451852284Sobrien							     type_quals),
451918334Speter				     TYPE_DOMAIN (type));
452090075Sobrien#if 0
452190075Sobrien	    /* Leave the field const or volatile as well.  */
452252284Sobrien	    type_quals = TYPE_UNQUALIFIED;
452318334Speter#endif
452418334Speter	  }
452518334Speter	decl = build_decl (FIELD_DECL, declarator, type);
452690075Sobrien	DECL_NONADDRESSABLE_P (decl) = bitfield;
452790075Sobrien
452818334Speter	if (size_varies)
452918334Speter	  C_DECL_VARIABLE_SIZE (decl) = 1;
453018334Speter      }
453118334Speter    else if (TREE_CODE (type) == FUNCTION_TYPE)
453218334Speter      {
453318334Speter	/* Every function declaration is "external"
453418334Speter	   except for those which are inside a function body
453518334Speter	   in which `auto' is used.
453618334Speter	   That is a case not specified by ANSI C,
453718334Speter	   and we use it for forward declarations for nested functions.  */
453818334Speter	int extern_ref = (!(specbits & (1 << (int) RID_AUTO))
453918334Speter			  || current_binding_level == global_binding_level);
454018334Speter
454118334Speter	if (specbits & (1 << (int) RID_AUTO)
454218334Speter	    && (pedantic || current_binding_level == global_binding_level))
454318334Speter	  pedwarn ("invalid storage class for function `%s'", name);
454418334Speter	if (specbits & (1 << (int) RID_REGISTER))
454518334Speter	  error ("invalid storage class for function `%s'", name);
4546117421Skan	if (specbits & (1 << (int) RID_THREAD))
4547117421Skan	  error ("invalid storage class for function `%s'", name);
454818334Speter	/* Function declaration not at top level.
454918334Speter	   Storage classes other than `extern' are not allowed
455018334Speter	   and `extern' makes no difference.  */
455118334Speter	if (current_binding_level != global_binding_level
455218334Speter	    && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE)))
455318334Speter	    && pedantic)
455418334Speter	  pedwarn ("invalid storage class for function `%s'", name);
455518334Speter
455618334Speter	decl = build_decl (FUNCTION_DECL, declarator, type);
455790075Sobrien	decl = build_decl_attribute_variant (decl, decl_attr);
455818334Speter
455990075Sobrien	DECL_LANG_SPECIFIC (decl) = (struct lang_decl *)
456090075Sobrien	  ggc_alloc_cleared (sizeof (struct lang_decl));
456190075Sobrien
456252284Sobrien	if (pedantic && type_quals && ! DECL_IN_SYSTEM_HEADER (decl))
456390075Sobrien	  pedwarn ("ISO C forbids qualified function types");
456418334Speter
456552284Sobrien	/* GNU C interprets a `volatile void' return type to indicate
456652284Sobrien	   that the function does not return.  */
456752284Sobrien	if ((type_quals & TYPE_QUAL_VOLATILE)
456890075Sobrien	    && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
456918334Speter	  warning ("`noreturn' function returns non-void value");
457018334Speter
457118334Speter	if (extern_ref)
457218334Speter	  DECL_EXTERNAL (decl) = 1;
457318334Speter	/* Record absence of global scope for `static' or `auto'.  */
457418334Speter	TREE_PUBLIC (decl)
457518334Speter	  = !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO)));
457618334Speter
457796263Sobrien	if (defaulted_int)
457896263Sobrien	  C_FUNCTION_IMPLICIT_INT (decl) = 1;
457996263Sobrien
458018334Speter	/* Record presence of `inline', if it is reasonable.  */
458190075Sobrien	if (MAIN_NAME_P (declarator))
458218334Speter	  {
458390075Sobrien	    if (inlinep)
458418334Speter	      warning ("cannot inline function `main'");
458590075Sobrien	  }
458690075Sobrien	else if (inlinep)
458790075Sobrien	  {
458890075Sobrien	    /* Assume that otherwise the function can be inlined.  */
458990075Sobrien	    DECL_DECLARED_INLINE_P (decl) = 1;
459018334Speter
459190075Sobrien	    /* Do not mark bare declarations as DECL_INLINE.  Doing so
459290075Sobrien	       in the presence of multiple declarations can result in
459390075Sobrien	       the abstract origin pointing between the declarations,
459490075Sobrien	       which will confuse dwarf2out.  */
459590075Sobrien	    if (initialized)
459690075Sobrien	      {
459790075Sobrien		DECL_INLINE (decl) = 1;
459890075Sobrien		if (specbits & (1 << (int) RID_EXTERN))
459990075Sobrien		  current_extern_inline = 1;
460090075Sobrien	      }
460118334Speter	  }
460290075Sobrien	/* If -finline-functions, assume it can be inlined.  This does
460390075Sobrien	   two things: let the function be deferred until it is actually
460490075Sobrien	   needed, and let dwarf2 know that the function is inlinable.  */
460590075Sobrien	else if (flag_inline_trees == 2 && initialized)
460690075Sobrien	  {
4607117421Skan	    if (!DECL_INLINE (decl))
4608117421Skan		DID_INLINE_FUNC (decl) = 1;
460990075Sobrien	    DECL_INLINE (decl) = 1;
461090075Sobrien	    DECL_DECLARED_INLINE_P (decl) = 0;
461190075Sobrien	  }
461218334Speter      }
461318334Speter    else
461418334Speter      {
461518334Speter	/* It's a variable.  */
461618334Speter	/* An uninitialized decl with `extern' is a reference.  */
461718334Speter	int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN));
461818334Speter
461918334Speter	/* Move type qualifiers down to element of an array.  */
462052284Sobrien	if (TREE_CODE (type) == ARRAY_TYPE && type_quals)
462118334Speter	  {
462290075Sobrien	    int saved_align = TYPE_ALIGN(type);
462352284Sobrien	    type = build_array_type (c_build_qualified_type (TREE_TYPE (type),
462452284Sobrien							     type_quals),
462518334Speter				     TYPE_DOMAIN (type));
462690075Sobrien	    TYPE_ALIGN (type) = saved_align;
462718334Speter#if 0 /* Leave the variable const or volatile as well.  */
462852284Sobrien	    type_quals = TYPE_UNQUALIFIED;
462918334Speter#endif
463018334Speter	  }
463190075Sobrien	else if (type_quals)
463290075Sobrien	  type = c_build_qualified_type (type, type_quals);
463390075Sobrien
463418334Speter	decl = build_decl (VAR_DECL, declarator, type);
463518334Speter	if (size_varies)
463618334Speter	  C_DECL_VARIABLE_SIZE (decl) = 1;
463718334Speter
463818334Speter	if (inlinep)
463918334Speter	  pedwarn_with_decl (decl, "variable `%s' declared `inline'");
464018334Speter
464118334Speter	DECL_EXTERNAL (decl) = extern_ref;
4642117421Skan
464318334Speter	/* At top level, the presence of a `static' or `register' storage
464418334Speter	   class specifier, or the absence of all storage class specifiers
464518334Speter	   makes this declaration a definition (perhaps tentative).  Also,
464618334Speter	   the absence of both `static' and `register' makes it public.  */
464718334Speter	if (current_binding_level == global_binding_level)
464818334Speter	  {
4649117421Skan	    TREE_PUBLIC (decl) = !(specbits & ((1 << (int) RID_STATIC)
4650117421Skan					       | (1 << (int) RID_REGISTER)));
4651117421Skan	    TREE_STATIC (decl) = !extern_ref;
465218334Speter	  }
465318334Speter	/* Not at top level, only `static' makes a static definition.  */
465418334Speter	else
465518334Speter	  {
465618334Speter	    TREE_STATIC (decl) = (specbits & (1 << (int) RID_STATIC)) != 0;
4657117421Skan	    TREE_PUBLIC (decl) = extern_ref;
465818334Speter	  }
4659117421Skan
4660117421Skan	if (specbits & 1 << (int) RID_THREAD)
4661117421Skan	  {
4662117421Skan	    if (targetm.have_tls)
4663117421Skan	      DECL_THREAD_LOCAL (decl) = 1;
4664117421Skan	    else
4665117421Skan	      /* A mere warning is sure to result in improper semantics
4666117421Skan		 at runtime.  Don't bother to allow this to compile.  */
4667117421Skan	      error ("thread-local storage not supported for this target");
4668117421Skan	  }
466918334Speter      }
467018334Speter
467118334Speter    /* Record `register' declaration for warnings on &
467218334Speter       and in case doing stupid register allocation.  */
467318334Speter
467418334Speter    if (specbits & (1 << (int) RID_REGISTER))
467518334Speter      DECL_REGISTER (decl) = 1;
467618334Speter
467718334Speter    /* Record constancy and volatility.  */
467852284Sobrien    c_apply_type_quals_to_decl (type_quals, decl);
467918334Speter
468018334Speter    /* If a type has volatile components, it should be stored in memory.
468118334Speter       Otherwise, the fact that those components are volatile
468218334Speter       will be ignored, and would even crash the compiler.  */
468318334Speter    if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl)))
4684117421Skan      c_mark_addressable (decl);
468518334Speter
468690075Sobrien    decl_attributes (&decl, returned_attrs, 0);
468718334Speter
468818334Speter    return decl;
468918334Speter  }
469018334Speter}
469118334Speter
469218334Speter/* Decode the parameter-list info for a function type or function definition.
469318334Speter   The argument is the value returned by `get_parm_info' (or made in parse.y
469418334Speter   if there is an identifier list instead of a parameter decl list).
469518334Speter   These two functions are separate because when a function returns
469618334Speter   or receives functions then each is called multiple times but the order
469718334Speter   of calls is different.  The last call to `grokparms' is always the one
469818334Speter   that contains the formal parameter names of a function definition.
469918334Speter
470018334Speter   Store in `last_function_parms' a chain of the decls of parms.
470118334Speter   Also store in `last_function_parm_tags' a chain of the struct, union,
470218334Speter   and enum tags declared among the parms.
470318334Speter
470418334Speter   Return a list of arg types to use in the FUNCTION_TYPE for this function.
470518334Speter
470618334Speter   FUNCDEF_FLAG is nonzero for a function definition, 0 for
470718334Speter   a mere declaration.  A nonempty identifier-list gets an error message
470818334Speter   when FUNCDEF_FLAG is zero.  */
470918334Speter
471018334Speterstatic tree
471118334Spetergrokparms (parms_info, funcdef_flag)
471218334Speter     tree parms_info;
471318334Speter     int funcdef_flag;
471418334Speter{
471518334Speter  tree first_parm = TREE_CHAIN (parms_info);
471618334Speter
471718334Speter  last_function_parms = TREE_PURPOSE (parms_info);
471818334Speter  last_function_parm_tags = TREE_VALUE (parms_info);
471918334Speter
472018334Speter  if (warn_strict_prototypes && first_parm == 0 && !funcdef_flag
472118334Speter      && !in_system_header)
472218334Speter    warning ("function declaration isn't a prototype");
472318334Speter
472418334Speter  if (first_parm != 0
472518334Speter      && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE)
472618334Speter    {
472718334Speter      if (! funcdef_flag)
472818334Speter	pedwarn ("parameter names (without types) in function declaration");
472918334Speter
473018334Speter      last_function_parms = first_parm;
473118334Speter      return 0;
473218334Speter    }
473318334Speter  else
473418334Speter    {
473518334Speter      tree parm;
473618334Speter      tree typelt;
473718334Speter      /* We no longer test FUNCDEF_FLAG.
473818334Speter	 If the arg types are incomplete in a declaration,
473918334Speter	 they must include undefined tags.
474018334Speter	 These tags can never be defined in the scope of the declaration,
474118334Speter	 so the types can never be completed,
474218334Speter	 and no call can be compiled successfully.  */
474318334Speter#if 0
474418334Speter      /* In a fcn definition, arg types must be complete.  */
474518334Speter      if (funcdef_flag)
474618334Speter#endif
474718334Speter	for (parm = last_function_parms, typelt = first_parm;
474818334Speter	     parm;
474918334Speter	     parm = TREE_CHAIN (parm))
475018334Speter	  /* Skip over any enumeration constants declared here.  */
475118334Speter	  if (TREE_CODE (parm) == PARM_DECL)
475218334Speter	    {
475318334Speter	      /* Barf if the parameter itself has an incomplete type.  */
475418334Speter	      tree type = TREE_VALUE (typelt);
475590075Sobrien	      if (type == error_mark_node)
475690075Sobrien		continue;
475790075Sobrien	      if (!COMPLETE_TYPE_P (type))
475818334Speter		{
475918334Speter		  if (funcdef_flag && DECL_NAME (parm) != 0)
476018334Speter		    error ("parameter `%s' has incomplete type",
476118334Speter			   IDENTIFIER_POINTER (DECL_NAME (parm)));
476218334Speter		  else
476318334Speter		    warning ("parameter has incomplete type");
476418334Speter		  if (funcdef_flag)
476518334Speter		    {
476618334Speter		      TREE_VALUE (typelt) = error_mark_node;
476718334Speter		      TREE_TYPE (parm) = error_mark_node;
476818334Speter		    }
476918334Speter		}
477090075Sobrien#if 0
477190075Sobrien	      /* This has been replaced by parm_tags_warning, which
477290075Sobrien		 uses a more accurate criterion for what to warn
477390075Sobrien		 about.  */
477418334Speter	      else
477518334Speter		{
477618334Speter		  /* Now warn if is a pointer to an incomplete type.  */
477718334Speter		  while (TREE_CODE (type) == POINTER_TYPE
477818334Speter			 || TREE_CODE (type) == REFERENCE_TYPE)
477918334Speter		    type = TREE_TYPE (type);
478018334Speter		  type = TYPE_MAIN_VARIANT (type);
478190075Sobrien		  if (!COMPLETE_TYPE_P (type))
478218334Speter		    {
478318334Speter		      if (DECL_NAME (parm) != 0)
478418334Speter			warning ("parameter `%s' points to incomplete type",
478518334Speter				 IDENTIFIER_POINTER (DECL_NAME (parm)));
478618334Speter		      else
478718334Speter			warning ("parameter points to incomplete type");
478818334Speter		    }
478918334Speter		}
479018334Speter#endif
479118334Speter	      typelt = TREE_CHAIN (typelt);
479218334Speter	    }
479318334Speter
479490075Sobrien      return first_parm;
479518334Speter    }
479618334Speter}
479718334Speter
479818334Speter/* Return a tree_list node with info on a parameter list just parsed.
479918334Speter   The TREE_PURPOSE is a chain of decls of those parms.
480018334Speter   The TREE_VALUE is a list of structure, union and enum tags defined.
480118334Speter   The TREE_CHAIN is a list of argument types to go in the FUNCTION_TYPE.
480218334Speter   This tree_list node is later fed to `grokparms'.
480318334Speter
480418334Speter   VOID_AT_END nonzero means append `void' to the end of the type-list.
480518334Speter   Zero means the parmlist ended with an ellipsis so don't append `void'.  */
480618334Speter
480718334Spetertree
480818334Speterget_parm_info (void_at_end)
480918334Speter     int void_at_end;
481018334Speter{
481190075Sobrien  tree decl, t;
481290075Sobrien  tree types = 0;
481318334Speter  int erred = 0;
481418334Speter  tree tags = gettags ();
481518334Speter  tree parms = getdecls ();
481618334Speter  tree new_parms = 0;
481718334Speter  tree order = current_binding_level->parm_order;
481818334Speter
481990075Sobrien  /* Just `void' (and no ellipsis) is special.  There are really no parms.
482090075Sobrien     But if the `void' is qualified (by `const' or `volatile') or has a
482190075Sobrien     storage class specifier (`register'), then the behavior is undefined;
482290075Sobrien     by not counting it as the special case of `void' we will cause an
482390075Sobrien     error later.  Typedefs for `void' are OK (see DR#157).  */
482418334Speter  if (void_at_end && parms != 0
482518334Speter      && TREE_CHAIN (parms) == 0
482690075Sobrien      && VOID_TYPE_P (TREE_TYPE (parms))
482790075Sobrien      && ! TREE_THIS_VOLATILE (parms)
482890075Sobrien      && ! TREE_READONLY (parms)
482990075Sobrien      && ! DECL_REGISTER (parms)
483018334Speter      && DECL_NAME (parms) == 0)
483118334Speter    {
483218334Speter      parms = NULL_TREE;
483318334Speter      storedecls (NULL_TREE);
483490075Sobrien      return tree_cons (NULL_TREE, NULL_TREE,
483590075Sobrien			tree_cons (NULL_TREE, void_type_node, NULL_TREE));
483618334Speter    }
483718334Speter
483818334Speter  /* Extract enumerator values and other non-parms declared with the parms.
483918334Speter     Likewise any forward parm decls that didn't have real parm decls.  */
484090075Sobrien  for (decl = parms; decl;)
484118334Speter    {
484218334Speter      tree next = TREE_CHAIN (decl);
484318334Speter
484418334Speter      if (TREE_CODE (decl) != PARM_DECL)
484518334Speter	{
484618334Speter	  TREE_CHAIN (decl) = new_parms;
484718334Speter	  new_parms = decl;
484818334Speter	}
484918334Speter      else if (TREE_ASM_WRITTEN (decl))
485018334Speter	{
485190075Sobrien	  error_with_decl (decl,
485290075Sobrien			   "parameter `%s' has just a forward declaration");
485318334Speter	  TREE_CHAIN (decl) = new_parms;
485418334Speter	  new_parms = decl;
485518334Speter	}
485618334Speter      decl = next;
485718334Speter    }
485818334Speter
485918334Speter  /* Put the parm decls back in the order they were in in the parm list.  */
486018334Speter  for (t = order; t; t = TREE_CHAIN (t))
486118334Speter    {
486218334Speter      if (TREE_CHAIN (t))
486318334Speter	TREE_CHAIN (TREE_VALUE (t)) = TREE_VALUE (TREE_CHAIN (t));
486418334Speter      else
486518334Speter	TREE_CHAIN (TREE_VALUE (t)) = 0;
486618334Speter    }
486718334Speter
486818334Speter  new_parms = chainon (order ? nreverse (TREE_VALUE (order)) : 0,
486918334Speter		       new_parms);
487018334Speter
487118334Speter  /* Store the parmlist in the binding level since the old one
487218334Speter     is no longer a valid list.  (We have changed the chain pointers.)  */
487318334Speter  storedecls (new_parms);
487418334Speter
487518334Speter  for (decl = new_parms; decl; decl = TREE_CHAIN (decl))
487618334Speter    /* There may also be declarations for enumerators if an enumeration
487718334Speter       type is declared among the parms.  Ignore them here.  */
487818334Speter    if (TREE_CODE (decl) == PARM_DECL)
487918334Speter      {
488018334Speter	/* Since there is a prototype,
488118334Speter	   args are passed in their declared types.  */
488218334Speter	tree type = TREE_TYPE (decl);
488318334Speter	DECL_ARG_TYPE (decl) = type;
488490075Sobrien	if (PROMOTE_PROTOTYPES
488590075Sobrien	    && INTEGRAL_TYPE_P (type)
488618334Speter	    && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
488718334Speter	  DECL_ARG_TYPE (decl) = integer_type_node;
488818334Speter
488990075Sobrien	types = tree_cons (NULL_TREE, TREE_TYPE (decl), types);
489090075Sobrien	if (VOID_TYPE_P (TREE_VALUE (types)) && ! erred
489118334Speter	    && DECL_NAME (decl) == 0)
489218334Speter	  {
489318334Speter	    error ("`void' in parameter list must be the entire list");
489418334Speter	    erred = 1;
489518334Speter	  }
489618334Speter      }
489718334Speter
489818334Speter  if (void_at_end)
489990075Sobrien    return tree_cons (new_parms, tags,
490090075Sobrien		      nreverse (tree_cons (NULL_TREE, void_type_node, types)));
490118334Speter
490290075Sobrien  return tree_cons (new_parms, tags, nreverse (types));
490318334Speter}
490418334Speter
490518334Speter/* At end of parameter list, warn about any struct, union or enum tags
490618334Speter   defined within.  Do so because these types cannot ever become complete.  */
490718334Speter
490818334Spetervoid
490918334Speterparmlist_tags_warning ()
491018334Speter{
491118334Speter  tree elt;
491218334Speter  static int already;
491318334Speter
491418334Speter  for (elt = current_binding_level->tags; elt; elt = TREE_CHAIN (elt))
491518334Speter    {
491618334Speter      enum tree_code code = TREE_CODE (TREE_VALUE (elt));
491718334Speter      /* An anonymous union parm type is meaningful as a GNU extension.
491818334Speter	 So don't warn for that.  */
491950397Sobrien      if (code == UNION_TYPE && TREE_PURPOSE (elt) == 0 && !pedantic)
492018334Speter	continue;
492118334Speter      if (TREE_PURPOSE (elt) != 0)
492290075Sobrien        {
492390075Sobrien          if (code == RECORD_TYPE)
492490075Sobrien            warning ("`struct %s' declared inside parameter list",
492590075Sobrien                     IDENTIFIER_POINTER (TREE_PURPOSE (elt)));
492690075Sobrien          else if (code == UNION_TYPE)
492790075Sobrien            warning ("`union %s' declared inside parameter list",
492890075Sobrien                     IDENTIFIER_POINTER (TREE_PURPOSE (elt)));
492990075Sobrien          else
493090075Sobrien            warning ("`enum %s' declared inside parameter list",
493190075Sobrien                     IDENTIFIER_POINTER (TREE_PURPOSE (elt)));
493290075Sobrien        }
493318334Speter      else
493490075Sobrien	{
493590075Sobrien	  /* For translation these need to be separate warnings */
493690075Sobrien	  if (code == RECORD_TYPE)
493790075Sobrien	    warning ("anonymous struct declared inside parameter list");
493890075Sobrien	  else if (code == UNION_TYPE)
493990075Sobrien	    warning ("anonymous union declared inside parameter list");
494090075Sobrien	  else
494190075Sobrien	    warning ("anonymous enum declared inside parameter list");
494290075Sobrien	}
494318334Speter      if (! already)
494418334Speter	{
494590075Sobrien	  warning ("its scope is only this definition or declaration, which is probably not what you want");
494618334Speter	  already = 1;
494718334Speter	}
494818334Speter    }
494918334Speter}
495018334Speter
495118334Speter/* Get the struct, enum or union (CODE says which) with tag NAME.
495218334Speter   Define the tag as a forward-reference if it is not defined.  */
495318334Speter
495418334Spetertree
495518334Speterxref_tag (code, name)
495618334Speter     enum tree_code code;
495718334Speter     tree name;
495818334Speter{
495918334Speter  /* If a cross reference is requested, look up the type
496018334Speter     already defined for this tag and return it.  */
496118334Speter
496290075Sobrien  tree ref = lookup_tag (code, name, current_binding_level, 0);
496390075Sobrien  /* If this is the right type of tag, return what we found.
496490075Sobrien     (This reference will be shadowed by shadow_tag later if appropriate.)
496590075Sobrien     If this is the wrong type of tag, do not return it.  If it was the
496690075Sobrien     wrong type in the same binding level, we will have had an error
496790075Sobrien     message already; if in a different binding level and declaring
496890075Sobrien     a name, pending_xref_error will give an error message; but if in a
496990075Sobrien     different binding level and not declaring a name, this tag should
497090075Sobrien     shadow the previous declaration of a different type of tag, and
497190075Sobrien     this would not work properly if we return the reference found.
497290075Sobrien     (For example, with "struct foo" in an outer scope, "union foo;"
497390075Sobrien     must shadow that tag with a new one of union type.)  */
497490075Sobrien  if (ref && TREE_CODE (ref) == code)
497518334Speter    return ref;
497618334Speter
497718334Speter  /* If no such tag is yet defined, create a forward-reference node
497818334Speter     and record it as the "definition".
497918334Speter     When a real declaration of this type is found,
498018334Speter     the forward-reference will be altered into a real type.  */
498118334Speter
498218334Speter  ref = make_node (code);
498318334Speter  if (code == ENUMERAL_TYPE)
498418334Speter    {
498518334Speter      /* Give the type a default layout like unsigned int
498618334Speter	 to avoid crashing if it does not get defined.  */
498718334Speter      TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
498818334Speter      TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
498990075Sobrien      TYPE_USER_ALIGN (ref) = 0;
499018334Speter      TREE_UNSIGNED (ref) = 1;
499118334Speter      TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
499218334Speter      TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
499318334Speter      TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
499418334Speter    }
499518334Speter
499618334Speter  pushtag (name, ref);
499718334Speter
499818334Speter  return ref;
499918334Speter}
500018334Speter
500118334Speter/* Make sure that the tag NAME is defined *in the current binding level*
500218334Speter   at least as a forward reference.
500390075Sobrien   CODE says which kind of tag NAME ought to be.  */
500418334Speter
500518334Spetertree
500618334Speterstart_struct (code, name)
500718334Speter     enum tree_code code;
500818334Speter     tree name;
500918334Speter{
501018334Speter  /* If there is already a tag defined at this binding level
501118334Speter     (as a forward reference), just return it.  */
501218334Speter
501390075Sobrien  tree ref = 0;
501418334Speter
501518334Speter  if (name != 0)
501618334Speter    ref = lookup_tag (code, name, current_binding_level, 1);
501718334Speter  if (ref && TREE_CODE (ref) == code)
501818334Speter    {
501918334Speter      if (TYPE_FIELDS (ref))
502090075Sobrien        {
502190075Sobrien	  if (code == UNION_TYPE)
5022117421Skan	    error ("redefinition of `union %s'", IDENTIFIER_POINTER (name));
502390075Sobrien          else
5024117421Skan	    error ("redefinition of `struct %s'", IDENTIFIER_POINTER (name));
502590075Sobrien	}
5026117421Skan    }
5027117421Skan  else
5028117421Skan    {
5029117421Skan      /* Otherwise create a forward-reference just so the tag is in scope.  */
503018334Speter
5031117421Skan      ref = make_node (code);
5032117421Skan      pushtag (name, ref);
503318334Speter    }
5034117421Skan
503518334Speter  C_TYPE_BEING_DEFINED (ref) = 1;
503650397Sobrien  TYPE_PACKED (ref) = flag_pack_struct;
503718334Speter  return ref;
503818334Speter}
503918334Speter
504018334Speter/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
504118334Speter   of a structure component, returning a FIELD_DECL node.
504296263Sobrien   WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.
504318334Speter
504418334Speter   This is done during the parsing of the struct declaration.
504518334Speter   The FIELD_DECL nodes are chained together and the lot of them
504618334Speter   are ultimately passed to `build_struct' to make the RECORD_TYPE node.  */
504718334Speter
504818334Spetertree
504918334Spetergrokfield (filename, line, declarator, declspecs, width)
505052284Sobrien     const char *filename ATTRIBUTE_UNUSED;
505152284Sobrien     int line ATTRIBUTE_UNUSED;
505218334Speter     tree declarator, declspecs, width;
505318334Speter{
505418334Speter  tree value;
505518334Speter
505690075Sobrien  if (declarator == NULL_TREE && width == NULL_TREE)
505790075Sobrien    {
5058117421Skan      /* This is an unnamed decl.
5059117421Skan
5060117421Skan	 If we have something of the form "union { list } ;" then this
5061117421Skan	 is the anonymous union extension.  Similarly for struct.
5062117421Skan
5063117421Skan	 If this is something of the form "struct foo;", then
5064117421Skan	   If MS extensions are enabled, this is handled as an
5065117421Skan	     anonymous struct.
5066117421Skan	   Otherwise this is a forward declaration of a structure tag.
5067117421Skan
5068117421Skan	 If this is something of the form "foo;" and foo is a TYPE_DECL, then
5069117421Skan	   If MS extensions are enabled and foo names a structure, then
5070117421Skan	     again this is an anonymous struct.
5071117421Skan	   Otherwise this is an error.
5072117421Skan
5073117421Skan	 Oh what a horrid tangled web we weave.  I wonder if MS consiously
5074117421Skan	 took this from Plan 9 or if it was an accident of implementation
5075117421Skan	 that took root before someone noticed the bug...  */
5076117421Skan
5077102790Skan      tree type = TREE_VALUE (declspecs);
5078102790Skan
5079117421Skan      if (flag_ms_extensions && TREE_CODE (type) == TYPE_DECL)
5080102790Skan	type = TREE_TYPE (type);
5081117421Skan      if (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE)
508290075Sobrien	{
5083117421Skan	  if (flag_ms_extensions)
5084117421Skan	    ; /* ok */
5085117421Skan	  else if (flag_iso)
5086117421Skan	    goto warn_unnamed_field;
5087117421Skan	  else if (TYPE_NAME (type) == NULL)
5088117421Skan	    ; /* ok */
5089117421Skan	  else
5090117421Skan	    goto warn_unnamed_field;
5091117421Skan	}
5092117421Skan      else
5093117421Skan	{
5094117421Skan	warn_unnamed_field:
5095117421Skan	  warning ("declaration does not declare anything");
509690075Sobrien	  return NULL_TREE;
509790075Sobrien	}
509890075Sobrien    }
509918334Speter
510096263Sobrien  value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0);
510118334Speter
510218334Speter  finish_decl (value, NULL_TREE, NULL_TREE);
510396263Sobrien  DECL_INITIAL (value) = width;
510418334Speter
5105117421Skan  if (flag_objc)
5106117421Skan    objc_check_decl (value);
510718334Speter  return value;
510818334Speter}
510918334Speter
511018334Speter/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T.
511118334Speter   FIELDLIST is a chain of FIELD_DECL nodes for the fields.
511290075Sobrien   ATTRIBUTES are attributes to be applied to the structure.  */
511318334Speter
511418334Spetertree
511518334Speterfinish_struct (t, fieldlist, attributes)
511618334Speter     tree t;
511718334Speter     tree fieldlist;
511818334Speter     tree attributes;
511918334Speter{
512090075Sobrien  tree x;
512118334Speter  int toplevel = global_binding_level == current_binding_level;
512290075Sobrien  int saw_named_field;
512318334Speter
512418334Speter  /* If this type was previously laid out as a forward reference,
512518334Speter     make sure we lay it out again.  */
512618334Speter
512718334Speter  TYPE_SIZE (t) = 0;
512818334Speter
512990075Sobrien  decl_attributes (&t, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
513018334Speter
513118334Speter  /* Nameless union parm types are useful as GCC extension.  */
513218334Speter  if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic)
513318334Speter    /* Otherwise, warn about any struct or union def. in parmlist.  */
513418334Speter    if (in_parm_level_p ())
513518334Speter      {
513618334Speter	if (pedantic)
513790075Sobrien	  pedwarn ("%s defined inside parms",
513890075Sobrien		   TREE_CODE (t) == UNION_TYPE ? _("union") : _("structure"));
5139117421Skan	else
514090075Sobrien	  warning ("%s defined inside parms",
514190075Sobrien		   TREE_CODE (t) == UNION_TYPE ? _("union") : _("structure"));
514218334Speter      }
514318334Speter
514450397Sobrien  if (pedantic)
514550397Sobrien    {
514650397Sobrien      for (x = fieldlist; x; x = TREE_CHAIN (x))
514750397Sobrien	if (DECL_NAME (x) != 0)
514850397Sobrien	  break;
514918334Speter
515050397Sobrien      if (x == 0)
515190075Sobrien	pedwarn ("%s has no %s",
515290075Sobrien		 TREE_CODE (t) == UNION_TYPE ? _("union") : _("struct"),
515390075Sobrien		 fieldlist ? _("named members") : _("members"));
515450397Sobrien    }
515550397Sobrien
515696263Sobrien  /* Install struct as DECL_CONTEXT of each field decl.
515796263Sobrien     Also process specified field sizes,m which is found in the DECL_INITIAL.
515896263Sobrien     Store 0 there, except for ": 0" fields (so we can find them
515996263Sobrien     and delete them, below).  */
516018334Speter
516190075Sobrien  saw_named_field = 0;
516218334Speter  for (x = fieldlist; x; x = TREE_CHAIN (x))
516318334Speter    {
516418334Speter      DECL_CONTEXT (x) = t;
516518334Speter      DECL_PACKED (x) |= TYPE_PACKED (t);
516618334Speter
516718334Speter      /* If any field is const, the structure type is pseudo-const.  */
516818334Speter      if (TREE_READONLY (x))
516918334Speter	C_TYPE_FIELDS_READONLY (t) = 1;
517018334Speter      else
517118334Speter	{
517218334Speter	  /* A field that is pseudo-const makes the structure likewise.  */
517318334Speter	  tree t1 = TREE_TYPE (x);
517418334Speter	  while (TREE_CODE (t1) == ARRAY_TYPE)
517518334Speter	    t1 = TREE_TYPE (t1);
517618334Speter	  if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE)
517718334Speter	      && C_TYPE_FIELDS_READONLY (t1))
517818334Speter	    C_TYPE_FIELDS_READONLY (t) = 1;
517918334Speter	}
518018334Speter
518118334Speter      /* Any field that is volatile means variables of this type must be
518218334Speter	 treated in some ways as volatile.  */
518318334Speter      if (TREE_THIS_VOLATILE (x))
518418334Speter	C_TYPE_FIELDS_VOLATILE (t) = 1;
518518334Speter
518618334Speter      /* Any field of nominal variable size implies structure is too.  */
518718334Speter      if (C_DECL_VARIABLE_SIZE (x))
518818334Speter	C_TYPE_VARIABLE_SIZE (t) = 1;
518918334Speter
519018334Speter      /* Detect invalid nested redefinition.  */
519118334Speter      if (TREE_TYPE (x) == t)
519218334Speter	error ("nested redefinition of `%s'",
519318334Speter	       IDENTIFIER_POINTER (TYPE_NAME (t)));
519418334Speter
519596263Sobrien      /* Detect invalid bit-field size.  */
519696263Sobrien      if (DECL_INITIAL (x))
519796263Sobrien	STRIP_NOPS (DECL_INITIAL (x));
519896263Sobrien      if (DECL_INITIAL (x))
519918334Speter	{
520096263Sobrien	  if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST)
520196263Sobrien	    constant_expression_warning (DECL_INITIAL (x));
520296263Sobrien	  else
520396263Sobrien	    {
520496263Sobrien	      error_with_decl (x,
520596263Sobrien			       "bit-field `%s' width not an integer constant");
520696263Sobrien	      DECL_INITIAL (x) = NULL;
520796263Sobrien	    }
520896263Sobrien	}
520996263Sobrien
521096263Sobrien      /* Detect invalid bit-field type.  */
521196263Sobrien      if (DECL_INITIAL (x)
521296263Sobrien	  && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE
521396263Sobrien	  && TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE
521496263Sobrien	  && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE)
521596263Sobrien	{
521696263Sobrien	  error_with_decl (x, "bit-field `%s' has invalid type");
521796263Sobrien	  DECL_INITIAL (x) = NULL;
521896263Sobrien	}
521996263Sobrien
522096263Sobrien      if (DECL_INITIAL (x) && pedantic
522196263Sobrien	  && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node
522296263Sobrien	  && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node
522396263Sobrien	  && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != c_bool_type_node
522496263Sobrien	  /* Accept an enum that's equivalent to int or unsigned int.  */
522596263Sobrien	  && !(TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
522696263Sobrien	       && (TYPE_PRECISION (TREE_TYPE (x))
522796263Sobrien		   == TYPE_PRECISION (integer_type_node))))
522896263Sobrien	pedwarn_with_decl (x, "bit-field `%s' type invalid in ISO C");
522996263Sobrien
523096263Sobrien      /* Detect and ignore out of range field width and process valid
523196263Sobrien	 field widths.  */
523296263Sobrien      if (DECL_INITIAL (x))
523396263Sobrien	{
523496263Sobrien	  int max_width
523596263Sobrien	    = (TYPE_MAIN_VARIANT (TREE_TYPE (x)) == c_bool_type_node
523696263Sobrien	       ? CHAR_TYPE_SIZE : TYPE_PRECISION (TREE_TYPE (x)));
523796263Sobrien
523896263Sobrien	  if (tree_int_cst_sgn (DECL_INITIAL (x)) < 0)
523996263Sobrien	    error_with_decl (x, "negative width in bit-field `%s'");
524096263Sobrien	  else if (0 < compare_tree_int (DECL_INITIAL (x), max_width))
524196263Sobrien	    pedwarn_with_decl (x, "width of `%s' exceeds its type");
524296263Sobrien	  else if (integer_zerop (DECL_INITIAL (x)) && DECL_NAME (x) != 0)
524396263Sobrien	    error_with_decl (x, "zero width for bit-field `%s'");
524496263Sobrien	  else
524596263Sobrien	    {
524696263Sobrien	      /* The test above has assured us that TREE_INT_CST_HIGH is 0.  */
524796263Sobrien	      unsigned HOST_WIDE_INT width
524896263Sobrien		= tree_low_cst (DECL_INITIAL (x), 1);
524996263Sobrien
525096263Sobrien	      if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
525196263Sobrien		  && (width < min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)),
525296263Sobrien					     TREE_UNSIGNED (TREE_TYPE (x)))
525396263Sobrien		      || (width
525496263Sobrien			  < min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)),
525596263Sobrien					   TREE_UNSIGNED (TREE_TYPE (x))))))
525696263Sobrien		warning_with_decl (x,
525796263Sobrien				   "`%s' is narrower than values of its type");
525896263Sobrien
525996263Sobrien	      DECL_SIZE (x) = bitsize_int (width);
526096263Sobrien	      DECL_BIT_FIELD (x) = 1;
526196263Sobrien	      SET_DECL_C_BIT_FIELD (x);
526296263Sobrien
526396263Sobrien	      if (width == 0
526496263Sobrien		  && ! (* targetm.ms_bitfield_layout_p) (t))
526596263Sobrien		{
526696263Sobrien		  /* field size 0 => force desired amount of alignment.  */
526796263Sobrien#ifdef EMPTY_FIELD_BOUNDARY
526896263Sobrien		  DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY);
526996263Sobrien#endif
527096263Sobrien#ifdef PCC_BITFIELD_TYPE_MATTERS
527196263Sobrien		  if (PCC_BITFIELD_TYPE_MATTERS)
527296263Sobrien		    {
527396263Sobrien		      DECL_ALIGN (x) = MAX (DECL_ALIGN (x),
527496263Sobrien					    TYPE_ALIGN (TREE_TYPE (x)));
527596263Sobrien		      DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x));
527696263Sobrien		    }
527796263Sobrien#endif
527896263Sobrien		}
527996263Sobrien	    }
528096263Sobrien	}
528196263Sobrien
528296263Sobrien      DECL_INITIAL (x) = 0;
528396263Sobrien
528490075Sobrien      /* Detect flexible array member in an invalid context.  */
528590075Sobrien      if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
528690075Sobrien	  && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
528790075Sobrien	  && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
528890075Sobrien	  && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
528918334Speter	{
529090075Sobrien	  if (TREE_CODE (t) == UNION_TYPE)
529190075Sobrien	    error_with_decl (x, "flexible array member in union");
529290075Sobrien	  else if (TREE_CHAIN (x) != NULL_TREE)
529390075Sobrien	    error_with_decl (x, "flexible array member not at end of struct");
529490075Sobrien	  else if (! saw_named_field)
529590075Sobrien	    error_with_decl (x, "flexible array member in otherwise empty struct");
529618334Speter	}
5297117421Skan
5298117421Skan      if (pedantic && TREE_CODE (t) == RECORD_TYPE
5299117421Skan	  && flexible_array_type_p (TREE_TYPE (x)))
5300117421Skan	pedwarn_with_decl (x, "invalid use of structure with flexible array member");
5301117421Skan
530290075Sobrien      if (DECL_NAME (x))
530390075Sobrien	saw_named_field = 1;
530418334Speter    }
530518334Speter
530618334Speter  /* Delete all duplicate fields from the fieldlist */
530718334Speter  for (x = fieldlist; x && TREE_CHAIN (x);)
530818334Speter    /* Anonymous fields aren't duplicates.  */
530918334Speter    if (DECL_NAME (TREE_CHAIN (x)) == 0)
531018334Speter      x = TREE_CHAIN (x);
531118334Speter    else
531218334Speter      {
531390075Sobrien	tree y = fieldlist;
531490075Sobrien
531518334Speter	while (1)
531618334Speter	  {
531718334Speter	    if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
531818334Speter	      break;
531918334Speter	    if (y == x)
532018334Speter	      break;
532118334Speter	    y = TREE_CHAIN (y);
532218334Speter	  }
532318334Speter	if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
532418334Speter	  {
532518334Speter	    error_with_decl (TREE_CHAIN (x), "duplicate member `%s'");
532618334Speter	    TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
532718334Speter	  }
532890075Sobrien	else
532990075Sobrien	  x = TREE_CHAIN (x);
533018334Speter      }
533118334Speter
533218334Speter  /* Now we have the nearly final fieldlist.  Record it,
533318334Speter     then lay out the structure or union (including the fields).  */
533418334Speter
533518334Speter  TYPE_FIELDS (t) = fieldlist;
533618334Speter
533718334Speter  layout_type (t);
533818334Speter
533990075Sobrien  /* Delete all zero-width bit-fields from the fieldlist */
534090075Sobrien  {
534190075Sobrien    tree *fieldlistp = &fieldlist;
534290075Sobrien    while (*fieldlistp)
534390075Sobrien      if (TREE_CODE (*fieldlistp) == FIELD_DECL && DECL_INITIAL (*fieldlistp))
534490075Sobrien	*fieldlistp = TREE_CHAIN (*fieldlistp);
534590075Sobrien      else
534690075Sobrien	fieldlistp = &TREE_CHAIN (*fieldlistp);
534790075Sobrien  }
534818334Speter
534990075Sobrien  /* Now we have the truly final field list.
535090075Sobrien     Store it in this type and in the variants.  */
535118334Speter
535218334Speter  TYPE_FIELDS (t) = fieldlist;
535318334Speter
535418334Speter  for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
535518334Speter    {
535618334Speter      TYPE_FIELDS (x) = TYPE_FIELDS (t);
535718334Speter      TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
535818334Speter      TYPE_ALIGN (x) = TYPE_ALIGN (t);
535990075Sobrien      TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (t);
536018334Speter    }
536118334Speter
536218334Speter  /* If this was supposed to be a transparent union, but we can't
536318334Speter     make it one, warn and turn off the flag.  */
536418334Speter  if (TREE_CODE (t) == UNION_TYPE
536518334Speter      && TYPE_TRANSPARENT_UNION (t)
536618334Speter      && TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t)))
536718334Speter    {
536818334Speter      TYPE_TRANSPARENT_UNION (t) = 0;
536950397Sobrien      warning ("union cannot be made transparent");
537018334Speter    }
537118334Speter
537218334Speter  /* If this structure or union completes the type of any previous
537318334Speter     variable declaration, lay it out and output its rtl.  */
537418334Speter
5375117421Skan  if (current_binding_level->incomplete_list != NULL_TREE)
537618334Speter    {
5377117421Skan      tree prev = NULL_TREE;
5378117421Skan
5379117421Skan      for (x = current_binding_level->incomplete_list; x; x = TREE_CHAIN (x))
5380117421Skan        {
5381117421Skan	  tree decl = TREE_VALUE (x);
5382117421Skan
538390075Sobrien	  if (TYPE_MAIN_VARIANT (TREE_TYPE (decl)) == TYPE_MAIN_VARIANT (t)
538418334Speter	      && TREE_CODE (decl) != TYPE_DECL)
538518334Speter	    {
538618334Speter	      layout_decl (decl, 0);
5387117421Skan	      /* This is a no-op in c-lang.c or something real in objc-act.c.  */
5388117421Skan	      if (flag_objc)
5389117421Skan		objc_check_decl (decl);
539090075Sobrien	      rest_of_decl_compilation (decl, NULL, toplevel, 0);
539118334Speter	      if (! toplevel)
539218334Speter		expand_decl (decl);
5393117421Skan	      /* Unlink X from the incomplete list.  */
5394117421Skan	      if (prev)
5395117421Skan		TREE_CHAIN (prev) = TREE_CHAIN (x);
5396117421Skan	      else
5397117421Skan	        current_binding_level->incomplete_list = TREE_CHAIN (x);
539818334Speter	    }
539990075Sobrien	  else if (!COMPLETE_TYPE_P (TREE_TYPE (decl))
540018334Speter		   && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
540118334Speter	    {
540218334Speter	      tree element = TREE_TYPE (decl);
540318334Speter	      while (TREE_CODE (element) == ARRAY_TYPE)
540418334Speter		element = TREE_TYPE (element);
540518334Speter	      if (element == t)
540690075Sobrien		{
540790075Sobrien		  layout_array_type (TREE_TYPE (decl));
540890075Sobrien		  if (TREE_CODE (decl) != TYPE_DECL)
540990075Sobrien		    {
541090075Sobrien		      layout_decl (decl, 0);
5411117421Skan		      if (flag_objc)
5412117421Skan			objc_check_decl (decl);
541390075Sobrien		      rest_of_decl_compilation (decl, NULL, toplevel, 0);
541490075Sobrien		      if (! toplevel)
541590075Sobrien			expand_decl (decl);
541690075Sobrien		    }
5417117421Skan		  /* Unlink X from the incomplete list.  */
5418117421Skan		  if (prev)
5419117421Skan		    TREE_CHAIN (prev) = TREE_CHAIN (x);
5420117421Skan		  else
5421117421Skan		    current_binding_level->incomplete_list = TREE_CHAIN (x);
542290075Sobrien		}
542318334Speter	    }
542418334Speter	}
542518334Speter    }
542618334Speter
542718334Speter  /* Finish debugging output for this type.  */
542818334Speter  rest_of_type_compilation (t, toplevel);
542918334Speter
543018334Speter  return t;
543118334Speter}
543218334Speter
543318334Speter/* Lay out the type T, and its element type, and so on.  */
543418334Speter
543518334Speterstatic void
543618334Speterlayout_array_type (t)
543718334Speter     tree t;
543818334Speter{
543918334Speter  if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
544018334Speter    layout_array_type (TREE_TYPE (t));
544118334Speter  layout_type (t);
544218334Speter}
544318334Speter
544418334Speter/* Begin compiling the definition of an enumeration type.
544518334Speter   NAME is its name (or null if anonymous).
544618334Speter   Returns the type object, as yet incomplete.
544718334Speter   Also records info about it so that build_enumerator
544818334Speter   may be used to declare the individual values as they are read.  */
544918334Speter
545018334Spetertree
545118334Speterstart_enum (name)
545218334Speter     tree name;
545318334Speter{
545490075Sobrien  tree enumtype = 0;
545518334Speter
545618334Speter  /* If this is the real definition for a previous forward reference,
545718334Speter     fill in the contents in the same object that used to be the
545818334Speter     forward reference.  */
545918334Speter
546018334Speter  if (name != 0)
546118334Speter    enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1);
546218334Speter
546318334Speter  if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE)
546418334Speter    {
546518334Speter      enumtype = make_node (ENUMERAL_TYPE);
546618334Speter      pushtag (name, enumtype);
546718334Speter    }
546818334Speter
546918334Speter  C_TYPE_BEING_DEFINED (enumtype) = 1;
547018334Speter
547118334Speter  if (TYPE_VALUES (enumtype) != 0)
547218334Speter    {
547318334Speter      /* This enum is a named one that has been declared already.  */
547418334Speter      error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name));
547518334Speter
547618334Speter      /* Completely replace its old definition.
547718334Speter	 The old enumerators remain defined, however.  */
547818334Speter      TYPE_VALUES (enumtype) = 0;
547918334Speter    }
548018334Speter
548118334Speter  enum_next_value = integer_zero_node;
548218334Speter  enum_overflow = 0;
548318334Speter
548450397Sobrien  if (flag_short_enums)
548550397Sobrien    TYPE_PACKED (enumtype) = 1;
548650397Sobrien
548718334Speter  return enumtype;
548818334Speter}
548918334Speter
549018334Speter/* After processing and defining all the values of an enumeration type,
549118334Speter   install their decls in the enumeration type and finish it off.
549218334Speter   ENUMTYPE is the type object, VALUES a list of decl-value pairs,
549318334Speter   and ATTRIBUTES are the specified attributes.
549418334Speter   Returns ENUMTYPE.  */
549518334Speter
549618334Spetertree
549718334Speterfinish_enum (enumtype, values, attributes)
549818334Speter     tree enumtype;
549918334Speter     tree values;
550018334Speter     tree attributes;
550118334Speter{
550290075Sobrien  tree pair, tem;
550390075Sobrien  tree minnode = 0, maxnode = 0, enum_value_type;
550490075Sobrien  int precision, unsign;
550590075Sobrien  int toplevel = (global_binding_level == current_binding_level);
550618334Speter
550718334Speter  if (in_parm_level_p ())
550818334Speter    warning ("enum defined inside parms");
550918334Speter
551090075Sobrien  decl_attributes (&enumtype, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
551118334Speter
551218334Speter  /* Calculate the maximum value of any enumerator in this type.  */
551318334Speter
551418334Speter  if (values == error_mark_node)
551518334Speter    minnode = maxnode = integer_zero_node;
551618334Speter  else
551790075Sobrien    {
551890075Sobrien      minnode = maxnode = TREE_VALUE (values);
551990075Sobrien      for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair))
552090075Sobrien	{
552190075Sobrien	  tree value = TREE_VALUE (pair);
552290075Sobrien	  if (tree_int_cst_lt (maxnode, value))
552390075Sobrien	    maxnode = value;
552490075Sobrien	  if (tree_int_cst_lt (value, minnode))
552590075Sobrien	    minnode = value;
552690075Sobrien	}
552790075Sobrien    }
552818334Speter
552990075Sobrien  /* Construct the final type of this enumeration.  It is the same
553090075Sobrien     as one of the integral types - the narrowest one that fits, except
553190075Sobrien     that normally we only go as narrow as int - and signed iff any of
553290075Sobrien     the values are negative.  */
553390075Sobrien  unsign = (tree_int_cst_sgn (minnode) >= 0);
553490075Sobrien  precision = MAX (min_precision (minnode, unsign),
553590075Sobrien		   min_precision (maxnode, unsign));
553650397Sobrien  if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
553750397Sobrien    {
5538117421Skan      tree narrowest = c_common_type_for_size (precision, unsign);
553950397Sobrien      if (narrowest == 0)
554050397Sobrien	{
554150397Sobrien	  warning ("enumeration values exceed range of largest integer");
554250397Sobrien	  narrowest = long_long_integer_type_node;
554350397Sobrien	}
554450397Sobrien
554590075Sobrien      precision = TYPE_PRECISION (narrowest);
554650397Sobrien    }
554718334Speter  else
554890075Sobrien    precision = TYPE_PRECISION (integer_type_node);
554918334Speter
555090075Sobrien  if (precision == TYPE_PRECISION (integer_type_node))
5551117421Skan    enum_value_type = c_common_type_for_size (precision, 0);
555290075Sobrien  else
555390075Sobrien    enum_value_type = enumtype;
555490075Sobrien
555590075Sobrien  TYPE_MIN_VALUE (enumtype) = minnode;
555690075Sobrien  TYPE_MAX_VALUE (enumtype) = maxnode;
555790075Sobrien  TYPE_PRECISION (enumtype) = precision;
555890075Sobrien  TREE_UNSIGNED (enumtype) = unsign;
555918334Speter  TYPE_SIZE (enumtype) = 0;
556018334Speter  layout_type (enumtype);
556118334Speter
556218334Speter  if (values != error_mark_node)
556318334Speter    {
556490075Sobrien      /* Change the type of the enumerators to be the enum type.  We
556590075Sobrien	 need to do this irrespective of the size of the enum, for
556690075Sobrien	 proper type checking.  Replace the DECL_INITIALs of the
556790075Sobrien	 enumerators, and the value slots of the list, with copies
556890075Sobrien	 that have the enum type; they cannot be modified in place
556990075Sobrien	 because they may be shared (e.g.  integer_zero_node) Finally,
557090075Sobrien	 change the purpose slots to point to the names of the decls.  */
557118334Speter      for (pair = values; pair; pair = TREE_CHAIN (pair))
557218334Speter	{
557390075Sobrien	  tree enu = TREE_PURPOSE (pair);
557490075Sobrien
557590075Sobrien	  TREE_TYPE (enu) = enumtype;
557690075Sobrien	  DECL_SIZE (enu) = TYPE_SIZE (enumtype);
557790075Sobrien	  DECL_SIZE_UNIT (enu) = TYPE_SIZE_UNIT (enumtype);
557890075Sobrien	  DECL_ALIGN (enu) = TYPE_ALIGN (enumtype);
557990075Sobrien	  DECL_USER_ALIGN (enu) = TYPE_USER_ALIGN (enumtype);
558090075Sobrien	  DECL_MODE (enu) = TYPE_MODE (enumtype);
558190075Sobrien
558290075Sobrien	  /* The ISO C Standard mandates enumerators to have type int,
558390075Sobrien	     even though the underlying type of an enum type is
558490075Sobrien	     unspecified.  Here we convert any enumerators that fit in
558590075Sobrien	     an int to type int, to avoid promotions to unsigned types
558690075Sobrien	     when comparing integers with enumerators that fit in the
558790075Sobrien	     int range.  When -pedantic is given, build_enumerator()
558890075Sobrien	     would have already taken care of those that don't fit.  */
558990075Sobrien	  if (int_fits_type_p (DECL_INITIAL (enu), enum_value_type))
559090075Sobrien	    DECL_INITIAL (enu) = convert (enum_value_type, DECL_INITIAL (enu));
559190075Sobrien	  else
559290075Sobrien	    DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu));
559390075Sobrien
559490075Sobrien	  TREE_PURPOSE (pair) = DECL_NAME (enu);
559590075Sobrien	  TREE_VALUE (pair) = DECL_INITIAL (enu);
559618334Speter	}
559718334Speter
559818334Speter      TYPE_VALUES (enumtype) = values;
559918334Speter    }
560018334Speter
560118334Speter  /* Fix up all variant types of this enum type.  */
560218334Speter  for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem))
560318334Speter    {
560490075Sobrien      if (tem == enumtype)
560590075Sobrien	continue;
560618334Speter      TYPE_VALUES (tem) = TYPE_VALUES (enumtype);
560718334Speter      TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype);
560818334Speter      TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype);
560918334Speter      TYPE_SIZE (tem) = TYPE_SIZE (enumtype);
561050397Sobrien      TYPE_SIZE_UNIT (tem) = TYPE_SIZE_UNIT (enumtype);
561118334Speter      TYPE_MODE (tem) = TYPE_MODE (enumtype);
561218334Speter      TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype);
561318334Speter      TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
561490075Sobrien      TYPE_USER_ALIGN (tem) = TYPE_USER_ALIGN (enumtype);
561518334Speter      TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype);
561618334Speter    }
561718334Speter
561818334Speter  /* Finish debugging output for this type.  */
561918334Speter  rest_of_type_compilation (enumtype, toplevel);
562018334Speter
562118334Speter  return enumtype;
562218334Speter}
562318334Speter
562418334Speter/* Build and install a CONST_DECL for one value of the
562518334Speter   current enumeration type (one that was begun with start_enum).
562618334Speter   Return a tree-list containing the CONST_DECL and its value.
562718334Speter   Assignment of sequential values by default is handled here.  */
562818334Speter
562918334Spetertree
563018334Speterbuild_enumerator (name, value)
563118334Speter     tree name, value;
563218334Speter{
563390075Sobrien  tree decl, type;
563418334Speter
563518334Speter  /* Validate and default VALUE.  */
563618334Speter
563718334Speter  /* Remove no-op casts from the value.  */
563818334Speter  if (value)
563918334Speter    STRIP_TYPE_NOPS (value);
564018334Speter
564118334Speter  if (value != 0)
564218334Speter    {
564318334Speter      if (TREE_CODE (value) == INTEGER_CST)
564418334Speter	{
564518334Speter	  value = default_conversion (value);
564618334Speter	  constant_expression_warning (value);
564718334Speter	}
564818334Speter      else
564918334Speter	{
565018334Speter	  error ("enumerator value for `%s' not integer constant",
565118334Speter		 IDENTIFIER_POINTER (name));
565218334Speter	  value = 0;
565318334Speter	}
565418334Speter    }
565518334Speter
565618334Speter  /* Default based on previous value.  */
565718334Speter  /* It should no longer be possible to have NON_LVALUE_EXPR
565818334Speter     in the default.  */
565918334Speter  if (value == 0)
566018334Speter    {
566118334Speter      value = enum_next_value;
566218334Speter      if (enum_overflow)
566318334Speter	error ("overflow in enumeration values");
566418334Speter    }
566518334Speter
566618334Speter  if (pedantic && ! int_fits_type_p (value, integer_type_node))
566718334Speter    {
566890075Sobrien      pedwarn ("ISO C restricts enumerator values to range of `int'");
566990075Sobrien      value = convert (integer_type_node, value);
567018334Speter    }
567118334Speter
567218334Speter  /* Set basis for default for next value.  */
567318334Speter  enum_next_value = build_binary_op (PLUS_EXPR, value, integer_one_node, 0);
567418334Speter  enum_overflow = tree_int_cst_lt (enum_next_value, value);
567518334Speter
567618334Speter  /* Now create a declaration for the enum value name.  */
567718334Speter
567818334Speter  type = TREE_TYPE (value);
5679117421Skan  type = c_common_type_for_size (MAX (TYPE_PRECISION (type),
5680117421Skan				      TYPE_PRECISION (integer_type_node)),
5681117421Skan				 (TYPE_PRECISION (type)
5682117421Skan				  >= TYPE_PRECISION (integer_type_node)
5683117421Skan				  && TREE_UNSIGNED (type)));
568418334Speter
568518334Speter  decl = build_decl (CONST_DECL, name, type);
568690075Sobrien  DECL_INITIAL (decl) = convert (type, value);
568718334Speter  pushdecl (decl);
568818334Speter
568990075Sobrien  return tree_cons (decl, value, NULL_TREE);
569018334Speter}
569190075Sobrien
569218334Speter
569318334Speter/* Create the FUNCTION_DECL for a function definition.
569490075Sobrien   DECLSPECS, DECLARATOR and ATTRIBUTES are the parts of
569518334Speter   the declaration; they describe the function's name and the type it returns,
569618334Speter   but twisted together in a fashion that parallels the syntax of C.
569718334Speter
569818334Speter   This function creates a binding context for the function body
569918334Speter   as well as setting up the FUNCTION_DECL in current_function_decl.
570018334Speter
570118334Speter   Returns 1 on success.  If the DECLARATOR is not suitable for a function
570218334Speter   (it defines a datum instead), we return 0, which tells
570390075Sobrien   yyparse to report a parse error.  */
570418334Speter
570518334Speterint
570690075Sobrienstart_function (declspecs, declarator, attributes)
570790075Sobrien     tree declarator, declspecs, attributes;
570818334Speter{
570918334Speter  tree decl1, old_decl;
571018334Speter  tree restype;
571118334Speter  int old_immediate_size_expand = immediate_size_expand;
571218334Speter
571350397Sobrien  current_function_returns_value = 0;  /* Assume, until we see it does.  */
571418334Speter  current_function_returns_null = 0;
571596263Sobrien  current_function_returns_abnormally = 0;
571618334Speter  warn_about_return_type = 0;
571718334Speter  current_extern_inline = 0;
571818334Speter  named_labels = 0;
571918334Speter  shadowed_labels = 0;
572018334Speter
572118334Speter  /* Don't expand any sizes in the return type of the function.  */
572218334Speter  immediate_size_expand = 0;
572318334Speter
572496263Sobrien  decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1);
572518334Speter
572618334Speter  /* If the declarator is not suitable for a function definition,
572718334Speter     cause a syntax error.  */
572818334Speter  if (decl1 == 0)
572950397Sobrien    {
573050397Sobrien      immediate_size_expand = old_immediate_size_expand;
573150397Sobrien      return 0;
573250397Sobrien    }
573318334Speter
573490075Sobrien  decl_attributes (&decl1, attributes, 0);
573518334Speter
573696263Sobrien  /* If #pragma weak was used, mark the decl weak now.  */
573796263Sobrien  if (current_binding_level == global_binding_level)
573896263Sobrien    maybe_apply_pragma_weak (decl1);
573996263Sobrien
574090075Sobrien  if (DECL_DECLARED_INLINE_P (decl1)
574190075Sobrien      && DECL_UNINLINABLE (decl1)
574290075Sobrien      && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1)))
574390075Sobrien    warning_with_decl (decl1,
574490075Sobrien		       "inline function `%s' given attribute noinline");
574590075Sobrien
574618334Speter  announce_function (decl1);
574718334Speter
574890075Sobrien  if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl1))))
574918334Speter    {
575090075Sobrien      error ("return type is an incomplete type");
575118334Speter      /* Make it return void instead.  */
575218334Speter      TREE_TYPE (decl1)
575318334Speter	= build_function_type (void_type_node,
575418334Speter			       TYPE_ARG_TYPES (TREE_TYPE (decl1)));
575518334Speter    }
575618334Speter
575718334Speter  if (warn_about_return_type)
575890075Sobrien    pedwarn_c99 ("return type defaults to `int'");
575918334Speter
576018334Speter  /* Save the parm names or decls from this function's declarator
576118334Speter     where store_parm_decls will find them.  */
576218334Speter  current_function_parms = last_function_parms;
576318334Speter  current_function_parm_tags = last_function_parm_tags;
576418334Speter
576518334Speter  /* Make the init_value nonzero so pushdecl knows this is not tentative.
576618334Speter     error_mark_node is replaced below (in poplevel) with the BLOCK.  */
576718334Speter  DECL_INITIAL (decl1) = error_mark_node;
576818334Speter
576918334Speter  /* If this definition isn't a prototype and we had a prototype declaration
577018334Speter     before, copy the arg type info from that prototype.
577118334Speter     But not if what we had before was a builtin function.  */
577218334Speter  old_decl = lookup_name_current_level (DECL_NAME (decl1));
577318334Speter  if (old_decl != 0 && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE
577418334Speter      && !DECL_BUILT_IN (old_decl)
577518334Speter      && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
577618334Speter	  == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (old_decl))))
577718334Speter      && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0)
577818334Speter    {
577918334Speter      TREE_TYPE (decl1) = TREE_TYPE (old_decl);
578018334Speter      current_function_prototype_file = DECL_SOURCE_FILE (old_decl);
578118334Speter      current_function_prototype_line = DECL_SOURCE_LINE (old_decl);
578218334Speter    }
578318334Speter
578418334Speter  /* If there is no explicit declaration, look for any out-of-scope implicit
578518334Speter     declarations.  */
578618334Speter  if (old_decl == 0)
578718334Speter    old_decl = IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1));
578818334Speter
578918334Speter  /* Optionally warn of old-fashioned def with no previous prototype.  */
579018334Speter  if (warn_strict_prototypes
579118334Speter      && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0
579290075Sobrien      && !(old_decl != 0
579390075Sobrien	   && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0
579490075Sobrien	       || (DECL_BUILT_IN (old_decl)
579596557Sobrien		   && ! C_DECL_ANTICIPATED (old_decl))))
579696557Sobrien		     && !(flag_bsd_no_warn_kr_main && 0 ==
579796557Sobrien			strcmp ("main", IDENTIFIER_POINTER (DECL_NAME (decl1)))))
579818334Speter    warning ("function declaration isn't a prototype");
579918334Speter  /* Optionally warn of any global def with no previous prototype.  */
580018334Speter  else if (warn_missing_prototypes
580118334Speter	   && TREE_PUBLIC (decl1)
580290075Sobrien	   && !(old_decl != 0
580390075Sobrien		&& (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0
580490075Sobrien		    || (DECL_BUILT_IN (old_decl)
580590075Sobrien			&& ! C_DECL_ANTICIPATED (old_decl))))
580690075Sobrien	   && ! MAIN_NAME_P (DECL_NAME (decl1)))
580718334Speter    warning_with_decl (decl1, "no previous prototype for `%s'");
580818334Speter  /* Optionally warn of any def with no previous prototype
580918334Speter     if the function has already been used.  */
581018334Speter  else if (warn_missing_prototypes
581118334Speter	   && old_decl != 0 && TREE_USED (old_decl)
581218334Speter	   && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) == 0)
581318334Speter    warning_with_decl (decl1,
581490075Sobrien		       "`%s' was used with no prototype before its definition");
581518334Speter  /* Optionally warn of any global def with no previous declaration.  */
581618334Speter  else if (warn_missing_declarations
581718334Speter	   && TREE_PUBLIC (decl1)
581818334Speter	   && old_decl == 0
581990075Sobrien	   && ! MAIN_NAME_P (DECL_NAME (decl1)))
582018334Speter    warning_with_decl (decl1, "no previous declaration for `%s'");
582118334Speter  /* Optionally warn of any def with no previous declaration
582218334Speter     if the function has already been used.  */
582318334Speter  else if (warn_missing_declarations
582418334Speter	   && old_decl != 0 && TREE_USED (old_decl)
582518334Speter	   && old_decl == IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)))
582618334Speter    warning_with_decl (decl1,
582790075Sobrien		       "`%s' was used with no declaration before its definition");
582818334Speter
582918334Speter  /* This is a definition, not a reference.
583018334Speter     So normally clear DECL_EXTERNAL.
583118334Speter     However, `extern inline' acts like a declaration
583218334Speter     except for defining how to inline.  So set DECL_EXTERNAL in that case.  */
583318334Speter  DECL_EXTERNAL (decl1) = current_extern_inline;
583418334Speter
583518334Speter  /* This function exists in static storage.
583618334Speter     (This does not mean `static' in the C sense!)  */
583718334Speter  TREE_STATIC (decl1) = 1;
583818334Speter
583918334Speter  /* A nested function is not global.  */
584018334Speter  if (current_function_decl != 0)
584118334Speter    TREE_PUBLIC (decl1) = 0;
584218334Speter
584390075Sobrien  /* Warn for unlikely, improbable, or stupid declarations of `main'.  */
584490075Sobrien  if (warn_main > 0 && MAIN_NAME_P (DECL_NAME (decl1)))
584550397Sobrien    {
584650397Sobrien      tree args;
584750397Sobrien      int argct = 0;
584850397Sobrien
584950397Sobrien      if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
585090075Sobrien	  != integer_type_node)
585150397Sobrien	pedwarn_with_decl (decl1, "return type of `%s' is not `int'");
585250397Sobrien
585350397Sobrien      for (args = TYPE_ARG_TYPES (TREE_TYPE (decl1)); args;
585450397Sobrien	   args = TREE_CHAIN (args))
585550397Sobrien	{
585650397Sobrien	  tree type = args ? TREE_VALUE (args) : 0;
585750397Sobrien
585850397Sobrien	  if (type == void_type_node)
585950397Sobrien	    break;
586050397Sobrien
586150397Sobrien	  ++argct;
586250397Sobrien	  switch (argct)
586350397Sobrien	    {
586450397Sobrien	    case 1:
586550397Sobrien	      if (TYPE_MAIN_VARIANT (type) != integer_type_node)
586650397Sobrien		pedwarn_with_decl (decl1,
586750397Sobrien				   "first argument of `%s' should be `int'");
586850397Sobrien	      break;
586950397Sobrien
587050397Sobrien	    case 2:
587150397Sobrien	      if (TREE_CODE (type) != POINTER_TYPE
587250397Sobrien		  || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
587350397Sobrien		  || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
587450397Sobrien		      != char_type_node))
587550397Sobrien		pedwarn_with_decl (decl1,
587690075Sobrien				   "second argument of `%s' should be `char **'");
587750397Sobrien	      break;
587850397Sobrien
587950397Sobrien	    case 3:
588050397Sobrien	      if (TREE_CODE (type) != POINTER_TYPE
588150397Sobrien		  || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
588250397Sobrien		  || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
588350397Sobrien		      != char_type_node))
588450397Sobrien		pedwarn_with_decl (decl1,
588590075Sobrien				   "third argument of `%s' should probably be `char **'");
588650397Sobrien	      break;
588750397Sobrien	    }
588850397Sobrien	}
588950397Sobrien
589050397Sobrien      /* It is intentional that this message does not mention the third
589190075Sobrien	 argument because it's only mentioned in an appendix of the
589290075Sobrien	 standard.  */
589350397Sobrien      if (argct > 0 && (argct < 2 || argct > 3))
589450397Sobrien	pedwarn_with_decl (decl1, "`%s' takes only zero or two arguments");
589550397Sobrien
589650397Sobrien      if (! TREE_PUBLIC (decl1))
589750397Sobrien	pedwarn_with_decl (decl1, "`%s' is normally a non-static function");
589850397Sobrien    }
589950397Sobrien
590018334Speter  /* Record the decl so that the function name is defined.
590118334Speter     If we already have a decl for this name, and it is a FUNCTION_DECL,
590218334Speter     use the old decl.  */
590318334Speter
590418334Speter  current_function_decl = pushdecl (decl1);
590518334Speter
590618334Speter  pushlevel (0);
590718334Speter  declare_parm_level (1);
590818334Speter  current_binding_level->subblocks_tag_transparent = 1;
590918334Speter
591090075Sobrien  make_decl_rtl (current_function_decl, NULL);
591118334Speter
591218334Speter  restype = TREE_TYPE (TREE_TYPE (current_function_decl));
591318334Speter  /* Promote the value to int before returning it.  */
591490075Sobrien  if (c_promoting_integer_type_p (restype))
591518334Speter    {
5916117421Skan      /* It retains unsignedness if not really getting wider.  */
591718334Speter      if (TREE_UNSIGNED (restype)
5918117421Skan	  && (TYPE_PRECISION (restype)
5919117421Skan		  == TYPE_PRECISION (integer_type_node)))
592018334Speter	restype = unsigned_type_node;
592118334Speter      else
592218334Speter	restype = integer_type_node;
592318334Speter    }
592418334Speter  DECL_RESULT (current_function_decl)
592518334Speter    = build_decl (RESULT_DECL, NULL_TREE, restype);
592618334Speter
592718334Speter  /* If this fcn was already referenced via a block-scope `extern' decl
592818334Speter     (or an implicit decl), propagate certain information about the usage.  */
592918334Speter  if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
593018334Speter    TREE_ADDRESSABLE (current_function_decl) = 1;
593118334Speter
593218334Speter  immediate_size_expand = old_immediate_size_expand;
593318334Speter
593490075Sobrien  start_fname_decls ();
593590075Sobrien
593618334Speter  return 1;
593718334Speter}
593818334Speter
593918334Speter/* Store the parameter declarations into the current function declaration.
594018334Speter   This is called after parsing the parameter declarations, before
594118334Speter   digesting the body of the function.
594218334Speter
594318334Speter   For an old-style definition, modify the function's type
594418334Speter   to specify at least the number of arguments.  */
594518334Speter
594618334Spetervoid
594718334Speterstore_parm_decls ()
594818334Speter{
594990075Sobrien  tree fndecl = current_function_decl;
595090075Sobrien  tree parm;
595118334Speter
595218334Speter  /* This is either a chain of PARM_DECLs (if a prototype was used)
595318334Speter     or a list of IDENTIFIER_NODEs (for an old-fashioned C definition).  */
595418334Speter  tree specparms = current_function_parms;
595518334Speter
595618334Speter  /* This is a list of types declared among parms in a prototype.  */
595718334Speter  tree parmtags = current_function_parm_tags;
595818334Speter
595918334Speter  /* This is a chain of PARM_DECLs from old-style parm declarations.  */
596090075Sobrien  tree parmdecls = getdecls ();
596118334Speter
596218334Speter  /* This is a chain of any other decls that came in among the parm
596318334Speter     declarations.  If a parm is declared with  enum {foo, bar} x;
596418334Speter     then CONST_DECLs for foo and bar are put here.  */
596518334Speter  tree nonparms = 0;
596618334Speter
596790075Sobrien  /* The function containing FNDECL, if any.  */
596890075Sobrien  tree context = decl_function_context (fndecl);
596990075Sobrien
597018334Speter  /* Nonzero if this definition is written with a prototype.  */
597118334Speter  int prototype = 0;
597218334Speter
597390075Sobrien  int saved_warn_shadow = warn_shadow;
597490075Sobrien
597590075Sobrien  /* Don't re-emit shadow warnings.  */
597690075Sobrien  warn_shadow = 0;
597790075Sobrien
597818334Speter  if (specparms != 0 && TREE_CODE (specparms) != TREE_LIST)
597918334Speter    {
598018334Speter      /* This case is when the function was defined with an ANSI prototype.
598118334Speter	 The parms already have decls, so we need not do anything here
598218334Speter	 except record them as in effect
598318334Speter	 and complain if any redundant old-style parm decls were written.  */
598418334Speter
598590075Sobrien      tree next;
598618334Speter      tree others = 0;
598718334Speter
598818334Speter      prototype = 1;
598918334Speter
599018334Speter      if (parmdecls != 0)
599118334Speter	{
599218334Speter	  tree decl, link;
599318334Speter
599418334Speter	  error_with_decl (fndecl,
599518334Speter			   "parm types given both in parmlist and separately");
599618334Speter	  /* Get rid of the erroneous decls; don't keep them on
599718334Speter	     the list of parms, since they might not be PARM_DECLs.  */
599818334Speter	  for (decl = current_binding_level->names;
599918334Speter	       decl; decl = TREE_CHAIN (decl))
600018334Speter	    if (DECL_NAME (decl))
600118334Speter	      IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) = 0;
600218334Speter	  for (link = current_binding_level->shadowed;
600318334Speter	       link; link = TREE_CHAIN (link))
600418334Speter	    IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
600518334Speter	  current_binding_level->names = 0;
600618334Speter	  current_binding_level->shadowed = 0;
600718334Speter	}
600818334Speter
600918334Speter      specparms = nreverse (specparms);
601018334Speter      for (parm = specparms; parm; parm = next)
601118334Speter	{
601218334Speter	  next = TREE_CHAIN (parm);
601318334Speter	  if (TREE_CODE (parm) == PARM_DECL)
601418334Speter	    {
601518334Speter	      if (DECL_NAME (parm) == 0)
601618334Speter		error_with_decl (parm, "parameter name omitted");
601790075Sobrien	      else if (TREE_CODE (TREE_TYPE (parm)) != ERROR_MARK
601890075Sobrien		       && VOID_TYPE_P (TREE_TYPE (parm)))
601918334Speter		{
602018334Speter		  error_with_decl (parm, "parameter `%s' declared void");
602118334Speter		  /* Change the type to error_mark_node so this parameter
602218334Speter		     will be ignored by assign_parms.  */
602318334Speter		  TREE_TYPE (parm) = error_mark_node;
602418334Speter		}
602518334Speter	      pushdecl (parm);
602618334Speter	    }
602718334Speter	  else
602818334Speter	    {
602918334Speter	      /* If we find an enum constant or a type tag,
603018334Speter		 put it aside for the moment.  */
603118334Speter	      TREE_CHAIN (parm) = 0;
603218334Speter	      others = chainon (others, parm);
603318334Speter	    }
603418334Speter	}
603518334Speter
603618334Speter      /* Get the decls in their original chain order
603718334Speter	 and record in the function.  */
603818334Speter      DECL_ARGUMENTS (fndecl) = getdecls ();
603918334Speter
604018334Speter#if 0
604118334Speter      /* If this function takes a variable number of arguments,
604218334Speter	 add a phony parameter to the end of the parm list,
604318334Speter	 to represent the position of the first unnamed argument.  */
604418334Speter      if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl))))
604518334Speter	  != void_type_node)
604618334Speter	{
604718334Speter	  tree dummy = build_decl (PARM_DECL, NULL_TREE, void_type_node);
604818334Speter	  /* Let's hope the address of the unnamed parm
604918334Speter	     won't depend on its type.  */
605018334Speter	  TREE_TYPE (dummy) = integer_type_node;
605118334Speter	  DECL_ARG_TYPE (dummy) = integer_type_node;
605290075Sobrien	  DECL_ARGUMENTS (fndecl) = chainon (DECL_ARGUMENTS (fndecl), dummy);
605318334Speter	}
605418334Speter#endif
605518334Speter
605618334Speter      /* Now pushdecl the enum constants.  */
605718334Speter      for (parm = others; parm; parm = next)
605818334Speter	{
605918334Speter	  next = TREE_CHAIN (parm);
606018334Speter	  if (DECL_NAME (parm) == 0)
606118334Speter	    ;
606218334Speter	  else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
606318334Speter	    ;
606418334Speter	  else if (TREE_CODE (parm) != PARM_DECL)
606518334Speter	    pushdecl (parm);
606618334Speter	}
606718334Speter
606818334Speter      storetags (chainon (parmtags, gettags ()));
606918334Speter    }
607018334Speter  else
607118334Speter    {
607218334Speter      /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes
607318334Speter	 each with a parm name as the TREE_VALUE.
607418334Speter
607518334Speter	 PARMDECLS is a chain of declarations for parameters.
607618334Speter	 Warning! It can also contain CONST_DECLs which are not parameters
607718334Speter	 but are names of enumerators of any enum types
607818334Speter	 declared among the parameters.
607918334Speter
608018334Speter	 First match each formal parameter name with its declaration.
608118334Speter	 Associate decls with the names and store the decls
608218334Speter	 into the TREE_PURPOSE slots.  */
608318334Speter
608490075Sobrien      /* We use DECL_WEAK as a flag to show which parameters have been
608590075Sobrien	 seen already since it is not used on PARM_DECL or CONST_DECL.  */
608618334Speter      for (parm = parmdecls; parm; parm = TREE_CHAIN (parm))
608790075Sobrien	DECL_WEAK (parm) = 0;
608818334Speter
608918334Speter      for (parm = specparms; parm; parm = TREE_CHAIN (parm))
609018334Speter	{
609190075Sobrien	  tree tail, found = NULL;
609218334Speter
609318334Speter	  if (TREE_VALUE (parm) == 0)
609418334Speter	    {
609590075Sobrien	      error_with_decl (fndecl,
609690075Sobrien			       "parameter name missing from parameter list");
609718334Speter	      TREE_PURPOSE (parm) = 0;
609818334Speter	      continue;
609918334Speter	    }
610018334Speter
610118334Speter	  /* See if any of the parmdecls specifies this parm by name.
610218334Speter	     Ignore any enumerator decls.  */
610318334Speter	  for (tail = parmdecls; tail; tail = TREE_CHAIN (tail))
610418334Speter	    if (DECL_NAME (tail) == TREE_VALUE (parm)
610518334Speter		&& TREE_CODE (tail) == PARM_DECL)
610618334Speter	      {
610718334Speter		found = tail;
610818334Speter		break;
610918334Speter	      }
611018334Speter
611118334Speter	  /* If declaration already marked, we have a duplicate name.
611290075Sobrien	     Complain, and don't use this decl twice.  */
611390075Sobrien	  if (found && DECL_WEAK (found))
611418334Speter	    {
611518334Speter	      error_with_decl (found, "multiple parameters named `%s'");
611618334Speter	      found = 0;
611718334Speter	    }
611818334Speter
611918334Speter	  /* If the declaration says "void", complain and ignore it.  */
612090075Sobrien	  if (found && VOID_TYPE_P (TREE_TYPE (found)))
612118334Speter	    {
612218334Speter	      error_with_decl (found, "parameter `%s' declared void");
612318334Speter	      TREE_TYPE (found) = integer_type_node;
612418334Speter	      DECL_ARG_TYPE (found) = integer_type_node;
612518334Speter	      layout_decl (found, 0);
612618334Speter	    }
612718334Speter
612818334Speter	  /* If no declaration found, default to int.  */
612918334Speter	  if (!found)
613018334Speter	    {
613118334Speter	      found = build_decl (PARM_DECL, TREE_VALUE (parm),
613218334Speter				  integer_type_node);
613318334Speter	      DECL_ARG_TYPE (found) = TREE_TYPE (found);
613418334Speter	      DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl);
613518334Speter	      DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl);
613690075Sobrien	      if (flag_isoc99)
613790075Sobrien		pedwarn_with_decl (found, "type of `%s' defaults to `int'");
613890075Sobrien	      else if (extra_warnings)
613918334Speter		warning_with_decl (found, "type of `%s' defaults to `int'");
614018334Speter	      pushdecl (found);
614118334Speter	    }
614218334Speter
614318334Speter	  TREE_PURPOSE (parm) = found;
614418334Speter
614590075Sobrien	  /* Mark this decl as "already found".  */
614690075Sobrien	  DECL_WEAK (found) = 1;
614718334Speter	}
614818334Speter
614918334Speter      /* Put anything which is on the parmdecls chain and which is
615018334Speter	 not a PARM_DECL onto the list NONPARMS.  (The types of
615118334Speter	 non-parm things which might appear on the list include
615218334Speter	 enumerators and NULL-named TYPE_DECL nodes.) Complain about
615318334Speter	 any actual PARM_DECLs not matched with any names.  */
615418334Speter
615518334Speter      nonparms = 0;
615690075Sobrien      for (parm = parmdecls; parm;)
615718334Speter	{
615818334Speter	  tree next = TREE_CHAIN (parm);
615918334Speter	  TREE_CHAIN (parm) = 0;
616018334Speter
616118334Speter	  if (TREE_CODE (parm) != PARM_DECL)
616218334Speter	    nonparms = chainon (nonparms, parm);
616318334Speter	  else
616418334Speter	    {
616518334Speter	      /* Complain about args with incomplete types.  */
616690075Sobrien	      if (!COMPLETE_TYPE_P (TREE_TYPE (parm)))
616790075Sobrien		{
616890075Sobrien		  error_with_decl (parm, "parameter `%s' has incomplete type");
616990075Sobrien		  TREE_TYPE (parm) = error_mark_node;
617090075Sobrien		}
617118334Speter
617290075Sobrien	      if (! DECL_WEAK (parm))
617390075Sobrien		{
617490075Sobrien		  error_with_decl (parm,
617590075Sobrien				   "declaration for parameter `%s' but no such parameter");
617618334Speter	          /* Pretend the parameter was not missing.
617718334Speter		     This gets us to a standard state and minimizes
617818334Speter		     further error messages.  */
617990075Sobrien		  specparms
618018334Speter		    = chainon (specparms,
618118334Speter			       tree_cons (parm, NULL_TREE, NULL_TREE));
618218334Speter		}
618318334Speter	    }
618418334Speter
618518334Speter	  parm = next;
618618334Speter	}
618718334Speter
618890075Sobrien      /* Chain the declarations together in the order of the list of
618990075Sobrien         names.  Store that chain in the function decl, replacing the
619090075Sobrien         list of names.  */
619118334Speter      parm = specparms;
619218334Speter      DECL_ARGUMENTS (fndecl) = 0;
619318334Speter      {
619490075Sobrien	tree last;
619518334Speter	for (last = 0; parm; parm = TREE_CHAIN (parm))
619618334Speter	  if (TREE_PURPOSE (parm))
619718334Speter	    {
619818334Speter	      if (last == 0)
619918334Speter		DECL_ARGUMENTS (fndecl) = TREE_PURPOSE (parm);
620018334Speter	      else
620118334Speter		TREE_CHAIN (last) = TREE_PURPOSE (parm);
620218334Speter	      last = TREE_PURPOSE (parm);
620318334Speter	      TREE_CHAIN (last) = 0;
620418334Speter	    }
620518334Speter      }
620618334Speter
620718334Speter      /* If there was a previous prototype,
620818334Speter	 set the DECL_ARG_TYPE of each argument according to
620918334Speter	 the type previously specified, and report any mismatches.  */
621018334Speter
621118334Speter      if (TYPE_ARG_TYPES (TREE_TYPE (fndecl)))
621218334Speter	{
621390075Sobrien	  tree type;
621418334Speter	  for (parm = DECL_ARGUMENTS (fndecl),
621518334Speter	       type = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
621618334Speter	       parm || (type && (TYPE_MAIN_VARIANT (TREE_VALUE (type))
621718334Speter				 != void_type_node));
621818334Speter	       parm = TREE_CHAIN (parm), type = TREE_CHAIN (type))
621918334Speter	    {
622018334Speter	      if (parm == 0 || type == 0
622118334Speter		  || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
622218334Speter		{
622318334Speter		  error ("number of arguments doesn't match prototype");
622418334Speter		  error_with_file_and_line (current_function_prototype_file,
622518334Speter					    current_function_prototype_line,
622618334Speter					    "prototype declaration");
622718334Speter		  break;
622818334Speter		}
622990075Sobrien	      /* Type for passing arg must be consistent with that
623090075Sobrien		 declared for the arg.  ISO C says we take the unqualified
623190075Sobrien		 type for parameters declared with qualified type.  */
623290075Sobrien	      if (! comptypes (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm)),
623390075Sobrien			       TYPE_MAIN_VARIANT (TREE_VALUE (type))))
623418334Speter		{
623518334Speter		  if (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
623618334Speter		      == TYPE_MAIN_VARIANT (TREE_VALUE (type)))
623718334Speter		    {
623818334Speter		      /* Adjust argument to match prototype.  E.g. a previous
623918334Speter			 `int foo(float);' prototype causes
624018334Speter			 `int foo(x) float x; {...}' to be treated like
624118334Speter			 `int foo(float x) {...}'.  This is particularly
624218334Speter			 useful for argument types like uid_t.  */
624318334Speter		      DECL_ARG_TYPE (parm) = TREE_TYPE (parm);
624490075Sobrien
624590075Sobrien		      if (PROMOTE_PROTOTYPES
624690075Sobrien			  && INTEGRAL_TYPE_P (TREE_TYPE (parm))
624718334Speter			  && TYPE_PRECISION (TREE_TYPE (parm))
624818334Speter			  < TYPE_PRECISION (integer_type_node))
624918334Speter			DECL_ARG_TYPE (parm) = integer_type_node;
625090075Sobrien
625118334Speter		      if (pedantic)
625218334Speter			{
625318334Speter			  pedwarn ("promoted argument `%s' doesn't match prototype",
625418334Speter				   IDENTIFIER_POINTER (DECL_NAME (parm)));
625518334Speter			  warning_with_file_and_line
625618334Speter			    (current_function_prototype_file,
625718334Speter			     current_function_prototype_line,
625818334Speter			     "prototype declaration");
625918334Speter			}
626018334Speter		    }
6261117421Skan		  else
626218334Speter		    {
626318334Speter		      error ("argument `%s' doesn't match prototype",
626418334Speter			     IDENTIFIER_POINTER (DECL_NAME (parm)));
626518334Speter		      error_with_file_and_line (current_function_prototype_file,
626618334Speter						current_function_prototype_line,
626718334Speter						"prototype declaration");
626818334Speter		    }
626918334Speter		}
627018334Speter	    }
627118334Speter	  TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0;
627218334Speter	}
627318334Speter
627418334Speter      /* Otherwise, create a prototype that would match.  */
627518334Speter
627618334Speter      else
627718334Speter	{
627818334Speter	  tree actual = 0, last = 0, type;
627918334Speter
628018334Speter	  for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm))
628118334Speter	    {
628290075Sobrien	      type = tree_cons (NULL_TREE, DECL_ARG_TYPE (parm), NULL_TREE);
628318334Speter	      if (last)
628418334Speter		TREE_CHAIN (last) = type;
628518334Speter	      else
628618334Speter		actual = type;
628718334Speter	      last = type;
628818334Speter	    }
628990075Sobrien	  type = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
629018334Speter	  if (last)
629118334Speter	    TREE_CHAIN (last) = type;
629218334Speter	  else
629318334Speter	    actual = type;
629418334Speter
629518334Speter	  /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES
629618334Speter	     of the type of this function, but we need to avoid having this
629718334Speter	     affect the types of other similarly-typed functions, so we must
629818334Speter	     first force the generation of an identical (but separate) type
629918334Speter	     node for the relevant function type.  The new node we create
630018334Speter	     will be a variant of the main variant of the original function
630118334Speter	     type.  */
630218334Speter
630318334Speter	  TREE_TYPE (fndecl) = build_type_copy (TREE_TYPE (fndecl));
630418334Speter
630518334Speter	  TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = actual;
630618334Speter	}
630718334Speter
630818334Speter      /* Now store the final chain of decls for the arguments
630918334Speter	 as the decl-chain of the current lexical scope.
631018334Speter	 Put the enumerators in as well, at the front so that
631118334Speter	 DECL_ARGUMENTS is not modified.  */
631218334Speter
631318334Speter      storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
631418334Speter    }
631518334Speter
631618334Speter  /* Make sure the binding level for the top of the function body
631718334Speter     gets a BLOCK if there are any in the function.
631818334Speter     Otherwise, the dbx output is wrong.  */
631918334Speter
632018334Speter  keep_next_if_subblocks = 1;
632118334Speter
632218334Speter  /* ??? This might be an improvement,
632318334Speter     but needs to be thought about some more.  */
632418334Speter#if 0
632518334Speter  keep_next_level_flag = 1;
632618334Speter#endif
632718334Speter
632818334Speter  /* Write a record describing this function definition to the prototypes
632918334Speter     file (if requested).  */
633018334Speter
633118334Speter  gen_aux_info_record (fndecl, 1, 0, prototype);
633218334Speter
633318334Speter  /* Initialize the RTL code for the function.  */
633418334Speter  init_function_start (fndecl, input_filename, lineno);
633518334Speter
633690075Sobrien  /* Begin the statement tree for this function.  */
633790075Sobrien  begin_stmt_tree (&DECL_SAVED_TREE (current_function_decl));
633818334Speter
633990075Sobrien  /* If this is a nested function, save away the sizes of any
634090075Sobrien     variable-size types so that we can expand them when generating
634190075Sobrien     RTL.  */
634290075Sobrien  if (context)
634318334Speter    {
634490075Sobrien      tree t;
634518334Speter
634690075Sobrien      DECL_LANG_SPECIFIC (fndecl)->pending_sizes
634790075Sobrien	= nreverse (get_pending_sizes ());
634890075Sobrien      for (t = DECL_LANG_SPECIFIC (fndecl)->pending_sizes;
634990075Sobrien	   t;
635090075Sobrien	   t = TREE_CHAIN (t))
635190075Sobrien	SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = context;
635218334Speter    }
635318334Speter
635490075Sobrien  /* This function is being processed in whole-function mode.  */
635590075Sobrien  cfun->x_whole_function_mode_p = 1;
635618334Speter
635790075Sobrien  /* Even though we're inside a function body, we still don't want to
635890075Sobrien     call expand_expr to calculate the size of a variable-sized array.
635990075Sobrien     We haven't necessarily assigned RTL to all variables yet, so it's
636090075Sobrien     not safe to try to expand expressions involving them.  */
636190075Sobrien  immediate_size_expand = 0;
636290075Sobrien  cfun->x_dont_save_pending_sizes_p = 1;
636318334Speter
636490075Sobrien  warn_shadow = saved_warn_shadow;
636518334Speter}
636618334Speter
636718334Speter/* Finish up a function declaration and compile that function
636818334Speter   all the way to assembler language output.  The free the storage
636918334Speter   for the function definition.
637018334Speter
637118334Speter   This is called after parsing the body of the function definition.
637218334Speter
637396263Sobrien   NESTED is nonzero if the function being finished is nested in another.
637496263Sobrien   CAN_DEFER_P is nonzero if the function may be deferred.  */
637518334Speter
637618334Spetervoid
637796263Sobrienfinish_function (nested, can_defer_p)
637818334Speter     int nested;
637996263Sobrien     int can_defer_p;
638018334Speter{
638190075Sobrien  tree fndecl = current_function_decl;
638218334Speter
638396263Sobrien#if 0
638496263Sobrien  /* This caused &foo to be of type ptr-to-const-function which then
638596263Sobrien     got a warning when stored in a ptr-to-function variable.  */
638696263Sobrien  TREE_READONLY (fndecl) = 1;
638796263Sobrien#endif
638818334Speter
638918334Speter  poplevel (1, 0, 1);
639018334Speter  BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
639118334Speter
639218334Speter  /* Must mark the RESULT_DECL as being in this function.  */
639318334Speter
639418334Speter  DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
639518334Speter
639690075Sobrien  if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted)
639718334Speter    {
639818334Speter      if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl)))
639918334Speter	  != integer_type_node)
640050397Sobrien	{
640152284Sobrien	  /* If warn_main is 1 (-Wmain) or 2 (-Wall), we have already warned.
640290075Sobrien	     If warn_main is -1 (-Wno-main) we don't want to be warned.  */
640350397Sobrien	  if (! warn_main)
640450397Sobrien	    pedwarn_with_decl (fndecl, "return type of `%s' is not `int'");
640550397Sobrien	}
640618334Speter      else
640718334Speter	{
640850397Sobrien#ifdef DEFAULT_MAIN_RETURN
640918334Speter	  /* Make it so that `main' always returns success by default.  */
641018334Speter	  DEFAULT_MAIN_RETURN;
641190075Sobrien#else
641290075Sobrien	  if (flag_isoc99)
641390075Sobrien	    c_expand_return (integer_zero_node);
641450397Sobrien#endif
641518334Speter	}
641618334Speter    }
641790075Sobrien
641890075Sobrien  finish_fname_decls ();
641918334Speter
642090075Sobrien  /* Tie off the statement tree for this function.  */
642190075Sobrien  finish_stmt_tree (&DECL_SAVED_TREE (fndecl));
642296263Sobrien
642396263Sobrien  /* Complain if there's just no return statement.  */
642496263Sobrien  if (warn_return_type
642596263Sobrien      && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE
642696263Sobrien      && !current_function_returns_value && !current_function_returns_null
642796263Sobrien      /* Don't complain if we abort.  */
642896263Sobrien      && !current_function_returns_abnormally
642996263Sobrien      /* Don't warn for main().  */
643096263Sobrien      && !MAIN_NAME_P (DECL_NAME (fndecl))
643196263Sobrien      /* Or if they didn't actually specify a return type.  */
643296263Sobrien      && !C_FUNCTION_IMPLICIT_INT (fndecl)
643396263Sobrien      /* Normally, with -Wreturn-type, flow will complain.  Unless we're an
643496263Sobrien	 inline function, as we might never be compiled separately.  */
643596263Sobrien      && DECL_INLINE (fndecl))
643696263Sobrien    warning ("no return statement in function returning non-void");
643796263Sobrien
643890075Sobrien  /* Clear out memory we no longer need.  */
643990075Sobrien  free_after_parsing (cfun);
644090075Sobrien  /* Since we never call rest_of_compilation, we never clear
644190075Sobrien     CFUN.  Do so explicitly.  */
644290075Sobrien  free_after_compilation (cfun);
644390075Sobrien  cfun = NULL;
644490075Sobrien
644590075Sobrien  if (! nested)
644690075Sobrien    {
644790075Sobrien      /* Generate RTL for the body of this function.  */
644896263Sobrien      c_expand_body (fndecl, nested, can_defer_p);
644996263Sobrien
645090075Sobrien      /* Let the error reporting routines know that we're outside a
645190075Sobrien	 function.  For a nested function, this value is used in
6452117421Skan	 c_pop_function_context and then reset via pop_function_context.  */
645390075Sobrien      current_function_decl = NULL;
645490075Sobrien    }
645590075Sobrien}
645690075Sobrien
645790075Sobrien/* Generate the RTL for a deferred function FNDECL.  */
645890075Sobrien
645990075Sobrienvoid
646090075Sobrienc_expand_deferred_function (fndecl)
646190075Sobrien     tree fndecl;
646290075Sobrien{
646390075Sobrien  /* DECL_INLINE or DECL_RESULT might got cleared after the inline
646490075Sobrien     function was deferred, e.g. in duplicate_decls.  */
646590075Sobrien  if (DECL_INLINE (fndecl) && DECL_RESULT (fndecl))
646690075Sobrien    {
646790075Sobrien      c_expand_body (fndecl, 0, 0);
646890075Sobrien      current_function_decl = NULL;
646990075Sobrien    }
647090075Sobrien}
647190075Sobrien
6472117421Skan/* Called to move the SAVE_EXPRs for parameter declarations in a
6473117421Skan   nested function into the nested function.  DATA is really the
6474117421Skan   nested FUNCTION_DECL.  */
6475117421Skan
6476117421Skanstatic tree
6477117421Skanset_save_expr_context (tp, walk_subtrees, data)
6478117421Skan     tree *tp;
6479117421Skan     int *walk_subtrees;
6480117421Skan     void *data;
6481117421Skan{
6482117421Skan  if (TREE_CODE (*tp) == SAVE_EXPR && !SAVE_EXPR_CONTEXT (*tp))
6483117421Skan    SAVE_EXPR_CONTEXT (*tp) = (tree) data;
6484117421Skan  /* Do not walk back into the SAVE_EXPR_CONTEXT; that will cause
6485117421Skan     circularity.  */
6486117421Skan  else if (DECL_P (*tp))
6487117421Skan    *walk_subtrees = 0;
6488117421Skan
6489117421Skan  return NULL_TREE;
6490117421Skan}
6491117421Skan
6492117421Skan/* Generate the RTL for the body of FNDECL.  If NESTED_P is nonzero,
649390075Sobrien   then we are already in the process of generating RTL for another
649490075Sobrien   function.  If can_defer_p is zero, we won't attempt to defer the
649590075Sobrien   generation of RTL.  */
649690075Sobrien
649790075Sobrienstatic void
649890075Sobrienc_expand_body (fndecl, nested_p, can_defer_p)
649990075Sobrien     tree fndecl;
650090075Sobrien     int nested_p, can_defer_p;
650190075Sobrien{
650290075Sobrien  int uninlinable = 1;
6503117421Skan  int saved_lineno;
6504117421Skan  const char *saved_input_filename;
650590075Sobrien
650690075Sobrien  /* There's no reason to do any of the work here if we're only doing
650790075Sobrien     semantic analysis; this code just generates RTL.  */
650890075Sobrien  if (flag_syntax_only)
650990075Sobrien    return;
651090075Sobrien
6511117421Skan  saved_lineno = lineno;
6512117421Skan  saved_input_filename = input_filename;
6513117421Skan  lineno = DECL_SOURCE_LINE (fndecl);
6514117421Skan  input_filename = DECL_SOURCE_FILE (fndecl);
6515117421Skan
651690075Sobrien  if (flag_inline_trees)
651790075Sobrien    {
651890075Sobrien      /* First, cache whether the current function is inlinable.  Some
651990075Sobrien         predicates depend on cfun and current_function_decl to
652090075Sobrien         function completely.  */
652190075Sobrien      timevar_push (TV_INTEGRATION);
652290075Sobrien      uninlinable = ! tree_inlinable_function_p (fndecl);
652390075Sobrien
652490075Sobrien      if (! uninlinable && can_defer_p
652590075Sobrien	  /* Save function tree for inlining.  Should return 0 if the
652690075Sobrien             language does not support function deferring or the
652790075Sobrien             function could not be deferred.  */
652890075Sobrien	  && defer_fn (fndecl))
652990075Sobrien	{
653090075Sobrien	  /* Let the back-end know that this function exists.  */
653190075Sobrien	  (*debug_hooks->deferred_inline_function) (fndecl);
653290075Sobrien          timevar_pop (TV_INTEGRATION);
6533117421Skan          lineno = saved_lineno;
6534117421Skan          input_filename = saved_input_filename;
653590075Sobrien	  return;
653690075Sobrien	}
653790075Sobrien
653890075Sobrien      /* Then, inline any functions called in it.  */
653990075Sobrien      optimize_inline_calls (fndecl);
654090075Sobrien      timevar_pop (TV_INTEGRATION);
654190075Sobrien    }
654290075Sobrien
654390075Sobrien  timevar_push (TV_EXPAND);
654490075Sobrien
654590075Sobrien  if (nested_p)
654690075Sobrien    {
654790075Sobrien      /* Make sure that we will evaluate variable-sized types involved
654890075Sobrien	 in our function's type.  */
654990075Sobrien      expand_pending_sizes (DECL_LANG_SPECIFIC (fndecl)->pending_sizes);
655090075Sobrien      /* Squirrel away our current state.  */
655190075Sobrien      push_function_context ();
655290075Sobrien    }
655390075Sobrien
655490075Sobrien  /* Initialize the RTL code for the function.  */
655590075Sobrien  current_function_decl = fndecl;
655690075Sobrien  init_function_start (fndecl, input_filename, DECL_SOURCE_LINE (fndecl));
655790075Sobrien
655890075Sobrien  /* This function is being processed in whole-function mode.  */
655990075Sobrien  cfun->x_whole_function_mode_p = 1;
656090075Sobrien
656190075Sobrien  /* Even though we're inside a function body, we still don't want to
656290075Sobrien     call expand_expr to calculate the size of a variable-sized array.
656390075Sobrien     We haven't necessarily assigned RTL to all variables yet, so it's
656490075Sobrien     not safe to try to expand expressions involving them.  */
656590075Sobrien  immediate_size_expand = 0;
656690075Sobrien  cfun->x_dont_save_pending_sizes_p = 1;
656790075Sobrien
656890075Sobrien  /* Set up parameters and prepare for return, for the function.  */
656990075Sobrien  expand_function_start (fndecl, 0);
657090075Sobrien
6571117421Skan  /* If the function has a variably modified type, there may be
6572117421Skan     SAVE_EXPRs in the parameter types.  Their context must be set to
6573117421Skan     refer to this function; they cannot be expanded in the containing
6574117421Skan     function.  */
6575117421Skan  if (decl_function_context (fndecl)
6576117421Skan      && variably_modified_type_p (TREE_TYPE (fndecl)))
6577117421Skan    walk_tree (&TREE_TYPE (fndecl), set_save_expr_context, fndecl,
6578117421Skan	       NULL);
6579117421Skan
658090075Sobrien  /* If this function is `main', emit a call to `__main'
658190075Sobrien     to run global initializers, etc.  */
658290075Sobrien  if (DECL_NAME (fndecl)
658390075Sobrien      && MAIN_NAME_P (DECL_NAME (fndecl))
658490075Sobrien      && DECL_CONTEXT (fndecl) == NULL_TREE)
658590075Sobrien    expand_main_function ();
658690075Sobrien
658790075Sobrien  /* Generate the RTL for this function.  */
658890075Sobrien  expand_stmt (DECL_SAVED_TREE (fndecl));
6589117421Skan
6590117421Skan  /* Keep the function body if it's needed for inlining or dumping.  */
6591117421Skan  if (uninlinable && !dump_enabled_p (TDI_all))
659290075Sobrien    {
659390075Sobrien      /* Allow the body of the function to be garbage collected.  */
659490075Sobrien      DECL_SAVED_TREE (fndecl) = NULL_TREE;
659590075Sobrien    }
659690075Sobrien
659790075Sobrien  /* We hard-wired immediate_size_expand to zero above.
659890075Sobrien     expand_function_end will decrement this variable.  So, we set the
659990075Sobrien     variable to one here, so that after the decrement it will remain
660090075Sobrien     zero.  */
660190075Sobrien  immediate_size_expand = 1;
660290075Sobrien
660390075Sobrien  /* Allow language dialects to perform special processing.  */
660490075Sobrien  if (lang_expand_function_end)
660590075Sobrien    (*lang_expand_function_end) ();
660690075Sobrien
660718334Speter  /* Generate rtl for function exit.  */
660818334Speter  expand_function_end (input_filename, lineno, 0);
660918334Speter
661090075Sobrien  /* If this is a nested function, protect the local variables in the stack
661190075Sobrien     above us from being collected while we're compiling this function.  */
661290075Sobrien  if (nested_p)
661390075Sobrien    ggc_push_context ();
661418334Speter
661518334Speter  /* Run the optimizers and output the assembler code for this function.  */
661618334Speter  rest_of_compilation (fndecl);
661718334Speter
661890075Sobrien  /* Undo the GC context switch.  */
661990075Sobrien  if (nested_p)
662090075Sobrien    ggc_pop_context ();
662118334Speter
662218334Speter  /* With just -W, complain only if function returns both with
662318334Speter     and without a value.  */
662490075Sobrien  if (extra_warnings
662590075Sobrien      && current_function_returns_value
662690075Sobrien      && current_function_returns_null)
662718334Speter    warning ("this function may return with or without a value");
662818334Speter
662918334Speter  /* If requested, warn about function definitions where the function will
663018334Speter     return a value (usually of some struct or union type) which itself will
663118334Speter     take up a lot of stack space.  */
663218334Speter
663318334Speter  if (warn_larger_than && !DECL_EXTERNAL (fndecl) && TREE_TYPE (fndecl))
663418334Speter    {
663590075Sobrien      tree ret_type = TREE_TYPE (TREE_TYPE (fndecl));
663618334Speter
663790075Sobrien      if (ret_type && TYPE_SIZE_UNIT (ret_type)
663890075Sobrien	  && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST
663990075Sobrien	  && 0 < compare_tree_int (TYPE_SIZE_UNIT (ret_type),
664090075Sobrien				   larger_than_size))
664118334Speter	{
664290075Sobrien	  unsigned int size_as_int
664390075Sobrien	    = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type));
664418334Speter
664590075Sobrien	  if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0)
664690075Sobrien	    warning_with_decl (fndecl,
664790075Sobrien			       "size of return value of `%s' is %u bytes",
664890075Sobrien			       size_as_int);
664990075Sobrien	  else
665090075Sobrien	    warning_with_decl (fndecl,
665190075Sobrien			       "size of return value of `%s' is larger than %d bytes",
665290075Sobrien			       larger_than_size);
665318334Speter	}
665418334Speter    }
665518334Speter
665690075Sobrien  if (DECL_SAVED_INSNS (fndecl) == 0 && ! nested_p
665790075Sobrien      && ! flag_inline_trees)
665818334Speter    {
665990075Sobrien      /* Stop pointing to the local nodes about to be freed.
666090075Sobrien	 But DECL_INITIAL must remain nonzero so we know this
666190075Sobrien	 was an actual function definition.
6662117421Skan	 For a nested function, this is done in c_pop_function_context.
666390075Sobrien	 If rest_of_compilation set this to 0, leave it 0.  */
666418334Speter      if (DECL_INITIAL (fndecl) != 0)
666518334Speter	DECL_INITIAL (fndecl) = error_mark_node;
666690075Sobrien
666718334Speter      DECL_ARGUMENTS (fndecl) = 0;
666818334Speter    }
666918334Speter
667018334Speter  if (DECL_STATIC_CONSTRUCTOR (fndecl))
667118334Speter    {
667290075Sobrien      if (targetm.have_ctors_dtors)
667390075Sobrien	(* targetm.asm_out.constructor) (XEXP (DECL_RTL (fndecl), 0),
667490075Sobrien				         DEFAULT_INIT_PRIORITY);
667518334Speter      else
667690075Sobrien	static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors);
667718334Speter    }
667890075Sobrien
667918334Speter  if (DECL_STATIC_DESTRUCTOR (fndecl))
668018334Speter    {
668190075Sobrien      if (targetm.have_ctors_dtors)
668290075Sobrien	(* targetm.asm_out.destructor) (XEXP (DECL_RTL (fndecl), 0),
668390075Sobrien				        DEFAULT_INIT_PRIORITY);
668418334Speter      else
668590075Sobrien	static_dtors = tree_cons (NULL_TREE, fndecl, static_dtors);
668618334Speter    }
668718334Speter
668890075Sobrien  if (nested_p)
668990075Sobrien    /* Return to the enclosing function.  */
669090075Sobrien    pop_function_context ();
669190075Sobrien  timevar_pop (TV_EXPAND);
6692117421Skan
6693117421Skan  lineno = saved_lineno;
6694117421Skan  input_filename = saved_input_filename;
669590075Sobrien}
669690075Sobrien
669790075Sobrien/* Check the declarations given in a for-loop for satisfying the C99
669890075Sobrien   constraints.  */
669990075Sobrienvoid
670090075Sobriencheck_for_loop_decls ()
670190075Sobrien{
670290075Sobrien  tree t;
670390075Sobrien
670490075Sobrien  if (!flag_isoc99)
670518334Speter    {
670690075Sobrien      /* If we get here, declarations have been used in a for loop without
670790075Sobrien	 the C99 for loop scope.  This doesn't make much sense, so don't
670890075Sobrien	 allow it.  */
670990075Sobrien      error ("`for' loop initial declaration used outside C99 mode");
671090075Sobrien      return;
671118334Speter    }
671290075Sobrien  /* C99 subclause 6.8.5 paragraph 3:
671390075Sobrien
671490075Sobrien       [#3]  The  declaration  part  of  a for statement shall only
671590075Sobrien       declare identifiers for objects having storage class auto or
671690075Sobrien       register.
671790075Sobrien
671890075Sobrien     It isn't clear whether, in this sentence, "identifiers" binds to
671990075Sobrien     "shall only declare" or to "objects" - that is, whether all identifiers
672090075Sobrien     declared must be identifiers for objects, or whether the restriction
672190075Sobrien     only applies to those that are.  (A question on this in comp.std.c
672290075Sobrien     in November 2000 received no answer.)  We implement the strictest
672390075Sobrien     interpretation, to avoid creating an extension which later causes
672490075Sobrien     problems.  */
672590075Sobrien
672690075Sobrien  for (t = gettags (); t; t = TREE_CHAIN (t))
672790075Sobrien    {
672890075Sobrien      if (TREE_PURPOSE (t) != 0)
672990075Sobrien        {
673090075Sobrien          enum tree_code code = TREE_CODE (TREE_VALUE (t));
673190075Sobrien
673290075Sobrien          if (code == RECORD_TYPE)
673390075Sobrien            error ("`struct %s' declared in `for' loop initial declaration",
673490075Sobrien                   IDENTIFIER_POINTER (TREE_PURPOSE (t)));
673590075Sobrien          else if (code == UNION_TYPE)
673690075Sobrien            error ("`union %s' declared in `for' loop initial declaration",
673790075Sobrien                   IDENTIFIER_POINTER (TREE_PURPOSE (t)));
673890075Sobrien          else
673990075Sobrien            error ("`enum %s' declared in `for' loop initial declaration",
674090075Sobrien                   IDENTIFIER_POINTER (TREE_PURPOSE (t)));
674190075Sobrien        }
674290075Sobrien    }
674390075Sobrien
674490075Sobrien  for (t = getdecls (); t; t = TREE_CHAIN (t))
674590075Sobrien    {
674690075Sobrien      if (TREE_CODE (t) != VAR_DECL && DECL_NAME (t))
674790075Sobrien	error_with_decl (t, "declaration of non-variable `%s' in `for' loop initial declaration");
674890075Sobrien      else if (TREE_STATIC (t))
674990075Sobrien	error_with_decl (t, "declaration of static variable `%s' in `for' loop initial declaration");
675090075Sobrien      else if (DECL_EXTERNAL (t))
675190075Sobrien	error_with_decl (t, "declaration of `extern' variable `%s' in `for' loop initial declaration");
675290075Sobrien    }
675318334Speter}
675418334Speter
675518334Speter/* Save and restore the variables in this file and elsewhere
675618334Speter   that keep track of the progress of compilation of the current function.
675718334Speter   Used for nested functions.  */
675818334Speter
6759117421Skanstruct language_function GTY(())
676018334Speter{
6761117421Skan  struct c_language_function base;
676218334Speter  tree named_labels;
676318334Speter  tree shadowed_labels;
676418334Speter  int returns_value;
676518334Speter  int returns_null;
676696263Sobrien  int returns_abnormally;
676718334Speter  int warn_about_return_type;
676818334Speter  int extern_inline;
676918334Speter  struct binding_level *binding_level;
677018334Speter};
677118334Speter
677218334Speter/* Save and reinitialize the variables
677318334Speter   used during compilation of a C function.  */
677418334Speter
677518334Spetervoid
6776117421Skanc_push_function_context (f)
677790075Sobrien     struct function *f;
677818334Speter{
6779117421Skan  struct language_function *p;
6780117421Skan  p = ((struct language_function *)
6781117421Skan       ggc_alloc (sizeof (struct language_function)));
6782117421Skan  f->language = p;
678318334Speter
678490075Sobrien  p->base.x_stmt_tree = c_stmt_tree;
678590075Sobrien  p->base.x_scope_stmt_stack = c_scope_stmt_stack;
678618334Speter  p->named_labels = named_labels;
678718334Speter  p->shadowed_labels = shadowed_labels;
678818334Speter  p->returns_value = current_function_returns_value;
678918334Speter  p->returns_null = current_function_returns_null;
679096263Sobrien  p->returns_abnormally = current_function_returns_abnormally;
679118334Speter  p->warn_about_return_type = warn_about_return_type;
679218334Speter  p->extern_inline = current_extern_inline;
679318334Speter  p->binding_level = current_binding_level;
679418334Speter}
679518334Speter
679618334Speter/* Restore the variables used during compilation of a C function.  */
679718334Speter
679818334Spetervoid
6799117421Skanc_pop_function_context (f)
680090075Sobrien     struct function *f;
680118334Speter{
6802117421Skan  struct language_function *p = f->language;
680318334Speter  tree link;
680418334Speter
680518334Speter  /* Bring back all the labels that were shadowed.  */
680618334Speter  for (link = shadowed_labels; link; link = TREE_CHAIN (link))
680718334Speter    if (DECL_NAME (TREE_VALUE (link)) != 0)
680818334Speter      IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)))
680918334Speter	= TREE_VALUE (link);
681018334Speter
681190075Sobrien  if (DECL_SAVED_INSNS (current_function_decl) == 0
681290075Sobrien      && DECL_SAVED_TREE (current_function_decl) == NULL_TREE)
681318334Speter    {
681418334Speter      /* Stop pointing to the local nodes about to be freed.  */
681518334Speter      /* But DECL_INITIAL must remain nonzero so we know this
681618334Speter	 was an actual function definition.  */
681718334Speter      DECL_INITIAL (current_function_decl) = error_mark_node;
681818334Speter      DECL_ARGUMENTS (current_function_decl) = 0;
681918334Speter    }
682018334Speter
682190075Sobrien  c_stmt_tree = p->base.x_stmt_tree;
682290075Sobrien  c_scope_stmt_stack = p->base.x_scope_stmt_stack;
682318334Speter  named_labels = p->named_labels;
682418334Speter  shadowed_labels = p->shadowed_labels;
682518334Speter  current_function_returns_value = p->returns_value;
682618334Speter  current_function_returns_null = p->returns_null;
682796263Sobrien  current_function_returns_abnormally = p->returns_abnormally;
682818334Speter  warn_about_return_type = p->warn_about_return_type;
682918334Speter  current_extern_inline = p->extern_inline;
683018334Speter  current_binding_level = p->binding_level;
683118334Speter
6832117421Skan  f->language = NULL;
683318334Speter}
683418334Speter
6835117421Skan/* Copy the DECL_LANG_SPECIFIC data associated with DECL.  */
683618334Speter
683718334Spetervoid
6838117421Skanc_dup_lang_specific_decl (decl)
683990075Sobrien     tree decl;
684090075Sobrien{
684190075Sobrien  struct lang_decl *ld;
684290075Sobrien
684390075Sobrien  if (!DECL_LANG_SPECIFIC (decl))
684490075Sobrien    return;
684590075Sobrien
684690075Sobrien  ld = (struct lang_decl *) ggc_alloc (sizeof (struct lang_decl));
684790075Sobrien  memcpy ((char *) ld, (char *) DECL_LANG_SPECIFIC (decl),
684890075Sobrien	  sizeof (struct lang_decl));
684990075Sobrien  DECL_LANG_SPECIFIC (decl) = ld;
685090075Sobrien}
685190075Sobrien
685290075Sobrien/* The functions below are required for functionality of doing
685390075Sobrien   function at once processing in the C front end. Currently these
685490075Sobrien   functions are not called from anywhere in the C front end, but as
685590075Sobrien   these changes continue, that will change.  */
685690075Sobrien
6857117421Skan/* Returns nonzero if the current statement is a full expression,
685890075Sobrien   i.e. temporaries created during that statement should be destroyed
685990075Sobrien   at the end of the statement.  */
686090075Sobrien
686190075Sobrienint
686290075Sobrienstmts_are_full_exprs_p ()
686390075Sobrien{
686490075Sobrien  return 0;
686590075Sobrien}
686690075Sobrien
686790075Sobrien/* Returns the stmt_tree (if any) to which statements are currently
686890075Sobrien   being added.  If there is no active statement-tree, NULL is
686990075Sobrien   returned.  */
687090075Sobrien
687190075Sobrienstmt_tree
687290075Sobriencurrent_stmt_tree ()
687390075Sobrien{
687490075Sobrien  return &c_stmt_tree;
687590075Sobrien}
687690075Sobrien
687790075Sobrien/* Returns the stack of SCOPE_STMTs for the current function.  */
687890075Sobrien
687990075Sobrientree *
688090075Sobriencurrent_scope_stmt_stack ()
688190075Sobrien{
688290075Sobrien  return &c_scope_stmt_stack;
688390075Sobrien}
688490075Sobrien
688590075Sobrien/* Nonzero if TYPE is an anonymous union or struct type.  Always 0 in
688690075Sobrien   C.  */
688790075Sobrien
688890075Sobrienint
688990075Sobrienanon_aggr_type_p (node)
689050397Sobrien     tree node ATTRIBUTE_UNUSED;
689118334Speter{
689290075Sobrien  return 0;
689318334Speter}
689490075Sobrien
689590075Sobrien/* Dummy function in place of callback used by C++.  */
689690075Sobrien
689790075Sobrienvoid
689890075Sobrienextract_interface_info ()
689990075Sobrien{
690090075Sobrien}
690190075Sobrien
690290075Sobrien/* Return a new COMPOUND_STMT, after adding it to the current
690390075Sobrien   statement tree.  */
690490075Sobrien
690590075Sobrientree
690690075Sobrienc_begin_compound_stmt ()
690790075Sobrien{
690890075Sobrien  tree stmt;
690990075Sobrien
691090075Sobrien  /* Create the COMPOUND_STMT.  */
691190075Sobrien  stmt = add_stmt (build_stmt (COMPOUND_STMT, NULL_TREE));
691290075Sobrien
691390075Sobrien  return stmt;
691490075Sobrien}
691590075Sobrien
691690075Sobrien/* Expand T (a DECL_STMT) if it declares an entity not handled by the
691790075Sobrien   common code.  */
691890075Sobrien
691990075Sobrienvoid
692090075Sobrienc_expand_decl_stmt (t)
692190075Sobrien     tree t;
692290075Sobrien{
692390075Sobrien  tree decl = DECL_STMT_DECL (t);
692490075Sobrien
692590075Sobrien  /* Expand nested functions.  */
692690075Sobrien  if (TREE_CODE (decl) == FUNCTION_DECL
692790075Sobrien      && DECL_CONTEXT (decl) == current_function_decl
692890075Sobrien      && DECL_SAVED_TREE (decl))
692990075Sobrien    c_expand_body (decl, /*nested_p=*/1, /*can_defer_p=*/0);
693090075Sobrien}
693190075Sobrien
693290075Sobrien/* Return the IDENTIFIER_GLOBAL_VALUE of T, for use in common code, since
693390075Sobrien   the definition of IDENTIFIER_GLOBAL_VALUE is different for C and C++.  */
693490075Sobrien
693590075Sobrientree
693690075Sobrienidentifier_global_value	(t)
693790075Sobrien     tree t;
693890075Sobrien{
693990075Sobrien  return IDENTIFIER_GLOBAL_VALUE (t);
694090075Sobrien}
694190075Sobrien
694290075Sobrien/* Record a builtin type for C.  If NAME is non-NULL, it is the name used;
694390075Sobrien   otherwise the name is found in ridpointers from RID_INDEX.  */
694490075Sobrien
694590075Sobrienvoid
694690075Sobrienrecord_builtin_type (rid_index, name, type)
694790075Sobrien     enum rid rid_index;
694890075Sobrien     const char *name;
694990075Sobrien     tree type;
695090075Sobrien{
695190075Sobrien  tree id;
695290075Sobrien  if (name == 0)
695390075Sobrien    id = ridpointers[(int) rid_index];
695490075Sobrien  else
695590075Sobrien    id = get_identifier (name);
695690075Sobrien  pushdecl (build_decl (TYPE_DECL, id, type));
695790075Sobrien}
695890075Sobrien
695990075Sobrien/* Build the void_list_node (void_type_node having been created).  */
696090075Sobrientree
696190075Sobrienbuild_void_list_node ()
696290075Sobrien{
696390075Sobrien  tree t = build_tree_list (NULL_TREE, void_type_node);
696490075Sobrien  return t;
696590075Sobrien}
6966117421Skan
6967117421Skan/* Return something to represent absolute declarators containing a *.
6968117421Skan   TARGET is the absolute declarator that the * contains.
6969117421Skan   TYPE_QUALS_ATTRS is a list of modifiers such as const or volatile
6970117421Skan   to apply to the pointer type, represented as identifiers, possible mixed
6971117421Skan   with attributes.
6972117421Skan
6973117421Skan   We return an INDIRECT_REF whose "contents" are TARGET (inside a TREE_LIST,
6974117421Skan   if attributes are present) and whose type is the modifier list.  */
6975117421Skan
6976117421Skantree
6977117421Skanmake_pointer_declarator (type_quals_attrs, target)
6978117421Skan     tree type_quals_attrs, target;
6979117421Skan{
6980117421Skan  tree quals, attrs;
6981117421Skan  tree itarget = target;
6982117421Skan  split_specs_attrs (type_quals_attrs, &quals, &attrs);
6983117421Skan  if (attrs != NULL_TREE)
6984117421Skan    itarget = tree_cons (attrs, target, NULL_TREE);
6985117421Skan  return build1 (INDIRECT_REF, quals, itarget);
6986117421Skan}
6987117421Skan
6988117421Skan#include "gt-c-decl.h"
6989