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 (¤t_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