c-decl.c revision 102790
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 102790 2002-09-01 20:53:28Z 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" 4218334Speter#include "c-lex.h" 4350397Sobrien#include "toplev.h" 4490075Sobrien#include "ggc.h" 4590075Sobrien#include "tm_p.h" 4650397Sobrien#include "cpplib.h" 4790075Sobrien#include "target.h" 4890075Sobrien#include "debug.h" 4990075Sobrien#include "timevar.h" 5090075Sobrien#include "c-common.h" 5196263Sobrien#include "c-pragma.h" 5250397Sobrien 5318334Speter/* In grokdeclarator, distinguish syntactic contexts of declarators. */ 5418334Speterenum decl_context 5518334Speter{ NORMAL, /* Ordinary declaration */ 5618334Speter FUNCDEF, /* Function definition */ 5718334Speter PARM, /* Declaration of parm before function body */ 5818334Speter FIELD, /* Declaration inside struct or union */ 5996263Sobrien BITFIELD, /* Likewise but with specified width */ 6018334Speter TYPENAME}; /* Typename (inside cast or sizeof) */ 6118334Speter 6218334Speter 6318334Speter/* Nonzero if we have seen an invalid cross reference 6418334Speter to a struct, union, or enum, but not yet printed the message. */ 6518334Speter 6618334Spetertree pending_invalid_xref; 6718334Speter/* File and line to appear in the eventual error message. */ 6890075Sobrienconst char *pending_invalid_xref_file; 6918334Speterint pending_invalid_xref_line; 7018334Speter 7118334Speter/* While defining an enum type, this is 1 plus the last enumerator 7218334Speter constant value. Note that will do not have to save this or `enum_overflow' 7318334Speter around nested function definition since such a definition could only 7418334Speter occur in an enum value expression and we don't use these variables in 7518334Speter that case. */ 7618334Speter 7718334Speterstatic tree enum_next_value; 7818334Speter 7918334Speter/* Nonzero means that there was overflow computing enum_next_value. */ 8018334Speter 8118334Speterstatic int enum_overflow; 8218334Speter 8318334Speter/* Parsing a function declarator leaves a list of parameter names 8418334Speter or a chain or parameter decls here. */ 8518334Speter 8618334Speterstatic tree last_function_parms; 8718334Speter 8818334Speter/* Parsing a function declarator leaves here a chain of structure 8918334Speter and enum types declared in the parmlist. */ 9018334Speter 9118334Speterstatic tree last_function_parm_tags; 9218334Speter 9318334Speter/* After parsing the declarator that starts a function definition, 9418334Speter `start_function' puts here the list of parameter names or chain of decls. 9518334Speter `store_parm_decls' finds it here. */ 9618334Speter 9718334Speterstatic tree current_function_parms; 9818334Speter 9918334Speter/* Similar, for last_function_parm_tags. */ 10018334Speterstatic tree current_function_parm_tags; 10118334Speter 10218334Speter/* Similar, for the file and line that the prototype came from if this is 10318334Speter an old-style definition. */ 10490075Sobrienstatic const char *current_function_prototype_file; 10518334Speterstatic int current_function_prototype_line; 10618334Speter 10790075Sobrien/* The current statement tree. */ 10890075Sobrien 10990075Sobrienstatic struct stmt_tree_s c_stmt_tree; 11090075Sobrien 11190075Sobrien/* The current scope statement stack. */ 11290075Sobrien 11390075Sobrienstatic tree c_scope_stmt_stack; 11490075Sobrien 11518334Speter/* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function 11618334Speter that have names. Here so we can clear out their names' definitions 11718334Speter at the end of the function. */ 11818334Speter 11918334Speterstatic tree named_labels; 12018334Speter 12118334Speter/* A list of LABEL_DECLs from outer contexts that are currently shadowed. */ 12218334Speter 12318334Speterstatic tree shadowed_labels; 12418334Speter 12518334Speter/* Nonzero when store_parm_decls is called indicates a varargs function. 12618334Speter Value not meaningful after store_parm_decls. */ 12718334Speter 12818334Speterstatic int c_function_varargs; 12918334Speter 13018334Speter/* Set to 0 at beginning of a function definition, set to 1 if 13118334Speter a return statement that specifies a return value is seen. */ 13218334Speter 13318334Speterint current_function_returns_value; 13418334Speter 13518334Speter/* Set to 0 at beginning of a function definition, set to 1 if 13618334Speter a return statement with no argument is seen. */ 13718334Speter 13818334Speterint current_function_returns_null; 13918334Speter 14096263Sobrien/* Set to 0 at beginning of a function definition, set to 1 if 14196263Sobrien a call to a noreturn function is seen. */ 14296263Sobrien 14396263Sobrienint current_function_returns_abnormally; 14496263Sobrien 14518334Speter/* Set to nonzero by `grokdeclarator' for a function 14618334Speter whose return type is defaulted, if warnings for this are desired. */ 14718334Speter 14818334Speterstatic int warn_about_return_type; 14918334Speter 15018334Speter/* Nonzero when starting a function declared `extern inline'. */ 15118334Speter 15218334Speterstatic int current_extern_inline; 15318334Speter 15418334Speter/* For each binding contour we allocate a binding_level structure 15518334Speter * which records the names defined in that contour. 15618334Speter * Contours include: 15718334Speter * 0) the global one 15818334Speter * 1) one for each function definition, 15918334Speter * where internal declarations of the parameters appear. 16018334Speter * 2) one for each compound statement, 16118334Speter * to record its declarations. 16218334Speter * 16318334Speter * The current meaning of a name can be found by searching the levels from 16418334Speter * the current one out to the global one. 16518334Speter */ 16618334Speter 16718334Speter/* Note that the information in the `names' component of the global contour 16818334Speter is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */ 16918334Speter 17018334Speterstruct binding_level 17118334Speter { 17218334Speter /* A chain of _DECL nodes for all variables, constants, functions, 17318334Speter and typedef types. These are in the reverse of the order supplied. 17418334Speter */ 17518334Speter tree names; 17618334Speter 17718334Speter /* A list of structure, union and enum definitions, 17818334Speter * for looking up tag names. 17918334Speter * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name, 18018334Speter * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE, 18118334Speter * or ENUMERAL_TYPE node. 18218334Speter */ 18318334Speter tree tags; 18418334Speter 18518334Speter /* For each level, a list of shadowed outer-level local definitions 18618334Speter to be restored when this level is popped. 18718334Speter Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and 18818334Speter whose TREE_VALUE is its old definition (a kind of ..._DECL node). */ 18918334Speter tree shadowed; 19018334Speter 19118334Speter /* For each level (except not the global one), 19218334Speter a chain of BLOCK nodes for all the levels 19318334Speter that were entered and exited one level down. */ 19418334Speter tree blocks; 19518334Speter 19618334Speter /* The BLOCK node for this level, if one has been preallocated. 19718334Speter If 0, the BLOCK is allocated (if needed) when the level is popped. */ 19818334Speter tree this_block; 19918334Speter 20018334Speter /* The binding level which this one is contained in (inherits from). */ 20118334Speter struct binding_level *level_chain; 20218334Speter 20318334Speter /* Nonzero for the level that holds the parameters of a function. */ 20418334Speter char parm_flag; 20518334Speter 20618334Speter /* Nonzero if this level "doesn't exist" for tags. */ 20718334Speter char tag_transparent; 20818334Speter 20918334Speter /* Nonzero if sublevels of this level "don't exist" for tags. 21018334Speter This is set in the parm level of a function definition 21118334Speter while reading the function body, so that the outermost block 21218334Speter of the function body will be tag-transparent. */ 21318334Speter char subblocks_tag_transparent; 21418334Speter 21518334Speter /* Nonzero means make a BLOCK for this level regardless of all else. */ 21618334Speter char keep; 21718334Speter 21818334Speter /* Nonzero means make a BLOCK if this level has any subblocks. */ 21918334Speter char keep_if_subblocks; 22018334Speter 22190075Sobrien /* Number of decls in `names' that have incomplete 22218334Speter structure or union types. */ 22318334Speter int n_incomplete; 22418334Speter 22518334Speter /* A list of decls giving the (reversed) specified order of parms, 22618334Speter not including any forward-decls in the parmlist. 22718334Speter This is so we can put the parms in proper order for assign_parms. */ 22818334Speter tree parm_order; 22918334Speter }; 23018334Speter 23118334Speter#define NULL_BINDING_LEVEL (struct binding_level *) NULL 23290075Sobrien 23318334Speter/* The binding level currently in effect. */ 23418334Speter 23518334Speterstatic struct binding_level *current_binding_level; 23618334Speter 23718334Speter/* A chain of binding_level structures awaiting reuse. */ 23818334Speter 23918334Speterstatic struct binding_level *free_binding_level; 24018334Speter 24118334Speter/* The outermost binding level, for names of file scope. 24218334Speter This is created when the compiler is started and exists 24318334Speter through the entire run. */ 24418334Speter 24518334Speterstatic struct binding_level *global_binding_level; 24618334Speter 24718334Speter/* Binding level structures are initialized by copying this one. */ 24818334Speter 24918334Speterstatic struct binding_level clear_binding_level 25018334Speter = {NULL, NULL, NULL, NULL, NULL, NULL_BINDING_LEVEL, 0, 0, 0, 0, 0, 0, 25118334Speter NULL}; 25218334Speter 25318334Speter/* Nonzero means unconditionally make a BLOCK for the next level pushed. */ 25418334Speter 25518334Speterstatic int keep_next_level_flag; 25618334Speter 25718334Speter/* Nonzero means make a BLOCK for the next level pushed 25818334Speter if it has subblocks. */ 25918334Speter 26018334Speterstatic int keep_next_if_subblocks; 26190075Sobrien 26218334Speter/* The chain of outer levels of label scopes. 26318334Speter This uses the same data structure used for binding levels, 26418334Speter but it works differently: each link in the chain records 26518334Speter saved values of named_labels and shadowed_labels for 26618334Speter a label binding level outside the current one. */ 26718334Speter 26818334Speterstatic struct binding_level *label_level_chain; 26918334Speter 27018334Speter/* Functions called automatically at the beginning and end of execution. */ 27118334Speter 27218334Spetertree static_ctors, static_dtors; 27318334Speter 27418334Speter/* Forward declarations. */ 27518334Speter 27690075Sobrienstatic struct binding_level * make_binding_level PARAMS ((void)); 27790075Sobrienstatic void mark_binding_level PARAMS ((void *)); 27890075Sobrienstatic void clear_limbo_values PARAMS ((tree)); 27990075Sobrienstatic int duplicate_decls PARAMS ((tree, tree, int)); 28090075Sobrienstatic int redeclaration_error_message PARAMS ((tree, tree)); 28190075Sobrienstatic void storedecls PARAMS ((tree)); 28290075Sobrienstatic void storetags PARAMS ((tree)); 28390075Sobrienstatic tree lookup_tag PARAMS ((enum tree_code, tree, 28490075Sobrien struct binding_level *, int)); 28590075Sobrienstatic tree lookup_tag_reverse PARAMS ((tree)); 28690075Sobrienstatic tree grokdeclarator PARAMS ((tree, tree, enum decl_context, 28796263Sobrien int)); 28890075Sobrienstatic tree grokparms PARAMS ((tree, int)); 28990075Sobrienstatic void layout_array_type PARAMS ((tree)); 29090075Sobrienstatic tree c_make_fname_decl PARAMS ((tree, int)); 29190075Sobrienstatic void c_expand_body PARAMS ((tree, int, int)); 29290075Sobrienstatic void warn_if_shadowing PARAMS ((tree, tree)); 29318334Speter 29418334Speter/* C-specific option variables. */ 29518334Speter 29618334Speter/* Nonzero means allow type mismatches in conditional expressions; 29790075Sobrien just make their values `void'. */ 29818334Speter 29918334Speterint flag_cond_mismatch; 30018334Speter 30118334Speter/* Nonzero means don't recognize the keyword `asm'. */ 30218334Speter 30318334Speterint flag_no_asm; 30418334Speter 30590075Sobrien/* Nonzero means do some things the same way PCC does. */ 30618334Speter 30790075Sobrienint flag_traditional; 30818334Speter 30990075Sobrien/* Nonzero means enable C89 Amendment 1 features. */ 31018334Speter 31190075Sobrienint flag_isoc94 = 0; 31218334Speter 31390075Sobrien/* Nonzero means use the ISO C99 dialect of C. */ 31418334Speter 31590075Sobrienint flag_isoc99 = 0; 31618334Speter 31796549Sobrien/* Nonzero means allow the BSD kernel printf enhancments. */ 31896549Sobrien 31996549Sobrienint flag_bsd_format = 0; 32096549Sobrien 32150397Sobrien/* Nonzero means that we have builtin functions, and main is an int */ 32250397Sobrien 32350397Sobrienint flag_hosted = 1; 32450397Sobrien 32590075Sobrien/* Nonzero means add default format_arg attributes for functions not 32690075Sobrien in ISO C. */ 32790075Sobrien 32890075Sobrienint flag_noniso_default_format_attributes = 1; 32990075Sobrien 33018334Speter/* Nonzero means to allow single precision math even if we're generally 33150397Sobrien being traditional. */ 33218334Speterint flag_allow_single_precision = 0; 33318334Speter 33496263Sobrien/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ 33518334Speter 33618334Speterint flag_signed_bitfields = 1; 33718334Speterint explicit_flag_signed_bitfields = 0; 33818334Speter 33990075Sobrien/* Nonzero means warn about use of implicit int. */ 34018334Speter 34150397Sobrienint warn_implicit_int; 34218334Speter 34350397Sobrien/* Nonzero means warn about usage of long long when `-pedantic'. */ 34450397Sobrien 34550397Sobrienint warn_long_long = 1; 34650397Sobrien 34750397Sobrien/* Nonzero means message about use of implicit function declarations; 34890075Sobrien 1 means warning; 2 means error. */ 34950397Sobrien 35090075Sobrienint mesg_implicit_function_declaration = -1; 35150397Sobrien 35218334Speter/* Nonzero means give string constants the type `const char *' 35318334Speter to get extra warnings from them. These warnings will be too numerous 35418334Speter to be useful, except in thoroughly ANSIfied programs. */ 35518334Speter 35652284Sobrienint flag_const_strings; 35718334Speter 35818334Speter/* Nonzero means warn about pointer casts that can drop a type qualifier 35918334Speter from the pointer target type. */ 36018334Speter 36118334Speterint warn_cast_qual; 36218334Speter 36318334Speter/* Nonzero means warn when casting a function call to a type that does 36418334Speter not match the return type (e.g. (float)sqrt() or (anything*)malloc() 36518334Speter when there is no previous declaration of sqrt or malloc. */ 36618334Speter 36718334Speterint warn_bad_function_cast; 36818334Speter 36990075Sobrien/* Warn about functions which might be candidates for format attributes. */ 37052284Sobrien 37190075Sobrienint warn_missing_format_attribute; 37252284Sobrien 37318334Speter/* Warn about traditional constructs whose meanings changed in ANSI C. */ 37418334Speter 37518334Speterint warn_traditional; 37618334Speter 37718334Speter/* Nonzero means warn about sizeof(function) or addition/subtraction 37818334Speter of function pointers. */ 37918334Speter 38018334Speterint warn_pointer_arith; 38118334Speter 38296557Sobrien 38396557Sobrien/* Nonzero means do not warn that K&R style main() is not a function prototype. */ 38496557Sobrien 38596557Sobrienint flag_bsd_no_warn_kr_main; 38696557Sobrien 38718334Speter/* Nonzero means warn for non-prototype function decls 38818334Speter or non-prototyped defs without previous prototype. */ 38918334Speter 39018334Speterint warn_strict_prototypes; 39118334Speter 39218334Speter/* Nonzero means warn for any global function def 39318334Speter without separate previous prototype decl. */ 39418334Speter 39518334Speterint warn_missing_prototypes; 39618334Speter 39718334Speter/* Nonzero means warn for any global function def 39818334Speter without separate previous decl. */ 39918334Speter 40018334Speterint warn_missing_declarations; 40118334Speter 40218334Speter/* Nonzero means warn about multiple (redundant) decls for the same single 40318334Speter variable or function. */ 40418334Speter 40518334Speterint warn_redundant_decls = 0; 40618334Speter 40718334Speter/* Nonzero means warn about extern declarations of objects not at 40818334Speter file-scope level and about *all* declarations of functions (whether 40918334Speter extern or static) not at file-scope level. Note that we exclude 41018334Speter implicit function declarations. To get warnings about those, use 41118334Speter -Wimplicit. */ 41218334Speter 41318334Speterint warn_nested_externs = 0; 41418334Speter 41518334Speter/* Warn about a subscript that has type char. */ 41618334Speter 41718334Speterint warn_char_subscripts = 0; 41818334Speter 41918334Speter/* Warn if a type conversion is done that might have confusing results. */ 42018334Speter 42118334Speterint warn_conversion; 42218334Speter 42318334Speter/* Warn if adding () is suggested. */ 42418334Speter 42518334Speterint warn_parentheses; 42618334Speter 42718334Speter/* Warn if initializer is not completely bracketed. */ 42818334Speter 42918334Speterint warn_missing_braces; 43018334Speter 43150397Sobrien/* Warn if main is suspicious. */ 43218334Speter 43350397Sobrienint warn_main; 43450397Sobrien 43550397Sobrien/* Warn about #pragma directives that are not recognised. */ 43650397Sobrien 43790075Sobrienint warn_unknown_pragmas = 0; /* Tri state variable. */ 43850397Sobrien 43950397Sobrien/* Warn about comparison of signed and unsigned values. 44050397Sobrien If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified. */ 44150397Sobrien 44250397Sobrienint warn_sign_compare = -1; 44350397Sobrien 44490075Sobrien/* Warn about testing equality of floating point numbers. */ 44590075Sobrien 44690075Sobrienint warn_float_equal = 0; 44790075Sobrien 44850397Sobrien/* Nonzero means warn about use of multicharacter literals. */ 44950397Sobrien 45050397Sobrienint warn_multichar = 1; 45150397Sobrien 45250397Sobrien/* Nonzero means `$' can be in an identifier. */ 45350397Sobrien 45418334Speter#ifndef DOLLARS_IN_IDENTIFIERS 45518334Speter#define DOLLARS_IN_IDENTIFIERS 1 45618334Speter#endif 45750397Sobrienint dollars_in_ident = DOLLARS_IN_IDENTIFIERS; 45818334Speter 45990075Sobrien/* States indicating how grokdeclarator() should handle declspecs marked 46090075Sobrien with __attribute__((deprecated)). An object declared as 46190075Sobrien __attribute__((deprecated)) suppresses warnings of uses of other 46290075Sobrien deprecated items. */ 46390075Sobrien 46490075Sobrienenum deprecated_states { 46590075Sobrien DEPRECATED_NORMAL, 46690075Sobrien DEPRECATED_SUPPRESS 46790075Sobrien}; 46890075Sobrien 46990075Sobrienstatic enum deprecated_states deprecated_state = DEPRECATED_NORMAL; 47090075Sobrien 47118334Speter/* Decode the string P as a language-specific option for C. 47290075Sobrien Return the number of strings consumed. Should not complain 47390075Sobrien if it does not recognise the option. */ 47490075Sobrien 47518334Speterint 47650397Sobrienc_decode_option (argc, argv) 47752284Sobrien int argc ATTRIBUTE_UNUSED; 47850397Sobrien char **argv; 47918334Speter{ 48050397Sobrien int strings_processed; 48150397Sobrien char *p = argv[0]; 48250397Sobrien 48390075Sobrien strings_processed = cpp_handle_option (parse_in, argc, argv, 0); 48490075Sobrien 48518334Speter if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional")) 48618334Speter { 48790075Sobrien warning ("-traditional is deprecated and may be removed"); 48818334Speter flag_traditional = 1; 48918334Speter flag_writable_strings = 1; 49018334Speter } 49118334Speter else if (!strcmp (p, "-fallow-single-precision")) 49218334Speter flag_allow_single_precision = 1; 49350397Sobrien else if (!strcmp (p, "-fhosted") || !strcmp (p, "-fno-freestanding")) 49450397Sobrien { 49550397Sobrien flag_hosted = 1; 49650397Sobrien flag_no_builtin = 0; 49750397Sobrien } 49850397Sobrien else if (!strcmp (p, "-ffreestanding") || !strcmp (p, "-fno-hosted")) 49950397Sobrien { 50050397Sobrien flag_hosted = 0; 50150397Sobrien flag_no_builtin = 1; 50250397Sobrien /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */ 50350397Sobrien if (warn_main == 2) 50450397Sobrien warn_main = 0; 50550397Sobrien } 50618334Speter else if (!strcmp (p, "-fnotraditional") || !strcmp (p, "-fno-traditional")) 50718334Speter { 50818334Speter flag_traditional = 0; 50918334Speter flag_writable_strings = 0; 51018334Speter } 51152284Sobrien else if (!strncmp (p, "-std=", 5)) 51252284Sobrien { 51352284Sobrien /* Select the appropriate language standard. We currently 51452284Sobrien recognize: 51552284Sobrien -std=iso9899:1990 same as -ansi 51652284Sobrien -std=iso9899:199409 ISO C as modified in amend. 1 51790075Sobrien -std=iso9899:1999 ISO C 99 51852284Sobrien -std=c89 same as -std=iso9899:1990 51990075Sobrien -std=c99 same as -std=iso9899:1999 52052284Sobrien -std=gnu89 default, iso9899:1990 + gnu extensions 52190075Sobrien -std=gnu99 iso9899:1999 + gnu extensions 52296549Sobrien -std=bsd iso9899:1999 + BSD kernel printf extensions 52352284Sobrien */ 52490075Sobrien const char *const argstart = &p[5]; 52552284Sobrien 52652284Sobrien if (!strcmp (argstart, "iso9899:1990") 52752284Sobrien || !strcmp (argstart, "c89")) 52852284Sobrien { 52952284Sobrien iso_1990: 53090075Sobrien flag_isoc94 = 0; 53190075Sobrien iso_1994: 53252284Sobrien flag_traditional = 0; 53352284Sobrien flag_writable_strings = 0; 53452284Sobrien flag_no_asm = 1; 53552284Sobrien flag_no_nonansi_builtin = 1; 53690075Sobrien flag_noniso_default_format_attributes = 0; 53790075Sobrien flag_isoc99 = 0; 53896549Sobrien flag_bsd_format = 0; 53996557Sobrien flag_bsd_no_warn_kr_main = 0; 54052284Sobrien } 54152284Sobrien else if (!strcmp (argstart, "iso9899:199409")) 54252284Sobrien { 54390075Sobrien flag_isoc94 = 1; 54490075Sobrien goto iso_1994; 54552284Sobrien } 54652284Sobrien else if (!strcmp (argstart, "iso9899:199x") 54790075Sobrien || !strcmp (argstart, "iso9899:1999") 54890075Sobrien || !strcmp (argstart, "c9x") 54990075Sobrien || !strcmp (argstart, "c99")) 55052284Sobrien { 55152284Sobrien flag_traditional = 0; 55252284Sobrien flag_writable_strings = 0; 55352284Sobrien flag_no_asm = 1; 55452284Sobrien flag_no_nonansi_builtin = 1; 55590075Sobrien flag_noniso_default_format_attributes = 0; 55690075Sobrien flag_isoc99 = 1; 55790075Sobrien flag_isoc94 = 1; 55896549Sobrien flag_bsd_format = 0; 55996557Sobrien flag_bsd_no_warn_kr_main = 0; 56052284Sobrien } 56152284Sobrien else if (!strcmp (argstart, "gnu89")) 56252284Sobrien { 56352284Sobrien flag_traditional = 0; 56452284Sobrien flag_writable_strings = 0; 56552284Sobrien flag_no_asm = 0; 56652284Sobrien flag_no_nonansi_builtin = 0; 56790075Sobrien flag_noniso_default_format_attributes = 1; 56890075Sobrien flag_isoc99 = 0; 56990075Sobrien flag_isoc94 = 0; 57096549Sobrien flag_bsd_format = 0; 57196557Sobrien flag_bsd_no_warn_kr_main = 0; 57252284Sobrien } 57390075Sobrien else if (!strcmp (argstart, "gnu9x") || !strcmp (argstart, "gnu99")) 57452284Sobrien { 57552284Sobrien flag_traditional = 0; 57652284Sobrien flag_writable_strings = 0; 57752284Sobrien flag_no_asm = 0; 57852284Sobrien flag_no_nonansi_builtin = 0; 57990075Sobrien flag_noniso_default_format_attributes = 1; 58090075Sobrien flag_isoc99 = 1; 58190075Sobrien flag_isoc94 = 1; 58296549Sobrien flag_bsd_format = 0; 58396557Sobrien flag_bsd_no_warn_kr_main = 0; 58452284Sobrien } 58596549Sobrien else if (!strcmp (argstart, "bsd")) 58696549Sobrien { 58796549Sobrien flag_traditional = 0; 58896549Sobrien flag_writable_strings = 0; 58996549Sobrien flag_no_asm = 0; 59096549Sobrien flag_no_nonansi_builtin = 0; 59196549Sobrien flag_noniso_default_format_attributes = 1; 59296549Sobrien flag_isoc99 = 0; 59396549Sobrien flag_isoc94 = 0; 59496549Sobrien flag_isoc94 = 0; 59596549Sobrien flag_bsd_format = 1; 59696557Sobrien flag_bsd_no_warn_kr_main = 1; 59796549Sobrien } 59852284Sobrien else 59952284Sobrien error ("unknown C standard `%s'", argstart); 60052284Sobrien } 60118334Speter else if (!strcmp (p, "-fdollars-in-identifiers")) 60250397Sobrien dollars_in_ident = 1; 60318334Speter else if (!strcmp (p, "-fno-dollars-in-identifiers")) 60418334Speter dollars_in_ident = 0; 60518334Speter else if (!strcmp (p, "-fsigned-char")) 60618334Speter flag_signed_char = 1; 60718334Speter else if (!strcmp (p, "-funsigned-char")) 60818334Speter flag_signed_char = 0; 60918334Speter else if (!strcmp (p, "-fno-signed-char")) 61018334Speter flag_signed_char = 0; 61118334Speter else if (!strcmp (p, "-fno-unsigned-char")) 61218334Speter flag_signed_char = 1; 61318334Speter else if (!strcmp (p, "-fsigned-bitfields") 61418334Speter || !strcmp (p, "-fno-unsigned-bitfields")) 61518334Speter { 61618334Speter flag_signed_bitfields = 1; 61718334Speter explicit_flag_signed_bitfields = 1; 61818334Speter } 61918334Speter else if (!strcmp (p, "-funsigned-bitfields") 62018334Speter || !strcmp (p, "-fno-signed-bitfields")) 62118334Speter { 62218334Speter flag_signed_bitfields = 0; 62318334Speter explicit_flag_signed_bitfields = 1; 62418334Speter } 62518334Speter else if (!strcmp (p, "-fshort-enums")) 62618334Speter flag_short_enums = 1; 62718334Speter else if (!strcmp (p, "-fno-short-enums")) 62818334Speter flag_short_enums = 0; 62990075Sobrien else if (!strcmp (p, "-fshort-wchar")) 63090075Sobrien flag_short_wchar = 1; 63190075Sobrien else if (!strcmp (p, "-fno-short-wchar")) 63290075Sobrien flag_short_wchar = 0; 63318334Speter else if (!strcmp (p, "-fcond-mismatch")) 63418334Speter flag_cond_mismatch = 1; 63518334Speter else if (!strcmp (p, "-fno-cond-mismatch")) 63618334Speter flag_cond_mismatch = 0; 63718334Speter else if (!strcmp (p, "-fshort-double")) 63818334Speter flag_short_double = 1; 63918334Speter else if (!strcmp (p, "-fno-short-double")) 64018334Speter flag_short_double = 0; 64118334Speter else if (!strcmp (p, "-fasm")) 64218334Speter flag_no_asm = 0; 64318334Speter else if (!strcmp (p, "-fno-asm")) 64418334Speter flag_no_asm = 1; 64518334Speter else if (!strcmp (p, "-fbuiltin")) 64618334Speter flag_no_builtin = 0; 64718334Speter else if (!strcmp (p, "-fno-builtin")) 64818334Speter flag_no_builtin = 1; 64990075Sobrien else if (!strncmp (p, "-fno-builtin-", strlen ("-fno-builtin-"))) 65090075Sobrien disable_builtin_function (p + strlen ("-fno-builtin-")); 65190075Sobrien else if (p[0] == '-' && p[1] == 'f' && dump_switch_p (p + 2)) 65290075Sobrien ; 65318334Speter else if (!strcmp (p, "-ansi")) 65452284Sobrien goto iso_1990; 65550397Sobrien else if (!strcmp (p, "-Werror-implicit-function-declaration")) 65650397Sobrien mesg_implicit_function_declaration = 2; 65750397Sobrien else if (!strcmp (p, "-Wimplicit-function-declaration")) 65850397Sobrien mesg_implicit_function_declaration = 1; 65950397Sobrien else if (!strcmp (p, "-Wno-implicit-function-declaration")) 66050397Sobrien mesg_implicit_function_declaration = 0; 66150397Sobrien else if (!strcmp (p, "-Wimplicit-int")) 66250397Sobrien warn_implicit_int = 1; 66350397Sobrien else if (!strcmp (p, "-Wno-implicit-int")) 66450397Sobrien warn_implicit_int = 0; 66518334Speter else if (!strcmp (p, "-Wimplicit")) 66650397Sobrien { 66750397Sobrien warn_implicit_int = 1; 66850397Sobrien if (mesg_implicit_function_declaration != 2) 66990075Sobrien mesg_implicit_function_declaration = 1; 67050397Sobrien } 67118334Speter else if (!strcmp (p, "-Wno-implicit")) 67250397Sobrien warn_implicit_int = 0, mesg_implicit_function_declaration = 0; 67350397Sobrien else if (!strcmp (p, "-Wlong-long")) 67450397Sobrien warn_long_long = 1; 67550397Sobrien else if (!strcmp (p, "-Wno-long-long")) 67650397Sobrien warn_long_long = 0; 67718334Speter else if (!strcmp (p, "-Wwrite-strings")) 67852284Sobrien flag_const_strings = 1; 67918334Speter else if (!strcmp (p, "-Wno-write-strings")) 68052284Sobrien flag_const_strings = 0; 68118334Speter else if (!strcmp (p, "-Wcast-qual")) 68218334Speter warn_cast_qual = 1; 68318334Speter else if (!strcmp (p, "-Wno-cast-qual")) 68418334Speter warn_cast_qual = 0; 68518334Speter else if (!strcmp (p, "-Wbad-function-cast")) 68618334Speter warn_bad_function_cast = 1; 68718334Speter else if (!strcmp (p, "-Wno-bad-function-cast")) 68818334Speter warn_bad_function_cast = 0; 68952284Sobrien else if (!strcmp (p, "-Wno-missing-noreturn")) 69052284Sobrien warn_missing_noreturn = 0; 69190075Sobrien else if (!strcmp (p, "-Wmissing-format-attribute")) 69290075Sobrien warn_missing_format_attribute = 1; 69390075Sobrien else if (!strcmp (p, "-Wno-missing-format-attribute")) 69490075Sobrien warn_missing_format_attribute = 0; 69518334Speter else if (!strcmp (p, "-Wpointer-arith")) 69618334Speter warn_pointer_arith = 1; 69718334Speter else if (!strcmp (p, "-Wno-pointer-arith")) 69818334Speter warn_pointer_arith = 0; 69918334Speter else if (!strcmp (p, "-Wstrict-prototypes")) 70018334Speter warn_strict_prototypes = 1; 70118334Speter else if (!strcmp (p, "-Wno-strict-prototypes")) 70218334Speter warn_strict_prototypes = 0; 70318334Speter else if (!strcmp (p, "-Wmissing-prototypes")) 70418334Speter warn_missing_prototypes = 1; 70518334Speter else if (!strcmp (p, "-Wno-missing-prototypes")) 70618334Speter warn_missing_prototypes = 0; 70718334Speter else if (!strcmp (p, "-Wmissing-declarations")) 70818334Speter warn_missing_declarations = 1; 70918334Speter else if (!strcmp (p, "-Wno-missing-declarations")) 71018334Speter warn_missing_declarations = 0; 71118334Speter else if (!strcmp (p, "-Wredundant-decls")) 71218334Speter warn_redundant_decls = 1; 71318334Speter else if (!strcmp (p, "-Wno-redundant-decls")) 71418334Speter warn_redundant_decls = 0; 71518334Speter else if (!strcmp (p, "-Wnested-externs")) 71618334Speter warn_nested_externs = 1; 71718334Speter else if (!strcmp (p, "-Wno-nested-externs")) 71818334Speter warn_nested_externs = 0; 71918334Speter else if (!strcmp (p, "-Wtraditional")) 72018334Speter warn_traditional = 1; 72118334Speter else if (!strcmp (p, "-Wno-traditional")) 72218334Speter warn_traditional = 0; 72390075Sobrien else if (!strncmp (p, "-Wformat=", 9)) 72490075Sobrien set_Wformat (atoi (p + 9)); 72518334Speter else if (!strcmp (p, "-Wformat")) 72690075Sobrien set_Wformat (1); 72718334Speter else if (!strcmp (p, "-Wno-format")) 72890075Sobrien set_Wformat (0); 72990075Sobrien else if (!strcmp (p, "-Wformat-y2k")) 73090075Sobrien warn_format_y2k = 1; 73190075Sobrien else if (!strcmp (p, "-Wno-format-y2k")) 73290075Sobrien warn_format_y2k = 0; 73390075Sobrien else if (!strcmp (p, "-Wformat-extra-args")) 73490075Sobrien warn_format_extra_args = 1; 73590075Sobrien else if (!strcmp (p, "-Wno-format-extra-args")) 73690075Sobrien warn_format_extra_args = 0; 73790075Sobrien else if (!strcmp (p, "-Wformat-nonliteral")) 73890075Sobrien warn_format_nonliteral = 1; 73990075Sobrien else if (!strcmp (p, "-Wno-format-nonliteral")) 74090075Sobrien warn_format_nonliteral = 0; 74190075Sobrien else if (!strcmp (p, "-Wformat-security")) 74290075Sobrien warn_format_security = 1; 74390075Sobrien else if (!strcmp (p, "-Wno-format-security")) 74490075Sobrien warn_format_security = 0; 74518334Speter else if (!strcmp (p, "-Wchar-subscripts")) 74618334Speter warn_char_subscripts = 1; 74718334Speter else if (!strcmp (p, "-Wno-char-subscripts")) 74818334Speter warn_char_subscripts = 0; 74918334Speter else if (!strcmp (p, "-Wconversion")) 75018334Speter warn_conversion = 1; 75118334Speter else if (!strcmp (p, "-Wno-conversion")) 75218334Speter warn_conversion = 0; 75318334Speter else if (!strcmp (p, "-Wparentheses")) 75418334Speter warn_parentheses = 1; 75518334Speter else if (!strcmp (p, "-Wno-parentheses")) 75618334Speter warn_parentheses = 0; 75718334Speter else if (!strcmp (p, "-Wreturn-type")) 75818334Speter warn_return_type = 1; 75918334Speter else if (!strcmp (p, "-Wno-return-type")) 76018334Speter warn_return_type = 0; 76190075Sobrien else if (!strcmp (p, "-Wsequence-point")) 76290075Sobrien warn_sequence_point = 1; 76390075Sobrien else if (!strcmp (p, "-Wno-sequence-point")) 76490075Sobrien warn_sequence_point = 0; 76518334Speter else if (!strcmp (p, "-Wcomment")) 76618334Speter ; /* cpp handles this one. */ 76718334Speter else if (!strcmp (p, "-Wno-comment")) 76818334Speter ; /* cpp handles this one. */ 76918334Speter else if (!strcmp (p, "-Wcomments")) 77018334Speter ; /* cpp handles this one. */ 77118334Speter else if (!strcmp (p, "-Wno-comments")) 77218334Speter ; /* cpp handles this one. */ 77318334Speter else if (!strcmp (p, "-Wtrigraphs")) 77418334Speter ; /* cpp handles this one. */ 77518334Speter else if (!strcmp (p, "-Wno-trigraphs")) 77618334Speter ; /* cpp handles this one. */ 77750397Sobrien else if (!strcmp (p, "-Wundef")) 77850397Sobrien ; /* cpp handles this one. */ 77950397Sobrien else if (!strcmp (p, "-Wno-undef")) 78050397Sobrien ; /* cpp handles this one. */ 78118334Speter else if (!strcmp (p, "-Wimport")) 78218334Speter ; /* cpp handles this one. */ 78318334Speter else if (!strcmp (p, "-Wno-import")) 78418334Speter ; /* cpp handles this one. */ 78518334Speter else if (!strcmp (p, "-Wmissing-braces")) 78618334Speter warn_missing_braces = 1; 78718334Speter else if (!strcmp (p, "-Wno-missing-braces")) 78818334Speter warn_missing_braces = 0; 78950397Sobrien else if (!strcmp (p, "-Wmain")) 79050397Sobrien warn_main = 1; 79150397Sobrien else if (!strcmp (p, "-Wno-main")) 79252284Sobrien warn_main = -1; 79350397Sobrien else if (!strcmp (p, "-Wsign-compare")) 79450397Sobrien warn_sign_compare = 1; 79550397Sobrien else if (!strcmp (p, "-Wno-sign-compare")) 79650397Sobrien warn_sign_compare = 0; 79790075Sobrien else if (!strcmp (p, "-Wfloat-equal")) 79890075Sobrien warn_float_equal = 1; 79990075Sobrien else if (!strcmp (p, "-Wno-float-equal")) 80090075Sobrien warn_float_equal = 0; 80150397Sobrien else if (!strcmp (p, "-Wmultichar")) 80250397Sobrien warn_multichar = 1; 80350397Sobrien else if (!strcmp (p, "-Wno-multichar")) 80450397Sobrien warn_multichar = 0; 80590075Sobrien else if (!strcmp (p, "-Wdiv-by-zero")) 80690075Sobrien warn_div_by_zero = 1; 80790075Sobrien else if (!strcmp (p, "-Wno-div-by-zero")) 80890075Sobrien warn_div_by_zero = 0; 80950397Sobrien else if (!strcmp (p, "-Wunknown-pragmas")) 81050397Sobrien /* Set to greater than 1, so that even unknown pragmas in system 81150397Sobrien headers will be warned about. */ 81250397Sobrien warn_unknown_pragmas = 2; 81350397Sobrien else if (!strcmp (p, "-Wno-unknown-pragmas")) 81450397Sobrien warn_unknown_pragmas = 0; 81518334Speter else if (!strcmp (p, "-Wall")) 81618334Speter { 81718334Speter /* We save the value of warn_uninitialized, since if they put 81818334Speter -Wuninitialized on the command line, we need to generate a 81918334Speter warning about not using it without also specifying -O. */ 82018334Speter if (warn_uninitialized != 1) 82118334Speter warn_uninitialized = 2; 82250397Sobrien warn_implicit_int = 1; 82350397Sobrien mesg_implicit_function_declaration = 1; 82418334Speter warn_return_type = 1; 82590075Sobrien set_Wunused (1); 82618334Speter warn_switch = 1; 82790075Sobrien set_Wformat (1); 82818334Speter warn_char_subscripts = 1; 82918334Speter warn_parentheses = 1; 83090075Sobrien warn_sequence_point = 1; 83118334Speter warn_missing_braces = 1; 83250397Sobrien /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding can turn 83350397Sobrien it off only if it's not explicit. */ 83450397Sobrien warn_main = 2; 83550397Sobrien /* Only warn about unknown pragmas that are not in system headers. */ 83650397Sobrien warn_unknown_pragmas = 1; 83718334Speter } 83818334Speter else 83950397Sobrien return strings_processed; 84018334Speter 84118334Speter return 1; 84218334Speter} 84318334Speter 84418334Spetervoid 84590075Sobrienc_print_identifier (file, node, indent) 84618334Speter FILE *file; 84718334Speter tree node; 84818334Speter int indent; 84918334Speter{ 85018334Speter print_node (file, "global", IDENTIFIER_GLOBAL_VALUE (node), indent + 4); 85118334Speter print_node (file, "local", IDENTIFIER_LOCAL_VALUE (node), indent + 4); 85218334Speter print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); 85318334Speter print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4); 85418334Speter print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4); 85518334Speter print_node (file, "limbo value", IDENTIFIER_LIMBO_VALUE (node), indent + 4); 85690075Sobrien if (C_IS_RESERVED_WORD (node)) 85790075Sobrien { 85890075Sobrien tree rid = ridpointers[C_RID_CODE (node)]; 85990075Sobrien indent_to (file, indent + 4); 86090075Sobrien fprintf (file, "rid "); 86190075Sobrien fprintf (file, HOST_PTR_PRINTF, (void *)rid); 86290075Sobrien fprintf (file, " \"%s\"", IDENTIFIER_POINTER (rid)); 86390075Sobrien } 86418334Speter} 86518334Speter 86618334Speter/* Hook called at end of compilation to assume 1 elt 86790075Sobrien for a top-level tentative array defn that wasn't complete before. */ 86890075Sobrien 86918334Spetervoid 87018334Speterfinish_incomplete_decl (decl) 87118334Speter tree decl; 87218334Speter{ 87350397Sobrien if (TREE_CODE (decl) == VAR_DECL) 87418334Speter { 87518334Speter tree type = TREE_TYPE (decl); 87650397Sobrien if (type != error_mark_node 87750397Sobrien && TREE_CODE (type) == ARRAY_TYPE 87890075Sobrien && ! DECL_EXTERNAL (decl) 87950397Sobrien && TYPE_DOMAIN (type) == 0) 88018334Speter { 88190075Sobrien warning_with_decl (decl, "array `%s' assumed to have one element"); 88250397Sobrien 88318334Speter complete_array_type (type, NULL_TREE, 1); 88418334Speter 88518334Speter layout_decl (decl, 0); 88618334Speter } 88718334Speter } 88818334Speter} 88918334Speter 89018334Speter/* Create a new `struct binding_level'. */ 89118334Speter 89290075Sobrienstatic struct binding_level * 89318334Spetermake_binding_level () 89418334Speter{ 89518334Speter /* NOSTRICT */ 89618334Speter return (struct binding_level *) xmalloc (sizeof (struct binding_level)); 89718334Speter} 89818334Speter 89918334Speter/* Nonzero if we are currently in the global binding level. */ 90018334Speter 90118334Speterint 90218334Speterglobal_bindings_p () 90318334Speter{ 90418334Speter return current_binding_level == global_binding_level; 90518334Speter} 90618334Speter 90718334Spetervoid 90818334Speterkeep_next_level () 90918334Speter{ 91018334Speter keep_next_level_flag = 1; 91118334Speter} 91218334Speter 91318334Speter/* Nonzero if the current level needs to have a BLOCK made. */ 91418334Speter 91518334Speterint 91618334Speterkept_level_p () 91718334Speter{ 91818334Speter return ((current_binding_level->keep_if_subblocks 91918334Speter && current_binding_level->blocks != 0) 92018334Speter || current_binding_level->keep 92118334Speter || current_binding_level->names != 0 92218334Speter || (current_binding_level->tags != 0 92318334Speter && !current_binding_level->tag_transparent)); 92418334Speter} 92518334Speter 92618334Speter/* Identify this binding level as a level of parameters. 92718334Speter DEFINITION_FLAG is 1 for a definition, 0 for a declaration. 92818334Speter But it turns out there is no way to pass the right value for 92918334Speter DEFINITION_FLAG, so we ignore it. */ 93018334Speter 93118334Spetervoid 93218334Speterdeclare_parm_level (definition_flag) 93352284Sobrien int definition_flag ATTRIBUTE_UNUSED; 93418334Speter{ 93518334Speter current_binding_level->parm_flag = 1; 93618334Speter} 93718334Speter 93818334Speter/* Nonzero if currently making parm declarations. */ 93918334Speter 94018334Speterint 94118334Speterin_parm_level_p () 94218334Speter{ 94318334Speter return current_binding_level->parm_flag; 94418334Speter} 94518334Speter 94618334Speter/* Enter a new binding level. 94718334Speter If TAG_TRANSPARENT is nonzero, do so only for the name space of variables, 94818334Speter not for that of tags. */ 94918334Speter 95018334Spetervoid 95118334Speterpushlevel (tag_transparent) 95218334Speter int tag_transparent; 95318334Speter{ 95490075Sobrien struct binding_level *newlevel = NULL_BINDING_LEVEL; 95518334Speter 95618334Speter /* If this is the top level of a function, 95718334Speter just make sure that NAMED_LABELS is 0. */ 95818334Speter 95918334Speter if (current_binding_level == global_binding_level) 96018334Speter { 96118334Speter named_labels = 0; 96218334Speter } 96318334Speter 96418334Speter /* Reuse or create a struct for this binding level. */ 96518334Speter 96618334Speter if (free_binding_level) 96718334Speter { 96818334Speter newlevel = free_binding_level; 96918334Speter free_binding_level = free_binding_level->level_chain; 97018334Speter } 97118334Speter else 97218334Speter { 97318334Speter newlevel = make_binding_level (); 97418334Speter } 97518334Speter 97618334Speter /* Add this level to the front of the chain (stack) of levels that 97718334Speter are active. */ 97818334Speter 97918334Speter *newlevel = clear_binding_level; 98018334Speter newlevel->tag_transparent 98118334Speter = (tag_transparent 98218334Speter || (current_binding_level 98318334Speter ? current_binding_level->subblocks_tag_transparent 98418334Speter : 0)); 98518334Speter newlevel->level_chain = current_binding_level; 98618334Speter current_binding_level = newlevel; 98718334Speter newlevel->keep = keep_next_level_flag; 98818334Speter keep_next_level_flag = 0; 98918334Speter newlevel->keep_if_subblocks = keep_next_if_subblocks; 99018334Speter keep_next_if_subblocks = 0; 99118334Speter} 99218334Speter 99390075Sobrien/* Clear the limbo values of all identifiers defined in BLOCK or a subblock. */ 99450397Sobrien 99550397Sobrienstatic void 99650397Sobrienclear_limbo_values (block) 99750397Sobrien tree block; 99850397Sobrien{ 99950397Sobrien tree tem; 100050397Sobrien 100150397Sobrien for (tem = BLOCK_VARS (block); tem; tem = TREE_CHAIN (tem)) 100250397Sobrien if (DECL_NAME (tem) != 0) 100350397Sobrien IDENTIFIER_LIMBO_VALUE (DECL_NAME (tem)) = 0; 100450397Sobrien 100550397Sobrien for (tem = BLOCK_SUBBLOCKS (block); tem; tem = TREE_CHAIN (tem)) 100650397Sobrien clear_limbo_values (tem); 100750397Sobrien} 100890075Sobrien 100918334Speter/* Exit a binding level. 101018334Speter Pop the level off, and restore the state of the identifier-decl mappings 101118334Speter that were in effect when this level was entered. 101218334Speter 101318334Speter If KEEP is nonzero, this level had explicit declarations, so 101418334Speter and create a "block" (a BLOCK node) for the level 101518334Speter to record its declarations and subblocks for symbol table output. 101618334Speter 101718334Speter If FUNCTIONBODY is nonzero, this level is the body of a function, 101818334Speter so create a block as if KEEP were set and also clear out all 101918334Speter label names. 102018334Speter 102118334Speter If REVERSE is nonzero, reverse the order of decls before putting 102218334Speter them into the BLOCK. */ 102318334Speter 102418334Spetertree 102518334Speterpoplevel (keep, reverse, functionbody) 102618334Speter int keep; 102718334Speter int reverse; 102818334Speter int functionbody; 102918334Speter{ 103090075Sobrien tree link; 103118334Speter /* The chain of decls was accumulated in reverse order. 103218334Speter Put it into forward order, just for cleanliness. */ 103318334Speter tree decls; 103418334Speter tree tags = current_binding_level->tags; 103518334Speter tree subblocks = current_binding_level->blocks; 103618334Speter tree block = 0; 103718334Speter tree decl; 103818334Speter int block_previously_created; 103918334Speter 104018334Speter keep |= current_binding_level->keep; 104118334Speter 104218334Speter /* This warning is turned off because it causes warnings for 104318334Speter declarations like `extern struct foo *x'. */ 104418334Speter#if 0 104518334Speter /* Warn about incomplete structure types in this level. */ 104618334Speter for (link = tags; link; link = TREE_CHAIN (link)) 104790075Sobrien if (!COMPLETE_TYPE_P (TREE_VALUE (link))) 104818334Speter { 104918334Speter tree type = TREE_VALUE (link); 105052284Sobrien tree type_name = TYPE_NAME (type); 105152284Sobrien char *id = IDENTIFIER_POINTER (TREE_CODE (type_name) == IDENTIFIER_NODE 105252284Sobrien ? type_name 105352284Sobrien : DECL_NAME (type_name)); 105418334Speter switch (TREE_CODE (type)) 105518334Speter { 105618334Speter case RECORD_TYPE: 105752284Sobrien error ("`struct %s' incomplete in scope ending here", id); 105818334Speter break; 105918334Speter case UNION_TYPE: 106052284Sobrien error ("`union %s' incomplete in scope ending here", id); 106118334Speter break; 106218334Speter case ENUMERAL_TYPE: 106352284Sobrien error ("`enum %s' incomplete in scope ending here", id); 106418334Speter break; 106518334Speter } 106618334Speter } 106718334Speter#endif /* 0 */ 106818334Speter 106918334Speter /* Get the decls in the order they were written. 107018334Speter Usually current_binding_level->names is in reverse order. 107118334Speter But parameter decls were previously put in forward order. */ 107218334Speter 107318334Speter if (reverse) 107418334Speter current_binding_level->names 107518334Speter = decls = nreverse (current_binding_level->names); 107618334Speter else 107718334Speter decls = current_binding_level->names; 107818334Speter 107918334Speter /* Output any nested inline functions within this block 108018334Speter if they weren't already output. */ 108118334Speter 108218334Speter for (decl = decls; decl; decl = TREE_CHAIN (decl)) 108318334Speter if (TREE_CODE (decl) == FUNCTION_DECL 108418334Speter && ! TREE_ASM_WRITTEN (decl) 108518334Speter && DECL_INITIAL (decl) != 0 108618334Speter && TREE_ADDRESSABLE (decl)) 108718334Speter { 108818334Speter /* If this decl was copied from a file-scope decl 108918334Speter on account of a block-scope extern decl, 109018334Speter propagate TREE_ADDRESSABLE to the file-scope decl. 109118334Speter 109218334Speter DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is 109318334Speter true, since then the decl goes through save_for_inline_copying. */ 109418334Speter if (DECL_ABSTRACT_ORIGIN (decl) != 0 109518334Speter && DECL_ABSTRACT_ORIGIN (decl) != decl) 109618334Speter TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1; 109718334Speter } 109818334Speter 109990075Sobrien /* We used to warn about unused variables in expand_end_bindings, 110090075Sobrien i.e. while generating RTL. But in function-at-a-time mode we may 110190075Sobrien choose to never expand a function at all (e.g. auto inlining), so 110290075Sobrien we do this explicitly now. */ 110390075Sobrien warn_about_unused_variables (getdecls ()); 110490075Sobrien 110518334Speter /* If there were any declarations or structure tags in that level, 110618334Speter or if this level is a function body, 110718334Speter create a BLOCK to record them for the life of this function. */ 110818334Speter 110918334Speter block = 0; 111018334Speter block_previously_created = (current_binding_level->this_block != 0); 111118334Speter if (block_previously_created) 111218334Speter block = current_binding_level->this_block; 111318334Speter else if (keep || functionbody 111418334Speter || (current_binding_level->keep_if_subblocks && subblocks != 0)) 111518334Speter block = make_node (BLOCK); 111618334Speter if (block != 0) 111718334Speter { 111818334Speter BLOCK_VARS (block) = decls; 111918334Speter BLOCK_SUBBLOCKS (block) = subblocks; 112018334Speter } 112118334Speter 112218334Speter /* In each subblock, record that this is its superior. */ 112318334Speter 112418334Speter for (link = subblocks; link; link = TREE_CHAIN (link)) 112518334Speter BLOCK_SUPERCONTEXT (link) = block; 112618334Speter 112718334Speter /* Clear out the meanings of the local variables of this level. */ 112818334Speter 112918334Speter for (link = decls; link; link = TREE_CHAIN (link)) 113018334Speter { 113118334Speter if (DECL_NAME (link) != 0) 113218334Speter { 113318334Speter /* If the ident. was used or addressed via a local extern decl, 113418334Speter don't forget that fact. */ 113518334Speter if (DECL_EXTERNAL (link)) 113618334Speter { 113718334Speter if (TREE_USED (link)) 113818334Speter TREE_USED (DECL_NAME (link)) = 1; 113918334Speter if (TREE_ADDRESSABLE (link)) 114018334Speter TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1; 114118334Speter } 114218334Speter IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0; 114318334Speter } 114418334Speter } 114518334Speter 114618334Speter /* Restore all name-meanings of the outer levels 114718334Speter that were shadowed by this level. */ 114818334Speter 114918334Speter for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link)) 115018334Speter IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); 115118334Speter 115218334Speter /* If the level being exited is the top level of a function, 115318334Speter check over all the labels, and clear out the current 115418334Speter (function local) meanings of their names. */ 115518334Speter 115618334Speter if (functionbody) 115718334Speter { 115850397Sobrien clear_limbo_values (block); 115950397Sobrien 116018334Speter /* If this is the top level block of a function, 116118334Speter the vars are the function's parameters. 116218334Speter Don't leave them in the BLOCK because they are 116318334Speter found in the FUNCTION_DECL instead. */ 116418334Speter 116518334Speter BLOCK_VARS (block) = 0; 116618334Speter 116718334Speter /* Clear out the definitions of all label names, 116818334Speter since their scopes end here, 116918334Speter and add them to BLOCK_VARS. */ 117018334Speter 117118334Speter for (link = named_labels; link; link = TREE_CHAIN (link)) 117218334Speter { 117390075Sobrien tree label = TREE_VALUE (link); 117418334Speter 117518334Speter if (DECL_INITIAL (label) == 0) 117618334Speter { 117718334Speter error_with_decl (label, "label `%s' used but not defined"); 117818334Speter /* Avoid crashing later. */ 117918334Speter define_label (input_filename, lineno, 118018334Speter DECL_NAME (label)); 118118334Speter } 118290075Sobrien else if (warn_unused_label && !TREE_USED (label)) 118318334Speter warning_with_decl (label, "label `%s' defined but not used"); 118418334Speter IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0; 118518334Speter 118618334Speter /* Put the labels into the "variables" of the 118718334Speter top-level block, so debugger can see them. */ 118818334Speter TREE_CHAIN (label) = BLOCK_VARS (block); 118918334Speter BLOCK_VARS (block) = label; 119018334Speter } 119118334Speter } 119218334Speter 119318334Speter /* Pop the current level, and free the structure for reuse. */ 119418334Speter 119518334Speter { 119690075Sobrien struct binding_level *level = current_binding_level; 119718334Speter current_binding_level = current_binding_level->level_chain; 119818334Speter 119918334Speter level->level_chain = free_binding_level; 120018334Speter free_binding_level = level; 120118334Speter } 120218334Speter 120318334Speter /* Dispose of the block that we just made inside some higher level. */ 120418334Speter if (functionbody) 120518334Speter DECL_INITIAL (current_function_decl) = block; 120618334Speter else if (block) 120718334Speter { 120818334Speter if (!block_previously_created) 120990075Sobrien current_binding_level->blocks 121090075Sobrien = chainon (current_binding_level->blocks, block); 121118334Speter } 121218334Speter /* If we did not make a block for the level just exited, 121318334Speter any blocks made for inner levels 121418334Speter (since they cannot be recorded as subblocks in that level) 121518334Speter must be carried forward so they will later become subblocks 121618334Speter of something else. */ 121718334Speter else if (subblocks) 121818334Speter current_binding_level->blocks 121918334Speter = chainon (current_binding_level->blocks, subblocks); 122018334Speter 122118334Speter /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this 122218334Speter binding contour so that they point to the appropriate construct, i.e. 122318334Speter either to the current FUNCTION_DECL node, or else to the BLOCK node 122418334Speter we just constructed. 122518334Speter 122618334Speter Note that for tagged types whose scope is just the formal parameter 122718334Speter list for some function type specification, we can't properly set 122818334Speter their TYPE_CONTEXTs here, because we don't have a pointer to the 122918334Speter appropriate FUNCTION_TYPE node readily available to us. For those 123018334Speter cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set 123118334Speter in `grokdeclarator' as soon as we have created the FUNCTION_TYPE 123218334Speter node which will represent the "scope" for these "parameter list local" 123390075Sobrien tagged types. */ 123418334Speter 123518334Speter if (functionbody) 123618334Speter for (link = tags; link; link = TREE_CHAIN (link)) 123718334Speter TYPE_CONTEXT (TREE_VALUE (link)) = current_function_decl; 123818334Speter else if (block) 123918334Speter for (link = tags; link; link = TREE_CHAIN (link)) 124018334Speter TYPE_CONTEXT (TREE_VALUE (link)) = block; 124118334Speter 124218334Speter if (block) 124318334Speter TREE_USED (block) = 1; 124490075Sobrien 124518334Speter return block; 124618334Speter} 124718334Speter 124818334Speter/* Insert BLOCK at the end of the list of subblocks of the 124918334Speter current binding level. This is used when a BIND_EXPR is expanded, 125018334Speter to handle the BLOCK node inside the BIND_EXPR. */ 125118334Speter 125218334Spetervoid 125318334Speterinsert_block (block) 125418334Speter tree block; 125518334Speter{ 125618334Speter TREE_USED (block) = 1; 125718334Speter current_binding_level->blocks 125818334Speter = chainon (current_binding_level->blocks, block); 125918334Speter} 126018334Speter 126118334Speter/* Set the BLOCK node for the innermost scope 126218334Speter (the one we are currently in). */ 126318334Speter 126418334Spetervoid 126518334Speterset_block (block) 126690075Sobrien tree block; 126718334Speter{ 126818334Speter current_binding_level->this_block = block; 126990075Sobrien current_binding_level->names = chainon (current_binding_level->names, 127090075Sobrien BLOCK_VARS (block)); 127190075Sobrien current_binding_level->blocks = chainon (current_binding_level->blocks, 127290075Sobrien BLOCK_SUBBLOCKS (block)); 127318334Speter} 127418334Speter 127518334Spetervoid 127618334Speterpush_label_level () 127718334Speter{ 127890075Sobrien struct binding_level *newlevel; 127918334Speter 128018334Speter /* Reuse or create a struct for this binding level. */ 128118334Speter 128218334Speter if (free_binding_level) 128318334Speter { 128418334Speter newlevel = free_binding_level; 128518334Speter free_binding_level = free_binding_level->level_chain; 128618334Speter } 128718334Speter else 128818334Speter { 128918334Speter newlevel = make_binding_level (); 129018334Speter } 129118334Speter 129218334Speter /* Add this level to the front of the chain (stack) of label levels. */ 129318334Speter 129418334Speter newlevel->level_chain = label_level_chain; 129518334Speter label_level_chain = newlevel; 129618334Speter 129718334Speter newlevel->names = named_labels; 129818334Speter newlevel->shadowed = shadowed_labels; 129918334Speter named_labels = 0; 130018334Speter shadowed_labels = 0; 130118334Speter} 130218334Speter 130318334Spetervoid 130418334Speterpop_label_level () 130518334Speter{ 130690075Sobrien struct binding_level *level = label_level_chain; 130718334Speter tree link, prev; 130818334Speter 130918334Speter /* Clear out the definitions of the declared labels in this level. 131018334Speter Leave in the list any ordinary, non-declared labels. */ 131118334Speter for (link = named_labels, prev = 0; link;) 131218334Speter { 131318334Speter if (C_DECLARED_LABEL_FLAG (TREE_VALUE (link))) 131418334Speter { 131518334Speter if (DECL_SOURCE_LINE (TREE_VALUE (link)) == 0) 131618334Speter { 131718334Speter error_with_decl (TREE_VALUE (link), 131818334Speter "label `%s' used but not defined"); 131918334Speter /* Avoid crashing later. */ 132018334Speter define_label (input_filename, lineno, 132118334Speter DECL_NAME (TREE_VALUE (link))); 132218334Speter } 132390075Sobrien else if (warn_unused_label && !TREE_USED (TREE_VALUE (link))) 132490075Sobrien warning_with_decl (TREE_VALUE (link), 132518334Speter "label `%s' defined but not used"); 132618334Speter IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) = 0; 132718334Speter 132818334Speter /* Delete this element from the list. */ 132918334Speter link = TREE_CHAIN (link); 133018334Speter if (prev) 133118334Speter TREE_CHAIN (prev) = link; 133218334Speter else 133318334Speter named_labels = link; 133418334Speter } 133518334Speter else 133618334Speter { 133718334Speter prev = link; 133818334Speter link = TREE_CHAIN (link); 133918334Speter } 134018334Speter } 134118334Speter 134218334Speter /* Bring back all the labels that were shadowed. */ 134318334Speter for (link = shadowed_labels; link; link = TREE_CHAIN (link)) 134418334Speter if (DECL_NAME (TREE_VALUE (link)) != 0) 134518334Speter IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) 134618334Speter = TREE_VALUE (link); 134718334Speter 134818334Speter named_labels = chainon (named_labels, level->names); 134918334Speter shadowed_labels = level->shadowed; 135018334Speter 135118334Speter /* Pop the current level, and free the structure for reuse. */ 135218334Speter label_level_chain = label_level_chain->level_chain; 135318334Speter level->level_chain = free_binding_level; 135418334Speter free_binding_level = level; 135518334Speter} 135618334Speter 135718334Speter/* Push a definition or a declaration of struct, union or enum tag "name". 135818334Speter "type" should be the type node. 135918334Speter We assume that the tag "name" is not already defined. 136018334Speter 136118334Speter Note that the definition may really be just a forward reference. 136218334Speter In that case, the TYPE_SIZE will be zero. */ 136318334Speter 136418334Spetervoid 136518334Speterpushtag (name, type) 136618334Speter tree name, type; 136718334Speter{ 136890075Sobrien struct binding_level *b; 136918334Speter 137018334Speter /* Find the proper binding level for this type tag. */ 137118334Speter 137218334Speter for (b = current_binding_level; b->tag_transparent; b = b->level_chain) 137318334Speter continue; 137418334Speter 137518334Speter if (name) 137618334Speter { 137718334Speter /* Record the identifier as the type's name if it has none. */ 137818334Speter 137918334Speter if (TYPE_NAME (type) == 0) 138018334Speter TYPE_NAME (type) = name; 138118334Speter } 138218334Speter 138390075Sobrien b->tags = tree_cons (name, type, b->tags); 138418334Speter 138518334Speter /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE will be the 138618334Speter tagged type we just added to the current binding level. This fake 138718334Speter NULL-named TYPE_DECL node helps dwarfout.c to know when it needs 138818334Speter to output a representation of a tagged type, and it also gives 138918334Speter us a convenient place to record the "scope start" address for the 139018334Speter tagged type. */ 139118334Speter 139218334Speter TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type)); 139350397Sobrien 139450397Sobrien /* An approximation for now, so we can tell this is a function-scope tag. 139550397Sobrien This will be updated in poplevel. */ 139650397Sobrien TYPE_CONTEXT (type) = DECL_CONTEXT (TYPE_STUB_DECL (type)); 139718334Speter} 139818334Speter 139918334Speter/* Handle when a new declaration NEWDECL 140018334Speter has the same name as an old one OLDDECL 140118334Speter in the same binding contour. 140218334Speter Prints an error message if appropriate. 140318334Speter 140418334Speter If safely possible, alter OLDDECL to look like NEWDECL, and return 1. 140550397Sobrien Otherwise, return 0. 140618334Speter 140750397Sobrien When DIFFERENT_BINDING_LEVEL is true, NEWDECL is an external declaration, 140850397Sobrien and OLDDECL is in an outer binding level and should thus not be changed. */ 140950397Sobrien 141018334Speterstatic int 141150397Sobrienduplicate_decls (newdecl, olddecl, different_binding_level) 141290075Sobrien tree newdecl, olddecl; 141350397Sobrien int different_binding_level; 141418334Speter{ 141518334Speter int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); 141618334Speter int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL 141718334Speter && DECL_INITIAL (newdecl) != 0); 141818334Speter tree oldtype = TREE_TYPE (olddecl); 141918334Speter tree newtype = TREE_TYPE (newdecl); 142052284Sobrien int errmsg = 0; 142118334Speter 142290075Sobrien if (DECL_P (olddecl)) 142390075Sobrien { 142490075Sobrien if (TREE_CODE (newdecl) == FUNCTION_DECL 142590075Sobrien && TREE_CODE (olddecl) == FUNCTION_DECL 142690075Sobrien && (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl))) 142790075Sobrien { 142890075Sobrien if (DECL_DECLARED_INLINE_P (newdecl) 142990075Sobrien && DECL_UNINLINABLE (newdecl) 143090075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) 143190075Sobrien /* Already warned elsewhere. */; 143290075Sobrien else if (DECL_DECLARED_INLINE_P (olddecl) 143390075Sobrien && DECL_UNINLINABLE (olddecl) 143490075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) 143590075Sobrien /* Already warned. */; 143690075Sobrien else if (DECL_DECLARED_INLINE_P (newdecl) 143790075Sobrien && ! DECL_DECLARED_INLINE_P (olddecl) 143890075Sobrien && DECL_UNINLINABLE (olddecl) 143990075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) 144090075Sobrien { 144190075Sobrien warning_with_decl (newdecl, 144290075Sobrien "function `%s' redeclared as inline"); 144390075Sobrien warning_with_decl (olddecl, 144490075Sobrien "previous declaration of function `%s' with attribute noinline"); 144590075Sobrien } 144690075Sobrien else if (DECL_DECLARED_INLINE_P (olddecl) 144790075Sobrien && DECL_UNINLINABLE (newdecl) 144890075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) 144990075Sobrien { 145090075Sobrien warning_with_decl (newdecl, 145190075Sobrien "function `%s' redeclared with attribute noinline"); 145290075Sobrien warning_with_decl (olddecl, 145390075Sobrien "previous declaration of function `%s' was inline"); 145490075Sobrien } 145590075Sobrien } 145618334Speter 145790075Sobrien DECL_ATTRIBUTES (newdecl) 145890075Sobrien = (*targetm.merge_decl_attributes) (olddecl, newdecl); 145990075Sobrien } 146090075Sobrien 146118334Speter if (TREE_CODE (newtype) == ERROR_MARK 146218334Speter || TREE_CODE (oldtype) == ERROR_MARK) 146318334Speter types_match = 0; 146418334Speter 146518334Speter /* New decl is completely inconsistent with the old one => 146618334Speter tell caller to replace the old one. 146718334Speter This is always an error except in the case of shadowing a builtin. */ 146818334Speter if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) 146918334Speter { 147018334Speter if (TREE_CODE (olddecl) == FUNCTION_DECL 147118334Speter && (DECL_BUILT_IN (olddecl) 147218334Speter || DECL_BUILT_IN_NONANSI (olddecl))) 147318334Speter { 147418334Speter /* If you declare a built-in or predefined function name as static, 147518334Speter the old definition is overridden, 147618334Speter but optionally warn this was a bad choice of name. */ 147718334Speter if (!TREE_PUBLIC (newdecl)) 147818334Speter { 147918334Speter if (!warn_shadow) 148018334Speter ; 148118334Speter else if (DECL_BUILT_IN (olddecl)) 148218334Speter warning_with_decl (newdecl, "shadowing built-in function `%s'"); 148318334Speter else 148418334Speter warning_with_decl (newdecl, "shadowing library function `%s'"); 148518334Speter } 148618334Speter /* Likewise, if the built-in is not ansi, then programs can 148718334Speter override it even globally without an error. */ 148818334Speter else if (! DECL_BUILT_IN (olddecl)) 148918334Speter warning_with_decl (newdecl, 149018334Speter "library function `%s' declared as non-function"); 149118334Speter 149218334Speter else if (DECL_BUILT_IN_NONANSI (olddecl)) 149318334Speter warning_with_decl (newdecl, 149418334Speter "built-in function `%s' declared as non-function"); 149518334Speter else 149618334Speter warning_with_decl (newdecl, 149790075Sobrien "built-in function `%s' declared as non-function"); 149818334Speter } 149918334Speter else 150018334Speter { 150118334Speter error_with_decl (newdecl, "`%s' redeclared as different kind of symbol"); 150218334Speter error_with_decl (olddecl, "previous declaration of `%s'"); 150318334Speter } 150418334Speter 150518334Speter return 0; 150618334Speter } 150718334Speter 150818334Speter /* For real parm decl following a forward decl, 150918334Speter return 1 so old decl will be reused. */ 151018334Speter if (types_match && TREE_CODE (newdecl) == PARM_DECL 151118334Speter && TREE_ASM_WRITTEN (olddecl) && ! TREE_ASM_WRITTEN (newdecl)) 151218334Speter return 1; 151318334Speter 151418334Speter /* The new declaration is the same kind of object as the old one. 151518334Speter The declarations may partially match. Print warnings if they don't 151618334Speter match enough. Ultimately, copy most of the information from the new 151718334Speter decl to the old one, and keep using the old one. */ 151818334Speter 151918334Speter if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL 152018334Speter && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (newdecl)) == olddecl 152118334Speter && DECL_INITIAL (olddecl) == 0) 152218334Speter /* If -traditional, avoid error for redeclaring fcn 152318334Speter after implicit decl. */ 152418334Speter ; 152518334Speter else if (TREE_CODE (olddecl) == FUNCTION_DECL 152618334Speter && DECL_BUILT_IN (olddecl)) 152718334Speter { 152818334Speter /* A function declaration for a built-in function. */ 152918334Speter if (!TREE_PUBLIC (newdecl)) 153018334Speter { 153118334Speter /* If you declare a built-in function name as static, the 153218334Speter built-in definition is overridden, 153318334Speter but optionally warn this was a bad choice of name. */ 153418334Speter if (warn_shadow) 153518334Speter warning_with_decl (newdecl, "shadowing built-in function `%s'"); 153618334Speter /* Discard the old built-in function. */ 153718334Speter return 0; 153818334Speter } 153918334Speter else if (!types_match) 154018334Speter { 154190075Sobrien /* Accept the return type of the new declaration if same modes. */ 154250397Sobrien tree oldreturntype = TREE_TYPE (oldtype); 154350397Sobrien tree newreturntype = TREE_TYPE (newtype); 154418334Speter 154590075Sobrien if (TYPE_MODE (oldreturntype) == TYPE_MODE (newreturntype)) 154618334Speter { 154718334Speter /* Function types may be shared, so we can't just modify 154818334Speter the return type of olddecl's function type. */ 154950397Sobrien tree trytype 155018334Speter = build_function_type (newreturntype, 155150397Sobrien TYPE_ARG_TYPES (oldtype)); 155290075Sobrien trytype = build_type_attribute_variant (trytype, 155390075Sobrien TYPE_ATTRIBUTES (oldtype)); 155490075Sobrien 155550397Sobrien types_match = comptypes (newtype, trytype); 155618334Speter if (types_match) 155750397Sobrien oldtype = trytype; 155818334Speter } 155918334Speter /* Accept harmless mismatch in first argument type also. 156090075Sobrien This is for the ffs and fprintf builtins. */ 156118334Speter if (TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != 0 156250397Sobrien && TYPE_ARG_TYPES (oldtype) != 0 156350397Sobrien && TREE_VALUE (TYPE_ARG_TYPES (newtype)) != 0 156450397Sobrien && TREE_VALUE (TYPE_ARG_TYPES (oldtype)) != 0 156550397Sobrien && (TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (newtype))) 156650397Sobrien == TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (oldtype))))) 156718334Speter { 156818334Speter /* Function types may be shared, so we can't just modify 156918334Speter the return type of olddecl's function type. */ 157050397Sobrien tree trytype 157150397Sobrien = build_function_type (TREE_TYPE (oldtype), 157290075Sobrien tree_cons (NULL_TREE, 157350397Sobrien TREE_VALUE (TYPE_ARG_TYPES (newtype)), 157450397Sobrien TREE_CHAIN (TYPE_ARG_TYPES (oldtype)))); 157590075Sobrien trytype = build_type_attribute_variant (trytype, 157690075Sobrien TYPE_ATTRIBUTES (oldtype)); 157790075Sobrien 157890075Sobrien types_match = comptypes (newtype, trytype); 157918334Speter if (types_match) 158050397Sobrien oldtype = trytype; 158118334Speter } 158250397Sobrien if (! different_binding_level) 158350397Sobrien TREE_TYPE (olddecl) = oldtype; 158418334Speter } 158596263Sobrien else if (TYPE_ARG_TYPES (oldtype) == NULL 158696263Sobrien && TYPE_ARG_TYPES (newtype) != NULL) 158796263Sobrien { 158896263Sobrien /* For bcmp, bzero, fputs the builtin type has arguments not 158996263Sobrien specified. Use the ones from the prototype so that type checking 159096263Sobrien is done for them. */ 159196263Sobrien tree trytype 159296263Sobrien = build_function_type (TREE_TYPE (oldtype), 159396263Sobrien TYPE_ARG_TYPES (newtype)); 159496263Sobrien trytype = build_type_attribute_variant (trytype, 159596263Sobrien TYPE_ATTRIBUTES (oldtype)); 159696263Sobrien 159796263Sobrien oldtype = trytype; 159896263Sobrien if (! different_binding_level) 159996263Sobrien TREE_TYPE (olddecl) = oldtype; 160096263Sobrien } 160118334Speter if (!types_match) 160218334Speter { 160318334Speter /* If types don't match for a built-in, throw away the built-in. */ 160418334Speter warning_with_decl (newdecl, "conflicting types for built-in function `%s'"); 160518334Speter return 0; 160618334Speter } 160718334Speter } 160818334Speter else if (TREE_CODE (olddecl) == FUNCTION_DECL 160918334Speter && DECL_SOURCE_LINE (olddecl) == 0) 161018334Speter { 161118334Speter /* A function declaration for a predeclared function 161218334Speter that isn't actually built in. */ 161318334Speter if (!TREE_PUBLIC (newdecl)) 161418334Speter { 161518334Speter /* If you declare it as static, the 161618334Speter default definition is overridden. */ 161718334Speter return 0; 161818334Speter } 161918334Speter else if (!types_match) 162018334Speter { 162118334Speter /* If the types don't match, preserve volatility indication. 162218334Speter Later on, we will discard everything else about the 162318334Speter default declaration. */ 162418334Speter TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl); 162518334Speter } 162618334Speter } 162718334Speter /* Permit char *foo () to match void *foo (...) if not pedantic, 162818334Speter if one of them came from a system header file. */ 162918334Speter else if (!types_match 163018334Speter && TREE_CODE (olddecl) == FUNCTION_DECL 163118334Speter && TREE_CODE (newdecl) == FUNCTION_DECL 163218334Speter && TREE_CODE (TREE_TYPE (oldtype)) == POINTER_TYPE 163318334Speter && TREE_CODE (TREE_TYPE (newtype)) == POINTER_TYPE 163418334Speter && (DECL_IN_SYSTEM_HEADER (olddecl) 163518334Speter || DECL_IN_SYSTEM_HEADER (newdecl)) 163618334Speter && ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (newtype))) == void_type_node 163718334Speter && TYPE_ARG_TYPES (oldtype) == 0 163818334Speter && self_promoting_args_p (TYPE_ARG_TYPES (newtype)) 163918334Speter && TREE_TYPE (TREE_TYPE (oldtype)) == char_type_node) 164018334Speter || 164118334Speter (TREE_TYPE (TREE_TYPE (newtype)) == char_type_node 164218334Speter && TYPE_ARG_TYPES (newtype) == 0 164318334Speter && self_promoting_args_p (TYPE_ARG_TYPES (oldtype)) 164418334Speter && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node))) 164518334Speter { 164618334Speter if (pedantic) 164718334Speter pedwarn_with_decl (newdecl, "conflicting types for `%s'"); 164818334Speter /* Make sure we keep void * as ret type, not char *. */ 164918334Speter if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node) 165018334Speter TREE_TYPE (newdecl) = newtype = oldtype; 165118334Speter 165218334Speter /* Set DECL_IN_SYSTEM_HEADER, so that if we see another declaration 165318334Speter we will come back here again. */ 165418334Speter DECL_IN_SYSTEM_HEADER (newdecl) = 1; 165518334Speter } 165618334Speter else if (!types_match 165718334Speter /* Permit char *foo (int, ...); followed by char *foo (); 165818334Speter if not pedantic. */ 165918334Speter && ! (TREE_CODE (olddecl) == FUNCTION_DECL 166018334Speter && ! pedantic 166118334Speter /* Return types must still match. */ 166218334Speter && comptypes (TREE_TYPE (oldtype), 166318334Speter TREE_TYPE (newtype)) 166418334Speter && TYPE_ARG_TYPES (newtype) == 0)) 166518334Speter { 166618334Speter error_with_decl (newdecl, "conflicting types for `%s'"); 166718334Speter /* Check for function type mismatch 166818334Speter involving an empty arglist vs a nonempty one. */ 166918334Speter if (TREE_CODE (olddecl) == FUNCTION_DECL 167018334Speter && comptypes (TREE_TYPE (oldtype), 167118334Speter TREE_TYPE (newtype)) 167218334Speter && ((TYPE_ARG_TYPES (oldtype) == 0 167318334Speter && DECL_INITIAL (olddecl) == 0) 167418334Speter || 167518334Speter (TYPE_ARG_TYPES (newtype) == 0 167618334Speter && DECL_INITIAL (newdecl) == 0))) 167718334Speter { 167818334Speter /* Classify the problem further. */ 167990075Sobrien tree t = TYPE_ARG_TYPES (oldtype); 168018334Speter if (t == 0) 168118334Speter t = TYPE_ARG_TYPES (newtype); 168218334Speter for (; t; t = TREE_CHAIN (t)) 168318334Speter { 168490075Sobrien tree type = TREE_VALUE (t); 168518334Speter 168618334Speter if (TREE_CHAIN (t) == 0 168718334Speter && TYPE_MAIN_VARIANT (type) != void_type_node) 168818334Speter { 168990075Sobrien error ("a parameter list with an ellipsis can't match an empty parameter name list declaration"); 169018334Speter break; 169118334Speter } 169218334Speter 169390075Sobrien if (simple_type_promotes_to (type) != NULL_TREE) 169418334Speter { 169590075Sobrien error ("an argument type that has a default promotion can't match an empty parameter name list declaration"); 169618334Speter break; 169718334Speter } 169818334Speter } 169918334Speter } 170018334Speter error_with_decl (olddecl, "previous declaration of `%s'"); 170118334Speter } 170218334Speter else 170318334Speter { 170418334Speter errmsg = redeclaration_error_message (newdecl, olddecl); 170518334Speter if (errmsg) 170618334Speter { 170752284Sobrien switch (errmsg) 170852284Sobrien { 170952284Sobrien case 1: 171052284Sobrien error_with_decl (newdecl, "redefinition of `%s'"); 171152284Sobrien break; 171252284Sobrien case 2: 171352284Sobrien error_with_decl (newdecl, "redeclaration of `%s'"); 171452284Sobrien break; 171552284Sobrien case 3: 171652284Sobrien error_with_decl (newdecl, "conflicting declarations of `%s'"); 171752284Sobrien break; 171852284Sobrien default: 171952284Sobrien abort (); 172052284Sobrien } 172152284Sobrien 172218334Speter error_with_decl (olddecl, 172318334Speter ((DECL_INITIAL (olddecl) 172418334Speter && current_binding_level == global_binding_level) 172518334Speter ? "`%s' previously defined here" 172618334Speter : "`%s' previously declared here")); 172796263Sobrien return 0; 172818334Speter } 172918334Speter else if (TREE_CODE (newdecl) == TYPE_DECL 173090075Sobrien && (DECL_IN_SYSTEM_HEADER (olddecl) 173118334Speter || DECL_IN_SYSTEM_HEADER (newdecl))) 173218334Speter { 173318334Speter warning_with_decl (newdecl, "redefinition of `%s'"); 173490075Sobrien warning_with_decl 173518334Speter (olddecl, 173618334Speter ((DECL_INITIAL (olddecl) 173718334Speter && current_binding_level == global_binding_level) 173818334Speter ? "`%s' previously defined here" 173918334Speter : "`%s' previously declared here")); 174018334Speter } 174118334Speter else if (TREE_CODE (olddecl) == FUNCTION_DECL 174218334Speter && DECL_INITIAL (olddecl) != 0 174318334Speter && TYPE_ARG_TYPES (oldtype) == 0 174418334Speter && TYPE_ARG_TYPES (newtype) != 0 174518334Speter && TYPE_ACTUAL_ARG_TYPES (oldtype) != 0) 174618334Speter { 174790075Sobrien tree type, parm; 174890075Sobrien int nargs; 174918334Speter /* Prototype decl follows defn w/o prototype. */ 175018334Speter 175118334Speter for (parm = TYPE_ACTUAL_ARG_TYPES (oldtype), 175218334Speter type = TYPE_ARG_TYPES (newtype), 175318334Speter nargs = 1; 175452284Sobrien ; 175518334Speter parm = TREE_CHAIN (parm), type = TREE_CHAIN (type), nargs++) 175618334Speter { 175718334Speter if (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == void_type_node 175852284Sobrien && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node) 175952284Sobrien { 176052284Sobrien warning_with_decl (newdecl, "prototype for `%s' follows"); 176152284Sobrien warning_with_decl (olddecl, "non-prototype definition here"); 176252284Sobrien break; 176352284Sobrien } 176452284Sobrien if (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == void_type_node 176518334Speter || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node) 176618334Speter { 176790075Sobrien error_with_decl (newdecl, 176890075Sobrien "prototype for `%s' follows and number of arguments doesn't match"); 176952284Sobrien error_with_decl (olddecl, "non-prototype definition here"); 177052284Sobrien errmsg = 1; 177118334Speter break; 177218334Speter } 177318334Speter /* Type for passing arg must be consistent 177418334Speter with that declared for the arg. */ 177518334Speter if (! comptypes (TREE_VALUE (parm), TREE_VALUE (type)) 177618334Speter /* If -traditional, allow `unsigned int' instead of `int' 177718334Speter in the prototype. */ 177818334Speter && (! (flag_traditional 177918334Speter && TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == integer_type_node 178018334Speter && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node))) 178118334Speter { 178252284Sobrien error_with_decl (newdecl, 178352284Sobrien "prototype for `%s' follows and argument %d doesn't match", 178452284Sobrien nargs); 178552284Sobrien error_with_decl (olddecl, "non-prototype definition here"); 178652284Sobrien errmsg = 1; 178718334Speter break; 178818334Speter } 178918334Speter } 179018334Speter } 179118334Speter /* Warn about mismatches in various flags. */ 179218334Speter else 179318334Speter { 179418334Speter /* Warn if function is now inline 179518334Speter but was previously declared not inline and has been called. */ 179618334Speter if (TREE_CODE (olddecl) == FUNCTION_DECL 179790075Sobrien && ! DECL_DECLARED_INLINE_P (olddecl) 179890075Sobrien && DECL_DECLARED_INLINE_P (newdecl) 179918334Speter && TREE_USED (olddecl)) 180018334Speter warning_with_decl (newdecl, 180118334Speter "`%s' declared inline after being called"); 180218334Speter if (TREE_CODE (olddecl) == FUNCTION_DECL 180390075Sobrien && ! DECL_DECLARED_INLINE_P (olddecl) 180490075Sobrien && DECL_DECLARED_INLINE_P (newdecl) 180518334Speter && DECL_INITIAL (olddecl) != 0) 180618334Speter warning_with_decl (newdecl, 180718334Speter "`%s' declared inline after its definition"); 180818334Speter 180918334Speter /* If pedantic, warn when static declaration follows a non-static 181018334Speter declaration. Otherwise, do so only for functions. */ 181118334Speter if ((pedantic || TREE_CODE (olddecl) == FUNCTION_DECL) 181218334Speter && TREE_PUBLIC (olddecl) 181318334Speter && !TREE_PUBLIC (newdecl)) 181418334Speter warning_with_decl (newdecl, "static declaration for `%s' follows non-static"); 181518334Speter 181652284Sobrien /* If warn_traditional, warn when a non-static function 181790075Sobrien declaration follows a static one. */ 181890075Sobrien if (warn_traditional && !in_system_header 181952284Sobrien && TREE_CODE (olddecl) == FUNCTION_DECL 182052284Sobrien && !TREE_PUBLIC (olddecl) 182152284Sobrien && TREE_PUBLIC (newdecl)) 182252284Sobrien warning_with_decl (newdecl, "non-static declaration for `%s' follows static"); 182352284Sobrien 182418334Speter /* Warn when const declaration follows a non-const 182518334Speter declaration, but not for functions. */ 182618334Speter if (TREE_CODE (olddecl) != FUNCTION_DECL 182718334Speter && !TREE_READONLY (olddecl) 182818334Speter && TREE_READONLY (newdecl)) 182918334Speter warning_with_decl (newdecl, "const declaration for `%s' follows non-const"); 183018334Speter /* These bits are logically part of the type, for variables. 183118334Speter But not for functions 183218334Speter (where qualifiers are not valid ANSI anyway). */ 183318334Speter else if (pedantic && TREE_CODE (olddecl) != FUNCTION_DECL 183418334Speter && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl) 183518334Speter || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl))) 183618334Speter pedwarn_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl"); 183718334Speter } 183818334Speter } 183918334Speter 184018334Speter /* Optionally warn about more than one declaration for the same name. */ 184118334Speter if (errmsg == 0 && warn_redundant_decls && DECL_SOURCE_LINE (olddecl) != 0 184250397Sobrien /* Don't warn about a function declaration 184318334Speter followed by a definition. */ 184418334Speter && !(TREE_CODE (newdecl) == FUNCTION_DECL && DECL_INITIAL (newdecl) != 0 184518334Speter && DECL_INITIAL (olddecl) == 0) 184618334Speter /* Don't warn about extern decl followed by (tentative) definition. */ 184718334Speter && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl))) 184818334Speter { 184918334Speter warning_with_decl (newdecl, "redundant redeclaration of `%s' in same scope"); 185018334Speter warning_with_decl (olddecl, "previous declaration of `%s'"); 185118334Speter } 185218334Speter 185318334Speter /* Copy all the DECL_... slots specified in the new decl 185418334Speter except for any that we copy here from the old type. 185518334Speter 185618334Speter Past this point, we don't change OLDTYPE and NEWTYPE 185718334Speter even if we change the types of NEWDECL and OLDDECL. */ 185818334Speter 185918334Speter if (types_match) 186018334Speter { 186150397Sobrien /* When copying info to olddecl, we store into write_olddecl 186250397Sobrien instead. This allows us to avoid modifying olddecl when 186350397Sobrien different_binding_level is true. */ 186450397Sobrien tree write_olddecl = different_binding_level ? newdecl : olddecl; 186550397Sobrien 186618334Speter /* Merge the data types specified in the two decls. */ 186718334Speter if (TREE_CODE (newdecl) != FUNCTION_DECL || !DECL_BUILT_IN (olddecl)) 186850397Sobrien { 186950397Sobrien if (different_binding_level) 187090075Sobrien { 187190075Sobrien if (TYPE_ARG_TYPES (oldtype) != 0 187290075Sobrien && TYPE_ARG_TYPES (newtype) == 0) 187390075Sobrien TREE_TYPE (newdecl) = common_type (newtype, oldtype); 187490075Sobrien else 187590075Sobrien TREE_TYPE (newdecl) 187690075Sobrien = build_type_attribute_variant 187790075Sobrien (newtype, 187890075Sobrien merge_attributes (TYPE_ATTRIBUTES (newtype), 187990075Sobrien TYPE_ATTRIBUTES (oldtype))); 188090075Sobrien } 188150397Sobrien else 188250397Sobrien TREE_TYPE (newdecl) 188350397Sobrien = TREE_TYPE (olddecl) 188450397Sobrien = common_type (newtype, oldtype); 188550397Sobrien } 188618334Speter 188718334Speter /* Lay the type out, unless already done. */ 188818334Speter if (oldtype != TREE_TYPE (newdecl)) 188918334Speter { 189018334Speter if (TREE_TYPE (newdecl) != error_mark_node) 189118334Speter layout_type (TREE_TYPE (newdecl)); 189218334Speter if (TREE_CODE (newdecl) != FUNCTION_DECL 189318334Speter && TREE_CODE (newdecl) != TYPE_DECL 189418334Speter && TREE_CODE (newdecl) != CONST_DECL) 189518334Speter layout_decl (newdecl, 0); 189618334Speter } 189718334Speter else 189818334Speter { 189918334Speter /* Since the type is OLDDECL's, make OLDDECL's size go with. */ 190018334Speter DECL_SIZE (newdecl) = DECL_SIZE (olddecl); 190190075Sobrien DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl); 190257844Sobrien DECL_MODE (newdecl) = DECL_MODE (olddecl); 190318334Speter if (TREE_CODE (olddecl) != FUNCTION_DECL) 190418334Speter if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) 190590075Sobrien { 190690075Sobrien DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); 190790075Sobrien DECL_USER_ALIGN (newdecl) |= DECL_ALIGN (olddecl); 190890075Sobrien } 190918334Speter } 191018334Speter 191118334Speter /* Keep the old rtl since we can safely use it. */ 191290075Sobrien COPY_DECL_RTL (olddecl, newdecl); 191318334Speter 191418334Speter /* Merge the type qualifiers. */ 191590075Sobrien if (TREE_CODE (olddecl) == FUNCTION_DECL 191690075Sobrien && DECL_BUILT_IN_NONANSI (olddecl) && TREE_THIS_VOLATILE (olddecl) 191790075Sobrien && ! TREE_THIS_VOLATILE (newdecl)) 191850397Sobrien TREE_THIS_VOLATILE (write_olddecl) = 0; 191990075Sobrien 192018334Speter if (TREE_READONLY (newdecl)) 192150397Sobrien TREE_READONLY (write_olddecl) = 1; 192290075Sobrien 192318334Speter if (TREE_THIS_VOLATILE (newdecl)) 192418334Speter { 192550397Sobrien TREE_THIS_VOLATILE (write_olddecl) = 1; 192690075Sobrien if (TREE_CODE (newdecl) == VAR_DECL 192790075Sobrien /* If an automatic variable is re-declared in the same 192890075Sobrien function scope, but the old declaration was not 192990075Sobrien volatile, make_var_volatile() would crash because the 193090075Sobrien variable would have been assigned to a pseudo, not a 193190075Sobrien MEM. Since this duplicate declaration is invalid 193290075Sobrien anyway, we just skip the call. */ 193390075Sobrien && errmsg == 0) 193418334Speter make_var_volatile (newdecl); 193518334Speter } 193618334Speter 193750397Sobrien /* Keep source location of definition rather than declaration. */ 193850397Sobrien /* When called with different_binding_level set, keep the old 193950397Sobrien information so that meaningful diagnostics can be given. */ 194050397Sobrien if (DECL_INITIAL (newdecl) == 0 && DECL_INITIAL (olddecl) != 0 194150397Sobrien && ! different_binding_level) 194218334Speter { 194318334Speter DECL_SOURCE_LINE (newdecl) = DECL_SOURCE_LINE (olddecl); 194418334Speter DECL_SOURCE_FILE (newdecl) = DECL_SOURCE_FILE (olddecl); 194518334Speter } 194618334Speter 194718334Speter /* Merge the unused-warning information. */ 194818334Speter if (DECL_IN_SYSTEM_HEADER (olddecl)) 194918334Speter DECL_IN_SYSTEM_HEADER (newdecl) = 1; 195018334Speter else if (DECL_IN_SYSTEM_HEADER (newdecl)) 195150397Sobrien DECL_IN_SYSTEM_HEADER (write_olddecl) = 1; 195218334Speter 195318334Speter /* Merge the initialization information. */ 195450397Sobrien /* When called with different_binding_level set, don't copy over 195550397Sobrien DECL_INITIAL, so that we don't accidentally change function 195650397Sobrien declarations into function definitions. */ 195750397Sobrien if (DECL_INITIAL (newdecl) == 0 && ! different_binding_level) 195818334Speter DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); 195918334Speter 196018334Speter /* Merge the section attribute. 196118334Speter We want to issue an error if the sections conflict but that must be 196218334Speter done later in decl_attributes since we are called before attributes 196318334Speter are assigned. */ 196418334Speter if (DECL_SECTION_NAME (newdecl) == NULL_TREE) 196518334Speter DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl); 196618334Speter 196790075Sobrien /* Copy the assembler name. 196890075Sobrien Currently, it can only be defined in the prototype. */ 196990075Sobrien COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); 197090075Sobrien 197118334Speter if (TREE_CODE (newdecl) == FUNCTION_DECL) 197218334Speter { 197318334Speter DECL_STATIC_CONSTRUCTOR(newdecl) |= DECL_STATIC_CONSTRUCTOR(olddecl); 197418334Speter DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl); 197590075Sobrien DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl); 197652284Sobrien DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl) 197752284Sobrien |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl); 197818334Speter } 197918334Speter } 198018334Speter /* If cannot merge, then use the new type and qualifiers, 198118334Speter and don't preserve the old rtl. */ 198250397Sobrien else if (! different_binding_level) 198318334Speter { 198418334Speter TREE_TYPE (olddecl) = TREE_TYPE (newdecl); 198518334Speter TREE_READONLY (olddecl) = TREE_READONLY (newdecl); 198618334Speter TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl); 198718334Speter TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl); 198818334Speter } 198918334Speter 199018334Speter /* Merge the storage class information. */ 199196263Sobrien merge_weak (newdecl, olddecl); 199296263Sobrien 199318334Speter /* For functions, static overrides non-static. */ 199418334Speter if (TREE_CODE (newdecl) == FUNCTION_DECL) 199518334Speter { 199618334Speter TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl); 199718334Speter /* This is since we don't automatically 199818334Speter copy the attributes of NEWDECL into OLDDECL. */ 199950397Sobrien /* No need to worry about different_binding_level here because 200050397Sobrien then TREE_PUBLIC (newdecl) was true. */ 200118334Speter TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl); 200218334Speter /* If this clears `static', clear it in the identifier too. */ 200318334Speter if (! TREE_PUBLIC (olddecl)) 200418334Speter TREE_PUBLIC (DECL_NAME (olddecl)) = 0; 200518334Speter } 200618334Speter if (DECL_EXTERNAL (newdecl)) 200718334Speter { 200890075Sobrien if (! different_binding_level) 200990075Sobrien { 201090075Sobrien /* Don't mess with these flags on local externs; they remain 201190075Sobrien external even if there's a declaration at file scope which 201290075Sobrien isn't. */ 201390075Sobrien TREE_STATIC (newdecl) = TREE_STATIC (olddecl); 201490075Sobrien DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl); 201590075Sobrien } 201618334Speter /* An extern decl does not override previous storage class. */ 201718334Speter TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); 201850397Sobrien if (! DECL_EXTERNAL (newdecl)) 201950397Sobrien DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl); 202018334Speter } 202118334Speter else 202218334Speter { 202318334Speter TREE_STATIC (olddecl) = TREE_STATIC (newdecl); 202418334Speter TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl); 202518334Speter } 202618334Speter 202750397Sobrien if (TREE_CODE (newdecl) == FUNCTION_DECL) 202818334Speter { 202990075Sobrien /* If we're redefining a function previously defined as extern 203090075Sobrien inline, make sure we emit debug info for the inline before we 203190075Sobrien throw it away, in case it was inlined into a function that hasn't 203290075Sobrien been written out yet. */ 203390075Sobrien if (new_is_definition && DECL_INITIAL (olddecl) && TREE_USED (olddecl)) 203490075Sobrien { 203590075Sobrien (*debug_hooks->outlining_inline_function) (olddecl); 203690075Sobrien 203790075Sobrien /* The new defn must not be inline. */ 203890075Sobrien DECL_INLINE (newdecl) = 0; 203990075Sobrien DECL_UNINLINABLE (newdecl) = 1; 204090075Sobrien } 204190075Sobrien else 204290075Sobrien { 204390075Sobrien /* If either decl says `inline', this fn is inline, 204490075Sobrien unless its definition was passed already. */ 204590075Sobrien if (DECL_DECLARED_INLINE_P (newdecl) 204690075Sobrien || DECL_DECLARED_INLINE_P (olddecl)) 204790075Sobrien DECL_DECLARED_INLINE_P (newdecl) = 1; 204890075Sobrien 204990075Sobrien DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl) 205090075Sobrien = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl)); 205190075Sobrien } 205290075Sobrien 205318334Speter if (DECL_BUILT_IN (olddecl)) 205418334Speter { 205550397Sobrien /* Get rid of any built-in function if new arg types don't match it 205650397Sobrien or if we have a function definition. */ 205750397Sobrien if (! types_match || new_is_definition) 205850397Sobrien { 205950397Sobrien if (! different_binding_level) 206050397Sobrien { 206150397Sobrien TREE_TYPE (olddecl) = TREE_TYPE (newdecl); 206290075Sobrien DECL_BUILT_IN_CLASS (olddecl) = NOT_BUILT_IN; 206350397Sobrien } 206450397Sobrien } 206550397Sobrien else 206650397Sobrien { 206750397Sobrien /* If redeclaring a builtin function, and not a definition, 206850397Sobrien it stays built in. */ 206990075Sobrien DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl); 207050397Sobrien DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl); 207150397Sobrien } 207218334Speter } 207390075Sobrien 207450397Sobrien /* Also preserve various other info from the definition. */ 207550397Sobrien if (! new_is_definition) 207650397Sobrien { 207750397Sobrien DECL_RESULT (newdecl) = DECL_RESULT (olddecl); 207850397Sobrien /* When called with different_binding_level set, don't copy over 207950397Sobrien DECL_INITIAL, so that we don't accidentally change function 208050397Sobrien declarations into function definitions. */ 208150397Sobrien if (! different_binding_level) 208250397Sobrien DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); 208350397Sobrien DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl); 208490075Sobrien DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl); 208590075Sobrien DECL_NUM_STMTS (newdecl) = DECL_NUM_STMTS (olddecl); 208650397Sobrien DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); 208790075Sobrien 208890075Sobrien /* Set DECL_INLINE on the declaration if we've got a body 208990075Sobrien from which to instantiate. */ 209090075Sobrien if (DECL_INLINE (olddecl) && ! DECL_UNINLINABLE (newdecl)) 209190075Sobrien { 209290075Sobrien DECL_INLINE (newdecl) = 1; 209390075Sobrien DECL_ABSTRACT_ORIGIN (newdecl) 209490075Sobrien = (different_binding_level 209590075Sobrien ? DECL_ORIGIN (olddecl) 209690075Sobrien : DECL_ABSTRACT_ORIGIN (olddecl)); 209790075Sobrien } 209850397Sobrien } 209990075Sobrien else 210090075Sobrien { 210190075Sobrien /* If a previous declaration said inline, mark the 210290075Sobrien definition as inlinable. */ 210390075Sobrien if (DECL_DECLARED_INLINE_P (newdecl) 210490075Sobrien && ! DECL_UNINLINABLE (newdecl)) 210590075Sobrien DECL_INLINE (newdecl) = 1; 210690075Sobrien } 210750397Sobrien } 210850397Sobrien if (different_binding_level) 210990075Sobrien return 0; 211018334Speter 211118334Speter /* Copy most of the decl-specific fields of NEWDECL into OLDDECL. 211250397Sobrien But preserve OLDDECL's DECL_UID. */ 211318334Speter { 211490075Sobrien unsigned olddecl_uid = DECL_UID (olddecl); 211518334Speter 211690075Sobrien memcpy ((char *) olddecl + sizeof (struct tree_common), 211790075Sobrien (char *) newdecl + sizeof (struct tree_common), 211890075Sobrien sizeof (struct tree_decl) - sizeof (struct tree_common)); 211918334Speter DECL_UID (olddecl) = olddecl_uid; 212018334Speter } 212118334Speter 212250397Sobrien /* NEWDECL contains the merged attribute lists. 212350397Sobrien Update OLDDECL to be the same. */ 212490075Sobrien DECL_ATTRIBUTES (olddecl) = DECL_ATTRIBUTES (newdecl); 212550397Sobrien 212618334Speter return 1; 212718334Speter} 212818334Speter 212990075Sobrien/* Check whether decl-node X shadows an existing declaration. 213090075Sobrien OLDLOCAL is the old IDENTIFIER_LOCAL_VALUE of the DECL_NAME of X, 213190075Sobrien which might be a NULL_TREE. */ 213290075Sobrienstatic void 213390075Sobrienwarn_if_shadowing (x, oldlocal) 213490075Sobrien tree x, oldlocal; 213590075Sobrien{ 213690075Sobrien tree name; 213790075Sobrien 213890075Sobrien if (DECL_EXTERNAL (x)) 213990075Sobrien return; 214090075Sobrien 214190075Sobrien name = DECL_NAME (x); 214290075Sobrien 214390075Sobrien /* Warn if shadowing an argument at the top level of the body. */ 214490075Sobrien if (oldlocal != 0 214590075Sobrien /* This warning doesn't apply to the parms of a nested fcn. */ 214690075Sobrien && ! current_binding_level->parm_flag 214790075Sobrien /* Check that this is one level down from the parms. */ 214890075Sobrien && current_binding_level->level_chain->parm_flag 214990075Sobrien /* Check that the decl being shadowed 215090075Sobrien comes from the parm level, one level up. */ 215190075Sobrien && chain_member (oldlocal, current_binding_level->level_chain->names)) 215290075Sobrien { 215390075Sobrien if (TREE_CODE (oldlocal) == PARM_DECL) 215490075Sobrien pedwarn ("declaration of `%s' shadows a parameter", 215590075Sobrien IDENTIFIER_POINTER (name)); 215690075Sobrien else 215790075Sobrien pedwarn ("declaration of `%s' shadows a symbol from the parameter list", 215890075Sobrien IDENTIFIER_POINTER (name)); 215990075Sobrien } 216090075Sobrien /* Maybe warn if shadowing something else. */ 216190075Sobrien else if (warn_shadow 216290075Sobrien /* No shadow warnings for internally generated vars. */ 216390075Sobrien && DECL_SOURCE_LINE (x) != 0 216490075Sobrien /* No shadow warnings for vars made for inlining. */ 216590075Sobrien && ! DECL_FROM_INLINE (x)) 216690075Sobrien { 216790075Sobrien if (TREE_CODE (x) == PARM_DECL 216890075Sobrien && current_binding_level->level_chain->parm_flag) 216990075Sobrien /* Don't warn about the parm names in function declarator 217090075Sobrien within a function declarator. 217190075Sobrien It would be nice to avoid warning in any function 217290075Sobrien declarator in a declaration, as opposed to a definition, 217390075Sobrien but there is no way to tell it's not a definition. */ 217490075Sobrien ; 217590075Sobrien else if (oldlocal) 217690075Sobrien { 217790075Sobrien if (TREE_CODE (oldlocal) == PARM_DECL) 217890075Sobrien shadow_warning ("a parameter", name, oldlocal); 217990075Sobrien else 218090075Sobrien shadow_warning ("a previous local", name, oldlocal); 218190075Sobrien } 218290075Sobrien else if (IDENTIFIER_GLOBAL_VALUE (name) != 0 218390075Sobrien && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node) 218490075Sobrien shadow_warning ("a global declaration", name, 218590075Sobrien IDENTIFIER_GLOBAL_VALUE (name)); 218690075Sobrien } 218790075Sobrien} 218890075Sobrien 218918334Speter/* Record a decl-node X as belonging to the current lexical scope. 219018334Speter Check for errors (such as an incompatible declaration for the same 219118334Speter name already seen in the same scope). 219218334Speter 219318334Speter Returns either X or an old decl for the same name. 219418334Speter If an old decl is returned, it may have been smashed 219518334Speter to agree with what X says. */ 219618334Speter 219718334Spetertree 219818334Speterpushdecl (x) 219918334Speter tree x; 220018334Speter{ 220190075Sobrien tree t; 220290075Sobrien tree name = DECL_NAME (x); 220390075Sobrien struct binding_level *b = current_binding_level; 220418334Speter 220590075Sobrien /* Functions need the lang_decl data. */ 220690075Sobrien if (TREE_CODE (x) == FUNCTION_DECL && ! DECL_LANG_SPECIFIC (x)) 220790075Sobrien DECL_LANG_SPECIFIC (x) = (struct lang_decl *) 220890075Sobrien ggc_alloc_cleared (sizeof (struct lang_decl)); 220990075Sobrien 221018334Speter DECL_CONTEXT (x) = current_function_decl; 221118334Speter /* A local extern declaration for a function doesn't constitute nesting. 221218334Speter A local auto declaration does, since it's a forward decl 221318334Speter for a nested function coming later. */ 221490075Sobrien if ((TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL) 221590075Sobrien && DECL_INITIAL (x) == 0 && DECL_EXTERNAL (x)) 221618334Speter DECL_CONTEXT (x) = 0; 221718334Speter 221818334Speter if (name) 221918334Speter { 222050397Sobrien int different_binding_level = 0; 222118334Speter 222290075Sobrien if (warn_nested_externs 222390075Sobrien && DECL_EXTERNAL (x) 222490075Sobrien && b != global_binding_level 222590075Sobrien && x != IDENTIFIER_IMPLICIT_DECL (name) 222690075Sobrien /* No error messages for __FUNCTION__ and __PRETTY_FUNCTION__. */ 222790075Sobrien && !DECL_IN_SYSTEM_HEADER (x)) 222890075Sobrien warning ("nested extern declaration of `%s'", 222990075Sobrien IDENTIFIER_POINTER (name)); 223090075Sobrien 223150397Sobrien t = lookup_name_current_level (name); 223218334Speter /* Don't type check externs here when -traditional. This is so that 223318334Speter code with conflicting declarations inside blocks will get warnings 223418334Speter not errors. X11 for instance depends on this. */ 223550397Sobrien if (! t && DECL_EXTERNAL (x) && TREE_PUBLIC (x) && ! flag_traditional) 223650397Sobrien { 223796263Sobrien t = IDENTIFIER_GLOBAL_VALUE (name); 223850397Sobrien /* Type decls at global scope don't conflict with externs declared 223950397Sobrien inside lexical blocks. */ 224096263Sobrien if (! t || TREE_CODE (t) == TYPE_DECL) 224196263Sobrien /* If there's no visible global declaration, try for an 224296263Sobrien invisible one. */ 224396263Sobrien t = IDENTIFIER_LIMBO_VALUE (name); 224450397Sobrien different_binding_level = 1; 224550397Sobrien } 224618334Speter if (t != 0 && t == error_mark_node) 224718334Speter /* error_mark_node is 0 for a while during initialization! */ 224818334Speter { 224918334Speter t = 0; 225018334Speter error_with_decl (x, "`%s' used prior to declaration"); 225118334Speter } 225218334Speter 225350397Sobrien /* If this decl is `static' and an implicit decl was seen previously, 225450397Sobrien warn. But don't complain if -traditional, 225550397Sobrien since traditional compilers don't complain. */ 225650397Sobrien if (! flag_traditional && TREE_PUBLIC (name) 225750397Sobrien /* Don't test for DECL_EXTERNAL, because grokdeclarator 225850397Sobrien sets this for all functions. */ 225950397Sobrien && ! TREE_PUBLIC (x) 226050397Sobrien && (TREE_CODE (x) == FUNCTION_DECL || b == global_binding_level) 226150397Sobrien /* We used to warn also for explicit extern followed by static, 226250397Sobrien but sometimes you need to do it that way. */ 226350397Sobrien && IDENTIFIER_IMPLICIT_DECL (name) != 0) 226418334Speter { 226550397Sobrien pedwarn ("`%s' was declared implicitly `extern' and later `static'", 226650397Sobrien IDENTIFIER_POINTER (name)); 226750397Sobrien pedwarn_with_file_and_line 226850397Sobrien (DECL_SOURCE_FILE (IDENTIFIER_IMPLICIT_DECL (name)), 226950397Sobrien DECL_SOURCE_LINE (IDENTIFIER_IMPLICIT_DECL (name)), 227050397Sobrien "previous declaration of `%s'", 227150397Sobrien IDENTIFIER_POINTER (name)); 227250397Sobrien TREE_THIS_VOLATILE (name) = 1; 227350397Sobrien } 227450397Sobrien 227550397Sobrien if (t != 0 && duplicate_decls (x, t, different_binding_level)) 227650397Sobrien { 227718334Speter if (TREE_CODE (t) == PARM_DECL) 227818334Speter { 227918334Speter /* Don't allow more than one "real" duplicate 228018334Speter of a forward parm decl. */ 228118334Speter TREE_ASM_WRITTEN (t) = TREE_ASM_WRITTEN (x); 228218334Speter return t; 228318334Speter } 228450397Sobrien return t; 228518334Speter } 228618334Speter 228718334Speter /* If we are processing a typedef statement, generate a whole new 228818334Speter ..._TYPE node (which will be just an variant of the existing 228918334Speter ..._TYPE node with identical properties) and then install the 229018334Speter TYPE_DECL node generated to represent the typedef name as the 229118334Speter TYPE_NAME of this brand new (duplicate) ..._TYPE node. 229218334Speter 229318334Speter The whole point here is to end up with a situation where each 229418334Speter and every ..._TYPE node the compiler creates will be uniquely 229518334Speter associated with AT MOST one node representing a typedef name. 229618334Speter This way, even though the compiler substitutes corresponding 229718334Speter ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very 229818334Speter early on, later parts of the compiler can always do the reverse 229918334Speter translation and get back the corresponding typedef name. For 230018334Speter example, given: 230118334Speter 230218334Speter typedef struct S MY_TYPE; 230318334Speter MY_TYPE object; 230418334Speter 230518334Speter Later parts of the compiler might only know that `object' was of 230650397Sobrien type `struct S' if it were not for code just below. With this 230718334Speter code however, later parts of the compiler see something like: 230818334Speter 230918334Speter struct S' == struct S 231018334Speter typedef struct S' MY_TYPE; 231118334Speter struct S' object; 231218334Speter 231318334Speter And they can then deduce (from the node for type struct S') that 231418334Speter the original object declaration was: 231518334Speter 231618334Speter MY_TYPE object; 231718334Speter 231818334Speter Being able to do this is important for proper support of protoize, 231918334Speter and also for generating precise symbolic debugging information 232018334Speter which takes full account of the programmer's (typedef) vocabulary. 232118334Speter 232218334Speter Obviously, we don't want to generate a duplicate ..._TYPE node if 232318334Speter the TYPE_DECL node that we are now processing really represents a 232418334Speter standard built-in type. 232518334Speter 232618334Speter Since all standard types are effectively declared at line zero 232718334Speter in the source file, we can easily check to see if we are working 232818334Speter on a standard type by checking the current value of lineno. */ 232918334Speter 233018334Speter if (TREE_CODE (x) == TYPE_DECL) 233190075Sobrien { 233290075Sobrien if (DECL_SOURCE_LINE (x) == 0) 233390075Sobrien { 233418334Speter if (TYPE_NAME (TREE_TYPE (x)) == 0) 233590075Sobrien TYPE_NAME (TREE_TYPE (x)) = x; 233690075Sobrien } 233790075Sobrien else if (TREE_TYPE (x) != error_mark_node 233850397Sobrien && DECL_ORIGINAL_TYPE (x) == NULL_TREE) 233990075Sobrien { 234090075Sobrien tree tt = TREE_TYPE (x); 234150397Sobrien DECL_ORIGINAL_TYPE (x) = tt; 234290075Sobrien tt = build_type_copy (tt); 234390075Sobrien TYPE_NAME (tt) = x; 234490075Sobrien TREE_USED (tt) = TREE_USED (x); 234590075Sobrien TREE_TYPE (x) = tt; 234690075Sobrien } 234790075Sobrien } 234818334Speter 234918334Speter /* Multiple external decls of the same identifier ought to match. 235018334Speter Check against both global declarations (when traditional) and out of 235118334Speter scope (limbo) block level declarations. 235218334Speter 235318334Speter We get warnings about inline functions where they are defined. 235418334Speter Avoid duplicate warnings where they are used. */ 235590075Sobrien if (TREE_PUBLIC (x) 235690075Sobrien && ! (TREE_CODE (x) == FUNCTION_DECL && DECL_INLINE (x))) 235718334Speter { 235818334Speter tree decl; 235918334Speter 236018334Speter if (flag_traditional && IDENTIFIER_GLOBAL_VALUE (name) != 0 236118334Speter && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name)) 236218334Speter || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name)))) 236318334Speter decl = IDENTIFIER_GLOBAL_VALUE (name); 236418334Speter else if (IDENTIFIER_LIMBO_VALUE (name) != 0) 236518334Speter /* Decls in limbo are always extern, so no need to check that. */ 236618334Speter decl = IDENTIFIER_LIMBO_VALUE (name); 236718334Speter else 236818334Speter decl = 0; 236918334Speter 237018334Speter if (decl && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl)) 237118334Speter /* If old decl is built-in, we already warned if we should. */ 237218334Speter && !DECL_BUILT_IN (decl)) 237318334Speter { 237418334Speter pedwarn_with_decl (x, 237518334Speter "type mismatch with previous external decl"); 237618334Speter pedwarn_with_decl (decl, "previous external decl of `%s'"); 237718334Speter } 237818334Speter } 237918334Speter 238018334Speter /* If a function has had an implicit declaration, and then is defined, 238118334Speter make sure they are compatible. */ 238218334Speter 238318334Speter if (IDENTIFIER_IMPLICIT_DECL (name) != 0 238418334Speter && IDENTIFIER_GLOBAL_VALUE (name) == 0 238518334Speter && TREE_CODE (x) == FUNCTION_DECL 238618334Speter && ! comptypes (TREE_TYPE (x), 238718334Speter TREE_TYPE (IDENTIFIER_IMPLICIT_DECL (name)))) 238818334Speter { 238918334Speter warning_with_decl (x, "type mismatch with previous implicit declaration"); 239018334Speter warning_with_decl (IDENTIFIER_IMPLICIT_DECL (name), 239118334Speter "previous implicit declaration of `%s'"); 239218334Speter } 239318334Speter 239418334Speter /* In PCC-compatibility mode, extern decls of vars with no current decl 239518334Speter take effect at top level no matter where they are. */ 239618334Speter if (flag_traditional && DECL_EXTERNAL (x) 239718334Speter && lookup_name (name) == 0) 239818334Speter { 239918334Speter tree type = TREE_TYPE (x); 240018334Speter 240118334Speter /* But don't do this if the type contains temporary nodes. */ 240218334Speter while (type) 240318334Speter { 240418334Speter if (type == error_mark_node) 240518334Speter break; 240690075Sobrien if (TYPE_CONTEXT (type)) 240718334Speter { 240818334Speter warning_with_decl (x, "type of external `%s' is not global"); 240918334Speter /* By exiting the loop early, we leave TYPE nonzero, 241018334Speter and thus prevent globalization of the decl. */ 241118334Speter break; 241218334Speter } 241318334Speter else if (TREE_CODE (type) == FUNCTION_TYPE 241418334Speter && TYPE_ARG_TYPES (type) != 0) 241518334Speter /* The types might not be truly local, 241618334Speter but the list of arg types certainly is temporary. 241718334Speter Since prototypes are nontraditional, 241818334Speter ok not to do the traditional thing. */ 241918334Speter break; 242018334Speter type = TREE_TYPE (type); 242118334Speter } 242218334Speter 242318334Speter if (type == 0) 242418334Speter b = global_binding_level; 242518334Speter } 242618334Speter 242718334Speter /* This name is new in its binding level. 242818334Speter Install the new declaration and return it. */ 242918334Speter if (b == global_binding_level) 243018334Speter { 243118334Speter /* Install a global value. */ 243290075Sobrien 243318334Speter /* If the first global decl has external linkage, 243418334Speter warn if we later see static one. */ 243518334Speter if (IDENTIFIER_GLOBAL_VALUE (name) == 0 && TREE_PUBLIC (x)) 243618334Speter TREE_PUBLIC (name) = 1; 243718334Speter 243818334Speter IDENTIFIER_GLOBAL_VALUE (name) = x; 243918334Speter 244018334Speter /* We no longer care about any previous block level declarations. */ 244118334Speter IDENTIFIER_LIMBO_VALUE (name) = 0; 244218334Speter 244318334Speter /* Don't forget if the function was used via an implicit decl. */ 244418334Speter if (IDENTIFIER_IMPLICIT_DECL (name) 244518334Speter && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name))) 244618334Speter TREE_USED (x) = 1, TREE_USED (name) = 1; 244718334Speter 244818334Speter /* Don't forget if its address was taken in that way. */ 244918334Speter if (IDENTIFIER_IMPLICIT_DECL (name) 245018334Speter && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name))) 245118334Speter TREE_ADDRESSABLE (x) = 1; 245218334Speter 245318334Speter /* Warn about mismatches against previous implicit decl. */ 245418334Speter if (IDENTIFIER_IMPLICIT_DECL (name) != 0 245518334Speter /* If this real decl matches the implicit, don't complain. */ 245618334Speter && ! (TREE_CODE (x) == FUNCTION_DECL 245718334Speter && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (x))) 245818334Speter == integer_type_node))) 245918334Speter pedwarn ("`%s' was previously implicitly declared to return `int'", 246018334Speter IDENTIFIER_POINTER (name)); 246118334Speter 246218334Speter /* If this decl is `static' and an `extern' was seen previously, 246318334Speter that is erroneous. */ 246418334Speter if (TREE_PUBLIC (name) 246518334Speter && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x)) 246618334Speter { 246718334Speter /* Okay to redeclare an ANSI built-in as static. */ 246818334Speter if (t != 0 && DECL_BUILT_IN (t)) 246918334Speter ; 247018334Speter /* Okay to declare a non-ANSI built-in as anything. */ 247118334Speter else if (t != 0 && DECL_BUILT_IN_NONANSI (t)) 247218334Speter ; 247350397Sobrien /* Okay to have global type decl after an earlier extern 247450397Sobrien declaration inside a lexical block. */ 247550397Sobrien else if (TREE_CODE (x) == TYPE_DECL) 247650397Sobrien ; 247718334Speter else if (IDENTIFIER_IMPLICIT_DECL (name)) 247850397Sobrien { 247950397Sobrien if (! TREE_THIS_VOLATILE (name)) 248050397Sobrien pedwarn ("`%s' was declared implicitly `extern' and later `static'", 248150397Sobrien IDENTIFIER_POINTER (name)); 248250397Sobrien } 248318334Speter else 248418334Speter pedwarn ("`%s' was declared `extern' and later `static'", 248518334Speter IDENTIFIER_POINTER (name)); 248618334Speter } 248718334Speter } 248818334Speter else 248918334Speter { 249018334Speter /* Here to install a non-global value. */ 249118334Speter tree oldlocal = IDENTIFIER_LOCAL_VALUE (name); 249218334Speter tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name); 249390075Sobrien 249418334Speter IDENTIFIER_LOCAL_VALUE (name) = x; 249518334Speter 249618334Speter /* If this is an extern function declaration, see if we 249718334Speter have a global definition or declaration for the function. */ 249818334Speter if (oldlocal == 0 249918334Speter && oldglobal != 0 250018334Speter && TREE_CODE (x) == FUNCTION_DECL 250190075Sobrien && TREE_CODE (oldglobal) == FUNCTION_DECL 250290075Sobrien && DECL_EXTERNAL (x) 250390075Sobrien && ! DECL_DECLARED_INLINE_P (x)) 250418334Speter { 250518334Speter /* We have one. Their types must agree. */ 250618334Speter if (! comptypes (TREE_TYPE (x), 250718334Speter TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)))) 250818334Speter pedwarn_with_decl (x, "extern declaration of `%s' doesn't match global one"); 250918334Speter else 251018334Speter { 251118334Speter /* Inner extern decl is inline if global one is. 251218334Speter Copy enough to really inline it. */ 251390075Sobrien if (DECL_DECLARED_INLINE_P (oldglobal)) 251418334Speter { 251590075Sobrien DECL_DECLARED_INLINE_P (x) 251690075Sobrien = DECL_DECLARED_INLINE_P (oldglobal); 251718334Speter DECL_INLINE (x) = DECL_INLINE (oldglobal); 251818334Speter DECL_INITIAL (x) = (current_function_decl == oldglobal 251918334Speter ? 0 : DECL_INITIAL (oldglobal)); 252018334Speter DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal); 252190075Sobrien DECL_NUM_STMTS (x) = DECL_NUM_STMTS (oldglobal); 252218334Speter DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal); 252318334Speter DECL_RESULT (x) = DECL_RESULT (oldglobal); 252418334Speter TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal); 252590075Sobrien DECL_ABSTRACT_ORIGIN (x) 252690075Sobrien = DECL_ABSTRACT_ORIGIN (oldglobal); 252718334Speter } 252818334Speter /* Inner extern decl is built-in if global one is. */ 252918334Speter if (DECL_BUILT_IN (oldglobal)) 253018334Speter { 253190075Sobrien DECL_BUILT_IN_CLASS (x) = DECL_BUILT_IN_CLASS (oldglobal); 253218334Speter DECL_FUNCTION_CODE (x) = DECL_FUNCTION_CODE (oldglobal); 253318334Speter } 253418334Speter /* Keep the arg types from a file-scope fcn defn. */ 253518334Speter if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != 0 253618334Speter && DECL_INITIAL (oldglobal) 253718334Speter && TYPE_ARG_TYPES (TREE_TYPE (x)) == 0) 253818334Speter TREE_TYPE (x) = TREE_TYPE (oldglobal); 253918334Speter } 254018334Speter } 254118334Speter 254290075Sobrien#if 0 254390075Sobrien /* This case is probably sometimes the right thing to do. */ 254418334Speter /* If we have a local external declaration, 254518334Speter then any file-scope declaration should not 254618334Speter have been static. */ 254718334Speter if (oldlocal == 0 && oldglobal != 0 254818334Speter && !TREE_PUBLIC (oldglobal) 254918334Speter && DECL_EXTERNAL (x) && TREE_PUBLIC (x)) 255018334Speter warning ("`%s' locally external but globally static", 255118334Speter IDENTIFIER_POINTER (name)); 255218334Speter#endif 255318334Speter 255418334Speter /* If we have a local external declaration, 255518334Speter and no file-scope declaration has yet been seen, 255618334Speter then if we later have a file-scope decl it must not be static. */ 255718334Speter if (oldlocal == 0 255818334Speter && DECL_EXTERNAL (x) 255918334Speter && TREE_PUBLIC (x)) 256018334Speter { 256150397Sobrien if (oldglobal == 0) 256290075Sobrien TREE_PUBLIC (name) = 1; 256318334Speter 256418334Speter /* Save this decl, so that we can do type checking against 256518334Speter other decls after it falls out of scope. 256618334Speter 256718334Speter Only save it once. This prevents temporary decls created in 256818334Speter expand_inline_function from being used here, since this 256918334Speter will have been set when the inline function was parsed. 257018334Speter It also helps give slightly better warnings. */ 257118334Speter if (IDENTIFIER_LIMBO_VALUE (name) == 0) 257218334Speter IDENTIFIER_LIMBO_VALUE (name) = x; 257318334Speter } 257418334Speter 257590075Sobrien warn_if_shadowing (x, oldlocal); 257618334Speter 257718334Speter /* If storing a local value, there may already be one (inherited). 257818334Speter If so, record it for restoration when this binding level ends. */ 257918334Speter if (oldlocal != 0) 258018334Speter b->shadowed = tree_cons (name, oldlocal, b->shadowed); 258118334Speter } 258218334Speter 258390075Sobrien /* Keep count of variables in this level with incomplete type. 258490075Sobrien If the input is erroneous, we can have error_mark in the type 258590075Sobrien slot (e.g. "f(void a, ...)") - that doesn't count as an 258690075Sobrien incomplete type. */ 258790075Sobrien if (TREE_TYPE (x) != error_mark_node 258890075Sobrien && !COMPLETE_TYPE_P (TREE_TYPE (x))) 258990075Sobrien { 259090075Sobrien tree element = TREE_TYPE (x); 259190075Sobrien 259290075Sobrien while (TREE_CODE (element) == ARRAY_TYPE) 259390075Sobrien element = TREE_TYPE (element); 259490075Sobrien if (TREE_CODE (element) == RECORD_TYPE 259590075Sobrien || TREE_CODE (element) == UNION_TYPE) 259690075Sobrien ++b->n_incomplete; 259790075Sobrien } 259818334Speter } 259918334Speter 260018334Speter /* Put decls on list in reverse order. 260118334Speter We will reverse them later if necessary. */ 260218334Speter TREE_CHAIN (x) = b->names; 260318334Speter b->names = x; 260418334Speter 260518334Speter return x; 260618334Speter} 260718334Speter 260818334Speter/* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */ 260918334Speter 261018334Spetertree 261118334Speterpushdecl_top_level (x) 261218334Speter tree x; 261318334Speter{ 261490075Sobrien tree t; 261590075Sobrien struct binding_level *b = current_binding_level; 261618334Speter 261718334Speter current_binding_level = global_binding_level; 261818334Speter t = pushdecl (x); 261918334Speter current_binding_level = b; 262018334Speter return t; 262118334Speter} 262218334Speter 262318334Speter/* Generate an implicit declaration for identifier FUNCTIONID 262418334Speter as a function of type int (). Print a warning if appropriate. */ 262518334Speter 262618334Spetertree 262718334Speterimplicitly_declare (functionid) 262818334Speter tree functionid; 262918334Speter{ 263090075Sobrien tree decl; 263118334Speter int traditional_warning = 0; 263218334Speter /* Only one "implicit declaration" warning per identifier. */ 263318334Speter int implicit_warning; 263418334Speter 263518334Speter /* We used to reuse an old implicit decl here, 263618334Speter but this loses with inline functions because it can clobber 263718334Speter the saved decl chains. */ 263890075Sobrien#if 0 263990075Sobrien if (IDENTIFIER_IMPLICIT_DECL (functionid) != 0) 264018334Speter decl = IDENTIFIER_IMPLICIT_DECL (functionid); 264190075Sobrien else 264290075Sobrien#endif 264318334Speter decl = build_decl (FUNCTION_DECL, functionid, default_function_type); 264418334Speter 264518334Speter /* Warn of implicit decl following explicit local extern decl. 264618334Speter This is probably a program designed for traditional C. */ 264718334Speter if (TREE_PUBLIC (functionid) && IDENTIFIER_GLOBAL_VALUE (functionid) == 0) 264818334Speter traditional_warning = 1; 264918334Speter 265018334Speter /* Warn once of an implicit declaration. */ 265118334Speter implicit_warning = (IDENTIFIER_IMPLICIT_DECL (functionid) == 0); 265218334Speter 265318334Speter DECL_EXTERNAL (decl) = 1; 265418334Speter TREE_PUBLIC (decl) = 1; 265518334Speter 265618334Speter /* Record that we have an implicit decl and this is it. */ 265718334Speter IDENTIFIER_IMPLICIT_DECL (functionid) = decl; 265818334Speter 265918334Speter /* ANSI standard says implicit declarations are in the innermost block. 266018334Speter So we record the decl in the standard fashion. 266118334Speter If flag_traditional is set, pushdecl does it top-level. */ 266218334Speter pushdecl (decl); 266318334Speter 266418334Speter /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 266518334Speter maybe_objc_check_decl (decl); 266618334Speter 266790075Sobrien rest_of_decl_compilation (decl, NULL, 0, 0); 266818334Speter 266990075Sobrien if (implicit_warning) 267090075Sobrien implicit_decl_warning (functionid); 267118334Speter else if (warn_traditional && traditional_warning) 267218334Speter warning ("function `%s' was previously declared within a block", 267318334Speter IDENTIFIER_POINTER (functionid)); 267418334Speter 267518334Speter /* Write a record describing this implicit function declaration to the 267618334Speter prototypes file (if requested). */ 267718334Speter 267818334Speter gen_aux_info_record (decl, 0, 1, 0); 267918334Speter 268090075Sobrien /* Possibly apply some default attributes to this implicit declaration. */ 268190075Sobrien decl_attributes (&decl, NULL_TREE, 0); 268218334Speter 268318334Speter return decl; 268418334Speter} 268518334Speter 268690075Sobrienvoid 268790075Sobrienimplicit_decl_warning (id) 268890075Sobrien tree id; 268990075Sobrien{ 269090075Sobrien const char *name = IDENTIFIER_POINTER (id); 269190075Sobrien if (mesg_implicit_function_declaration == 2) 269290075Sobrien error ("implicit declaration of function `%s'", name); 269390075Sobrien else if (mesg_implicit_function_declaration == 1) 269490075Sobrien warning ("implicit declaration of function `%s'", name); 269590075Sobrien} 269690075Sobrien 269718334Speter/* Return zero if the declaration NEWDECL is valid 269818334Speter when the declaration OLDDECL (assumed to be for the same name) 269918334Speter has already been seen. 270052284Sobrien Otherwise return 1 if NEWDECL is a redefinition, 2 if it is a redeclaration, 270152284Sobrien and 3 if it is a conflicting declaration. */ 270218334Speter 270352284Sobrienstatic int 270418334Speterredeclaration_error_message (newdecl, olddecl) 270518334Speter tree newdecl, olddecl; 270618334Speter{ 270718334Speter if (TREE_CODE (newdecl) == TYPE_DECL) 270818334Speter { 270918334Speter if (flag_traditional && TREE_TYPE (newdecl) == TREE_TYPE (olddecl)) 271018334Speter return 0; 271118334Speter /* pushdecl creates distinct types for TYPE_DECLs by calling 271218334Speter build_type_copy, so the above comparison generally fails. We do 271318334Speter another test against the TYPE_MAIN_VARIANT of the olddecl, which 271418334Speter is equivalent to what this code used to do before the build_type_copy 271518334Speter call. The variant type distinction should not matter for traditional 271618334Speter code, because it doesn't have type qualifiers. */ 271790075Sobrien if (flag_traditional 271818334Speter && TYPE_MAIN_VARIANT (TREE_TYPE (olddecl)) == TREE_TYPE (newdecl)) 271918334Speter return 0; 272018334Speter if (DECL_IN_SYSTEM_HEADER (olddecl) || DECL_IN_SYSTEM_HEADER (newdecl)) 272118334Speter return 0; 272252284Sobrien return 1; 272318334Speter } 272418334Speter else if (TREE_CODE (newdecl) == FUNCTION_DECL) 272518334Speter { 272618334Speter /* Declarations of functions can insist on internal linkage 272718334Speter but they can't be inconsistent with internal linkage, 272818334Speter so there can be no error on that account. 272918334Speter However defining the same name twice is no good. */ 273018334Speter if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0 273118334Speter /* However, defining once as extern inline and a second 273218334Speter time in another way is ok. */ 273390075Sobrien && ! (DECL_DECLARED_INLINE_P (olddecl) && DECL_EXTERNAL (olddecl) 273490075Sobrien && ! (DECL_DECLARED_INLINE_P (newdecl) 273590075Sobrien && DECL_EXTERNAL (newdecl)))) 273652284Sobrien return 1; 273718334Speter return 0; 273818334Speter } 273990075Sobrien else if (DECL_CONTEXT (newdecl) == NULL_TREE) 274018334Speter { 274118334Speter /* Objects declared at top level: */ 274218334Speter /* If at least one is a reference, it's ok. */ 274318334Speter if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl)) 274418334Speter return 0; 274518334Speter /* Reject two definitions. */ 274618334Speter if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0) 274752284Sobrien return 1; 274818334Speter /* Now we have two tentative defs, or one tentative and one real def. */ 274918334Speter /* Insist that the linkage match. */ 275018334Speter if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl)) 275152284Sobrien return 3; 275218334Speter return 0; 275318334Speter } 275418334Speter else if (current_binding_level->parm_flag 275518334Speter && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl)) 275618334Speter return 0; 275718334Speter else 275818334Speter { 275918334Speter /* Newdecl has block scope. If olddecl has block scope also, then 276018334Speter reject two definitions, and reject a definition together with an 276118334Speter external reference. Otherwise, it is OK, because newdecl must 276218334Speter be an extern reference to olddecl. */ 276318334Speter if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)) 276418334Speter && DECL_CONTEXT (newdecl) == DECL_CONTEXT (olddecl)) 276552284Sobrien return 2; 276618334Speter return 0; 276718334Speter } 276818334Speter} 276918334Speter 277018334Speter/* Get the LABEL_DECL corresponding to identifier ID as a label. 277118334Speter Create one if none exists so far for the current function. 277218334Speter This function is called for both label definitions and label references. */ 277318334Speter 277418334Spetertree 277518334Speterlookup_label (id) 277618334Speter tree id; 277718334Speter{ 277890075Sobrien tree decl = IDENTIFIER_LABEL_VALUE (id); 277918334Speter 278018334Speter if (current_function_decl == 0) 278118334Speter { 278218334Speter error ("label %s referenced outside of any function", 278318334Speter IDENTIFIER_POINTER (id)); 278418334Speter return 0; 278518334Speter } 278618334Speter 278718334Speter /* Use a label already defined or ref'd with this name. */ 278818334Speter if (decl != 0) 278918334Speter { 279018334Speter /* But not if it is inherited and wasn't declared to be inheritable. */ 279118334Speter if (DECL_CONTEXT (decl) != current_function_decl 279218334Speter && ! C_DECLARED_LABEL_FLAG (decl)) 279318334Speter return shadow_label (id); 279418334Speter return decl; 279518334Speter } 279618334Speter 279718334Speter decl = build_decl (LABEL_DECL, id, void_type_node); 279818334Speter 279918334Speter /* A label not explicitly declared must be local to where it's ref'd. */ 280018334Speter DECL_CONTEXT (decl) = current_function_decl; 280118334Speter 280218334Speter DECL_MODE (decl) = VOIDmode; 280318334Speter 280418334Speter /* Say where one reference is to the label, 280518334Speter for the sake of the error if it is not defined. */ 280618334Speter DECL_SOURCE_LINE (decl) = lineno; 280718334Speter DECL_SOURCE_FILE (decl) = input_filename; 280818334Speter 280918334Speter IDENTIFIER_LABEL_VALUE (id) = decl; 281018334Speter 281118334Speter named_labels = tree_cons (NULL_TREE, decl, named_labels); 281218334Speter 281318334Speter return decl; 281418334Speter} 281518334Speter 281618334Speter/* Make a label named NAME in the current function, 281718334Speter shadowing silently any that may be inherited from containing functions 281818334Speter or containing scopes. 281918334Speter 282018334Speter Note that valid use, if the label being shadowed 282118334Speter comes from another scope in the same function, 282218334Speter requires calling declare_nonlocal_label right away. */ 282318334Speter 282418334Spetertree 282518334Spetershadow_label (name) 282618334Speter tree name; 282718334Speter{ 282890075Sobrien tree decl = IDENTIFIER_LABEL_VALUE (name); 282918334Speter 283018334Speter if (decl != 0) 283118334Speter { 283290075Sobrien tree dup; 283318334Speter 283418334Speter /* Check to make sure that the label hasn't already been declared 283518334Speter at this label scope */ 283618334Speter for (dup = named_labels; dup; dup = TREE_CHAIN (dup)) 283718334Speter if (TREE_VALUE (dup) == decl) 283818334Speter { 283990075Sobrien error ("duplicate label declaration `%s'", 284018334Speter IDENTIFIER_POINTER (name)); 284118334Speter error_with_decl (TREE_VALUE (dup), 284218334Speter "this is a previous declaration"); 284318334Speter /* Just use the previous declaration. */ 284418334Speter return lookup_label (name); 284518334Speter } 284618334Speter 284718334Speter shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); 284818334Speter IDENTIFIER_LABEL_VALUE (name) = decl = 0; 284918334Speter } 285018334Speter 285118334Speter return lookup_label (name); 285218334Speter} 285318334Speter 285418334Speter/* Define a label, specifying the location in the source file. 285518334Speter Return the LABEL_DECL node for the label, if the definition is valid. 285618334Speter Otherwise return 0. */ 285718334Speter 285818334Spetertree 285918334Speterdefine_label (filename, line, name) 286090075Sobrien const char *filename; 286118334Speter int line; 286218334Speter tree name; 286318334Speter{ 286418334Speter tree decl = lookup_label (name); 286518334Speter 286618334Speter /* If label with this name is known from an outer context, shadow it. */ 286718334Speter if (decl != 0 && DECL_CONTEXT (decl) != current_function_decl) 286818334Speter { 286918334Speter shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); 287018334Speter IDENTIFIER_LABEL_VALUE (name) = 0; 287118334Speter decl = lookup_label (name); 287218334Speter } 287318334Speter 287490075Sobrien if (warn_traditional && !in_system_header && lookup_name (name)) 287590075Sobrien warning_with_file_and_line (filename, line, 287690075Sobrien "traditional C lacks a separate namespace for labels, identifier `%s' conflicts", 287790075Sobrien IDENTIFIER_POINTER (name)); 287890075Sobrien 287918334Speter if (DECL_INITIAL (decl) != 0) 288018334Speter { 288190075Sobrien error_with_file_and_line (filename, line, "duplicate label `%s'", 288290075Sobrien IDENTIFIER_POINTER (name)); 288318334Speter return 0; 288418334Speter } 288518334Speter else 288618334Speter { 288718334Speter /* Mark label as having been defined. */ 288818334Speter DECL_INITIAL (decl) = error_mark_node; 288918334Speter /* Say where in the source. */ 289018334Speter DECL_SOURCE_FILE (decl) = filename; 289118334Speter DECL_SOURCE_LINE (decl) = line; 289218334Speter return decl; 289318334Speter } 289418334Speter} 289518334Speter 289618334Speter/* Return the list of declarations of the current level. 289718334Speter Note that this list is in reverse order unless/until 289818334Speter you nreverse it; and when you do nreverse it, you must 289918334Speter store the result back using `storedecls' or you will lose. */ 290018334Speter 290118334Spetertree 290218334Spetergetdecls () 290318334Speter{ 290418334Speter return current_binding_level->names; 290518334Speter} 290618334Speter 290718334Speter/* Return the list of type-tags (for structs, etc) of the current level. */ 290818334Speter 290918334Spetertree 291018334Spetergettags () 291118334Speter{ 291218334Speter return current_binding_level->tags; 291318334Speter} 291418334Speter 291518334Speter/* Store the list of declarations of the current level. 291618334Speter This is done for the parameter declarations of a function being defined, 291718334Speter after they are modified in the light of any missing parameters. */ 291818334Speter 291918334Speterstatic void 292018334Speterstoredecls (decls) 292118334Speter tree decls; 292218334Speter{ 292318334Speter current_binding_level->names = decls; 292418334Speter} 292518334Speter 292618334Speter/* Similarly, store the list of tags of the current level. */ 292718334Speter 292818334Speterstatic void 292918334Speterstoretags (tags) 293018334Speter tree tags; 293118334Speter{ 293218334Speter current_binding_level->tags = tags; 293318334Speter} 293418334Speter 293518334Speter/* Given NAME, an IDENTIFIER_NODE, 293618334Speter return the structure (or union or enum) definition for that name. 293718334Speter Searches binding levels from BINDING_LEVEL up to the global level. 293818334Speter If THISLEVEL_ONLY is nonzero, searches only the specified context 293918334Speter (but skips any tag-transparent contexts to find one that is 294018334Speter meaningful for tags). 294118334Speter CODE says which kind of type the caller wants; 294218334Speter it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE. 294318334Speter If the wrong kind of type is found, an error is reported. */ 294418334Speter 294518334Speterstatic tree 294618334Speterlookup_tag (code, name, binding_level, thislevel_only) 294718334Speter enum tree_code code; 294818334Speter struct binding_level *binding_level; 294918334Speter tree name; 295018334Speter int thislevel_only; 295118334Speter{ 295290075Sobrien struct binding_level *level; 295390075Sobrien int thislevel = 1; 295418334Speter 295518334Speter for (level = binding_level; level; level = level->level_chain) 295618334Speter { 295790075Sobrien tree tail; 295818334Speter for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) 295918334Speter { 296018334Speter if (TREE_PURPOSE (tail) == name) 296118334Speter { 296218334Speter if (TREE_CODE (TREE_VALUE (tail)) != code) 296318334Speter { 296418334Speter /* Definition isn't the kind we were looking for. */ 296518334Speter pending_invalid_xref = name; 296618334Speter pending_invalid_xref_file = input_filename; 296718334Speter pending_invalid_xref_line = lineno; 296890075Sobrien /* If in the same binding level as a declaration as a tag 296990075Sobrien of a different type, this must not be allowed to 297090075Sobrien shadow that tag, so give the error immediately. 297190075Sobrien (For example, "struct foo; union foo;" is invalid.) */ 297290075Sobrien if (thislevel) 297390075Sobrien pending_xref_error (); 297418334Speter } 297518334Speter return TREE_VALUE (tail); 297618334Speter } 297718334Speter } 297890075Sobrien if (! level->tag_transparent) 297990075Sobrien { 298090075Sobrien if (thislevel_only) 298190075Sobrien return NULL_TREE; 298290075Sobrien thislevel = 0; 298390075Sobrien } 298418334Speter } 298518334Speter return NULL_TREE; 298618334Speter} 298718334Speter 298818334Speter/* Print an error message now 298918334Speter for a recent invalid struct, union or enum cross reference. 299018334Speter We don't print them immediately because they are not invalid 299118334Speter when used in the `struct foo;' construct for shadowing. */ 299218334Speter 299318334Spetervoid 299418334Speterpending_xref_error () 299518334Speter{ 299618334Speter if (pending_invalid_xref != 0) 299718334Speter error_with_file_and_line (pending_invalid_xref_file, 299818334Speter pending_invalid_xref_line, 299918334Speter "`%s' defined as wrong kind of tag", 300018334Speter IDENTIFIER_POINTER (pending_invalid_xref)); 300118334Speter pending_invalid_xref = 0; 300218334Speter} 300318334Speter 300418334Speter/* Given a type, find the tag that was defined for it and return the tag name. 300518334Speter Otherwise return 0. */ 300618334Speter 300718334Speterstatic tree 300818334Speterlookup_tag_reverse (type) 300918334Speter tree type; 301018334Speter{ 301190075Sobrien struct binding_level *level; 301218334Speter 301318334Speter for (level = current_binding_level; level; level = level->level_chain) 301418334Speter { 301590075Sobrien tree tail; 301618334Speter for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) 301718334Speter { 301818334Speter if (TREE_VALUE (tail) == type) 301918334Speter return TREE_PURPOSE (tail); 302018334Speter } 302118334Speter } 302218334Speter return NULL_TREE; 302318334Speter} 302418334Speter 302518334Speter/* Look up NAME in the current binding level and its superiors 302618334Speter in the namespace of variables, functions and typedefs. 302718334Speter Return a ..._DECL node of some kind representing its definition, 302818334Speter or return 0 if it is undefined. */ 302918334Speter 303018334Spetertree 303118334Speterlookup_name (name) 303218334Speter tree name; 303318334Speter{ 303490075Sobrien tree val; 303590075Sobrien 303618334Speter if (current_binding_level != global_binding_level 303718334Speter && IDENTIFIER_LOCAL_VALUE (name)) 303818334Speter val = IDENTIFIER_LOCAL_VALUE (name); 303918334Speter else 304018334Speter val = IDENTIFIER_GLOBAL_VALUE (name); 304118334Speter return val; 304218334Speter} 304318334Speter 304418334Speter/* Similar to `lookup_name' but look only at current binding level. */ 304518334Speter 304618334Spetertree 304718334Speterlookup_name_current_level (name) 304818334Speter tree name; 304918334Speter{ 305090075Sobrien tree t; 305118334Speter 305218334Speter if (current_binding_level == global_binding_level) 305318334Speter return IDENTIFIER_GLOBAL_VALUE (name); 305418334Speter 305518334Speter if (IDENTIFIER_LOCAL_VALUE (name) == 0) 305618334Speter return 0; 305718334Speter 305818334Speter for (t = current_binding_level->names; t; t = TREE_CHAIN (t)) 305918334Speter if (DECL_NAME (t) == name) 306018334Speter break; 306118334Speter 306218334Speter return t; 306318334Speter} 306418334Speter 306590075Sobrien/* Mark ARG for GC. */ 306690075Sobrien 306790075Sobrienstatic void 306890075Sobrienmark_binding_level (arg) 306990075Sobrien void *arg; 307090075Sobrien{ 307190075Sobrien struct binding_level *level = *(struct binding_level **) arg; 307290075Sobrien 307390075Sobrien for (; level != 0; level = level->level_chain) 307490075Sobrien { 307590075Sobrien ggc_mark_tree (level->names); 307690075Sobrien ggc_mark_tree (level->tags); 307790075Sobrien ggc_mark_tree (level->shadowed); 307890075Sobrien ggc_mark_tree (level->blocks); 307990075Sobrien ggc_mark_tree (level->this_block); 308090075Sobrien ggc_mark_tree (level->parm_order); 308190075Sobrien } 308290075Sobrien} 308390075Sobrien 308418334Speter/* Create the predefined scalar types of C, 308550397Sobrien and some nodes representing standard constants (0, 1, (void *) 0). 308618334Speter Initialize the global binding level. 308718334Speter Make definitions for built-in primitive functions. */ 308818334Speter 308918334Spetervoid 309090075Sobrienc_init_decl_processing () 309118334Speter{ 309290075Sobrien tree endlink; 309390075Sobrien tree ptr_ftype_void, ptr_ftype_ptr; 309418334Speter 309590075Sobrien /* Adds some ggc roots, and reserved words for c-parse.in. */ 309690075Sobrien c_parse_init (); 309790075Sobrien 309818334Speter current_function_decl = NULL; 309918334Speter named_labels = NULL; 310018334Speter current_binding_level = NULL_BINDING_LEVEL; 310118334Speter free_binding_level = NULL_BINDING_LEVEL; 310290075Sobrien 310390075Sobrien /* Make the binding_level structure for global names. */ 310490075Sobrien pushlevel (0); 310518334Speter global_binding_level = current_binding_level; 310618334Speter 310790075Sobrien build_common_tree_nodes (flag_signed_char); 310818334Speter 310990075Sobrien c_common_nodes_and_builtins (); 311018334Speter 311118334Speter boolean_type_node = integer_type_node; 311218334Speter boolean_true_node = integer_one_node; 311318334Speter boolean_false_node = integer_zero_node; 311418334Speter 311596263Sobrien c_bool_type_node = make_unsigned_type (BOOL_TYPE_SIZE); 311690075Sobrien TREE_SET_CODE (c_bool_type_node, BOOLEAN_TYPE); 311790075Sobrien TYPE_MAX_VALUE (c_bool_type_node) = build_int_2 (1, 0); 311890075Sobrien TREE_TYPE (TYPE_MAX_VALUE (c_bool_type_node)) = c_bool_type_node; 311990075Sobrien TYPE_PRECISION (c_bool_type_node) = 1; 312090075Sobrien pushdecl (build_decl (TYPE_DECL, get_identifier ("_Bool"), 312190075Sobrien c_bool_type_node)); 312290075Sobrien c_bool_false_node = build_int_2 (0, 0); 312390075Sobrien TREE_TYPE (c_bool_false_node) = c_bool_type_node; 312490075Sobrien c_bool_true_node = build_int_2 (1, 0); 312590075Sobrien TREE_TYPE (c_bool_true_node) = c_bool_type_node; 312618334Speter 312790075Sobrien endlink = void_list_node; 312850397Sobrien ptr_ftype_void = build_function_type (ptr_type_node, endlink); 312950397Sobrien ptr_ftype_ptr 313050397Sobrien = build_function_type (ptr_type_node, 313150397Sobrien tree_cons (NULL_TREE, ptr_type_node, endlink)); 313250397Sobrien 313390075Sobrien /* Types which are common to the fortran compiler and libf2c. When 313490075Sobrien changing these, you also need to be concerned with f/com.h. */ 313518334Speter 313690075Sobrien if (TYPE_PRECISION (float_type_node) 313790075Sobrien == TYPE_PRECISION (long_integer_type_node)) 313890075Sobrien { 313990075Sobrien g77_integer_type_node = long_integer_type_node; 314090075Sobrien g77_uinteger_type_node = long_unsigned_type_node; 314190075Sobrien } 314290075Sobrien else if (TYPE_PRECISION (float_type_node) 314390075Sobrien == TYPE_PRECISION (integer_type_node)) 314490075Sobrien { 314590075Sobrien g77_integer_type_node = integer_type_node; 314690075Sobrien g77_uinteger_type_node = unsigned_type_node; 314790075Sobrien } 314890075Sobrien else 314990075Sobrien g77_integer_type_node = g77_uinteger_type_node = NULL_TREE; 315018334Speter 315190075Sobrien if (g77_integer_type_node != NULL_TREE) 315290075Sobrien { 315390075Sobrien pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_integer"), 315490075Sobrien g77_integer_type_node)); 315590075Sobrien pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_uinteger"), 315690075Sobrien g77_uinteger_type_node)); 315790075Sobrien } 315818334Speter 315990075Sobrien if (TYPE_PRECISION (float_type_node) * 2 316090075Sobrien == TYPE_PRECISION (long_integer_type_node)) 316190075Sobrien { 316290075Sobrien g77_longint_type_node = long_integer_type_node; 316390075Sobrien g77_ulongint_type_node = long_unsigned_type_node; 316490075Sobrien } 316590075Sobrien else if (TYPE_PRECISION (float_type_node) * 2 316690075Sobrien == TYPE_PRECISION (long_long_integer_type_node)) 316790075Sobrien { 316890075Sobrien g77_longint_type_node = long_long_integer_type_node; 316990075Sobrien g77_ulongint_type_node = long_long_unsigned_type_node; 317090075Sobrien } 317190075Sobrien else 317290075Sobrien g77_longint_type_node = g77_ulongint_type_node = NULL_TREE; 317350397Sobrien 317490075Sobrien if (g77_longint_type_node != NULL_TREE) 317518334Speter { 317690075Sobrien pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_longint"), 317790075Sobrien g77_longint_type_node)); 317890075Sobrien pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_ulongint"), 317990075Sobrien g77_ulongint_type_node)); 318018334Speter } 318118334Speter 318290075Sobrien pedantic_lvalues = pedantic; 318318334Speter 318490075Sobrien make_fname_decl = c_make_fname_decl; 318590075Sobrien start_fname_decls (); 318618334Speter 318790075Sobrien incomplete_decl_finalize_hook = finish_incomplete_decl; 318818334Speter 318990075Sobrien /* Record our roots. */ 319018334Speter 319190075Sobrien ggc_add_tree_root (c_global_trees, CTI_MAX); 319290075Sobrien ggc_add_root (&c_stmt_tree, 1, sizeof c_stmt_tree, mark_stmt_tree); 319390075Sobrien ggc_add_tree_root (&c_scope_stmt_stack, 1); 319490075Sobrien ggc_add_tree_root (&named_labels, 1); 319590075Sobrien ggc_add_tree_root (&shadowed_labels, 1); 319690075Sobrien ggc_add_root (¤t_binding_level, 1, sizeof current_binding_level, 319790075Sobrien mark_binding_level); 319890075Sobrien ggc_add_root (&label_level_chain, 1, sizeof label_level_chain, 319990075Sobrien mark_binding_level); 320090075Sobrien ggc_add_tree_root (&static_ctors, 1); 320190075Sobrien ggc_add_tree_root (&static_dtors, 1); 320290075Sobrien} 320318334Speter 320490075Sobrien/* Create the VAR_DECL for __FUNCTION__ etc. ID is the name to give the 320590075Sobrien decl, NAME is the initialization string and TYPE_DEP indicates whether 320690075Sobrien NAME depended on the type of the function. As we don't yet implement 320790075Sobrien delayed emission of static data, we mark the decl as emitted 320890075Sobrien so it is not placed in the output. Anything using it must therefore pull 320990075Sobrien out the STRING_CST initializer directly. This does mean that these names 321090075Sobrien are string merging candidates, which is wrong for C99's __func__. FIXME. */ 321118334Speter 321290075Sobrienstatic tree 321390075Sobrienc_make_fname_decl (id, type_dep) 321490075Sobrien tree id; 321590075Sobrien int type_dep; 321690075Sobrien{ 321790075Sobrien const char *name = fname_as_string (type_dep); 321890075Sobrien tree decl, type, init; 321990075Sobrien size_t length = strlen (name); 322018334Speter 322190075Sobrien type = build_array_type 322290075Sobrien (build_qualified_type (char_type_node, TYPE_QUAL_CONST), 322390075Sobrien build_index_type (size_int (length))); 322418334Speter 322590075Sobrien decl = build_decl (VAR_DECL, id, type); 322690075Sobrien /* We don't push the decl, so have to set its context here. */ 322790075Sobrien DECL_CONTEXT (decl) = current_function_decl; 322890075Sobrien 322990075Sobrien TREE_STATIC (decl) = 1; 323090075Sobrien TREE_READONLY (decl) = 1; 323190075Sobrien DECL_ARTIFICIAL (decl) = 1; 323290075Sobrien 323390075Sobrien init = build_string (length + 1, name); 323490075Sobrien TREE_TYPE (init) = type; 323590075Sobrien DECL_INITIAL (decl) = init; 323618334Speter 323790075Sobrien TREE_USED (decl) = 1; 323890075Sobrien 323990075Sobrien finish_decl (decl, init, NULL_TREE); 324018334Speter 324190075Sobrien return decl; 324218334Speter} 324318334Speter 324418334Speter/* Return a definition for a builtin function named NAME and whose data type 324518334Speter is TYPE. TYPE should be a function type with argument types. 324618334Speter FUNCTION_CODE tells later passes how to compile calls to this function. 324718334Speter See tree.h for its possible values. 324818334Speter 324918334Speter If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME, 325018334Speter the name to be called if we can't opencode the function. */ 325118334Speter 325218334Spetertree 325390075Sobrienbuiltin_function (name, type, function_code, class, library_name) 325452284Sobrien const char *name; 325518334Speter tree type; 325690075Sobrien int function_code; 325790075Sobrien enum built_in_class class; 325852284Sobrien const char *library_name; 325918334Speter{ 326018334Speter tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type); 326118334Speter DECL_EXTERNAL (decl) = 1; 326218334Speter TREE_PUBLIC (decl) = 1; 326318334Speter /* If -traditional, permit redefining a builtin function any way you like. 326418334Speter (Though really, if the program redefines these functions, 326518334Speter it probably won't work right unless compiled with -fno-builtin.) */ 326618334Speter if (flag_traditional && name[0] != '_') 326718334Speter DECL_BUILT_IN_NONANSI (decl) = 1; 326818334Speter if (library_name) 326990075Sobrien SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name)); 327090075Sobrien make_decl_rtl (decl, NULL); 327118334Speter pushdecl (decl); 327290075Sobrien DECL_BUILT_IN_CLASS (decl) = class; 327390075Sobrien DECL_FUNCTION_CODE (decl) = function_code; 327490075Sobrien 327596263Sobrien /* The return builtins leave the current function. */ 327696263Sobrien if (function_code == BUILT_IN_RETURN || function_code == BUILT_IN_EH_RETURN) 327796263Sobrien TREE_THIS_VOLATILE (decl) = 1; 327896263Sobrien 327918334Speter /* Warn if a function in the namespace for users 328018334Speter is used without an occasion to consider it declared. */ 328118334Speter if (name[0] != '_' || name[1] != '_') 328218334Speter C_DECL_ANTICIPATED (decl) = 1; 328318334Speter 328490075Sobrien /* Possibly apply some default attributes to this built-in function. */ 328590075Sobrien decl_attributes (&decl, NULL_TREE, 0); 328690075Sobrien 328718334Speter return decl; 328818334Speter} 328990075Sobrien 329090075Sobrien/* Apply default attributes to a function, if a system function with default 329190075Sobrien attributes. */ 329290075Sobrien 329390075Sobrienvoid 329490075Sobrieninsert_default_attributes (decl) 329590075Sobrien tree decl; 329690075Sobrien{ 329790075Sobrien if (!TREE_PUBLIC (decl)) 329890075Sobrien return; 329990075Sobrien c_common_insert_default_attributes (decl); 330090075Sobrien} 330118334Speter 330218334Speter/* Called when a declaration is seen that contains no names to declare. 330318334Speter If its type is a reference to a structure, union or enum inherited 330418334Speter from a containing scope, shadow that tag name for the current scope 330518334Speter with a forward reference. 330618334Speter If its type defines a new named structure or union 330718334Speter or defines an enum, it is valid but we need not do anything here. 330818334Speter Otherwise, it is an error. */ 330918334Speter 331018334Spetervoid 331118334Spetershadow_tag (declspecs) 331218334Speter tree declspecs; 331318334Speter{ 331418334Speter shadow_tag_warned (declspecs, 0); 331518334Speter} 331618334Speter 331718334Spetervoid 331818334Spetershadow_tag_warned (declspecs, warned) 331918334Speter tree declspecs; 332018334Speter int warned; 332118334Speter /* 1 => we have done a pedwarn. 2 => we have done a warning, but 332218334Speter no pedwarn. */ 332318334Speter{ 332418334Speter int found_tag = 0; 332590075Sobrien tree link; 332650397Sobrien tree specs, attrs; 332718334Speter 332818334Speter pending_invalid_xref = 0; 332918334Speter 333050397Sobrien /* Remove the attributes from declspecs, since they will confuse the 333150397Sobrien following code. */ 333250397Sobrien split_specs_attrs (declspecs, &specs, &attrs); 333350397Sobrien 333450397Sobrien for (link = specs; link; link = TREE_CHAIN (link)) 333518334Speter { 333690075Sobrien tree value = TREE_VALUE (link); 333790075Sobrien enum tree_code code = TREE_CODE (value); 333818334Speter 333918334Speter if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE) 334018334Speter /* Used to test also that TYPE_SIZE (value) != 0. 334118334Speter That caused warning for `struct foo;' at top level in the file. */ 334218334Speter { 334390075Sobrien tree name = lookup_tag_reverse (value); 334490075Sobrien tree t; 334518334Speter 334618334Speter found_tag++; 334718334Speter 334818334Speter if (name == 0) 334918334Speter { 335018334Speter if (warned != 1 && code != ENUMERAL_TYPE) 335118334Speter /* Empty unnamed enum OK */ 335218334Speter { 335318334Speter pedwarn ("unnamed struct/union that defines no instances"); 335418334Speter warned = 1; 335518334Speter } 335618334Speter } 335718334Speter else 335818334Speter { 335918334Speter t = lookup_tag (code, name, current_binding_level, 1); 336018334Speter 336118334Speter if (t == 0) 336218334Speter { 336318334Speter t = make_node (code); 336418334Speter pushtag (name, t); 336518334Speter } 336618334Speter } 336718334Speter } 336818334Speter else 336918334Speter { 337018334Speter if (!warned && ! in_system_header) 337118334Speter { 337218334Speter warning ("useless keyword or type name in empty declaration"); 337318334Speter warned = 2; 337418334Speter } 337518334Speter } 337618334Speter } 337718334Speter 337818334Speter if (found_tag > 1) 337918334Speter error ("two types specified in one empty declaration"); 338018334Speter 338118334Speter if (warned != 1) 338218334Speter { 338318334Speter if (found_tag == 0) 338418334Speter pedwarn ("empty declaration"); 338518334Speter } 338618334Speter} 338718334Speter 338890075Sobrien/* Construct an array declarator. EXPR is the expression inside [], or 338990075Sobrien NULL_TREE. QUALS are the type qualifiers inside the [] (to be applied 339090075Sobrien to the pointer to which a parameter array is converted). STATIC_P is 339190075Sobrien non-zero if "static" is inside the [], zero otherwise. VLA_UNSPEC_P 339290075Sobrien is non-zero is the array is [*], a VLA of unspecified length which is 339390075Sobrien nevertheless a complete type (not currently implemented by GCC), 339490075Sobrien zero otherwise. The declarator is constructed as an ARRAY_REF 339590075Sobrien (to be decoded by grokdeclarator), whose operand 0 is what's on the 339690075Sobrien left of the [] (filled by in set_array_declarator_type) and operand 1 339790075Sobrien is the expression inside; whose TREE_TYPE is the type qualifiers and 339890075Sobrien which has TREE_STATIC set if "static" is used. */ 339990075Sobrien 340090075Sobrientree 340190075Sobrienbuild_array_declarator (expr, quals, static_p, vla_unspec_p) 340290075Sobrien tree expr; 340390075Sobrien tree quals; 340490075Sobrien int static_p; 340590075Sobrien int vla_unspec_p; 340690075Sobrien{ 340790075Sobrien tree decl; 340890075Sobrien decl = build_nt (ARRAY_REF, NULL_TREE, expr); 340990075Sobrien TREE_TYPE (decl) = quals; 341090075Sobrien TREE_STATIC (decl) = (static_p ? 1 : 0); 341190075Sobrien if (pedantic && !flag_isoc99) 341290075Sobrien { 341390075Sobrien if (static_p || quals != NULL_TREE) 341490075Sobrien pedwarn ("ISO C89 does not support `static' or type qualifiers in parameter array declarators"); 341590075Sobrien if (vla_unspec_p) 341690075Sobrien pedwarn ("ISO C89 does not support `[*]' array declarators"); 341790075Sobrien } 341890075Sobrien if (vla_unspec_p) 341990075Sobrien warning ("GCC does not yet properly implement `[*]' array declarators"); 342090075Sobrien return decl; 342190075Sobrien} 342290075Sobrien 342390075Sobrien/* Set the type of an array declarator. DECL is the declarator, as 342490075Sobrien constructed by build_array_declarator; TYPE is what appears on the left 342590075Sobrien of the [] and goes in operand 0. ABSTRACT_P is non-zero if it is an 342690075Sobrien abstract declarator, zero otherwise; this is used to reject static and 342790075Sobrien type qualifiers in abstract declarators, where they are not in the 342890075Sobrien C99 grammar. */ 342990075Sobrien 343090075Sobrientree 343190075Sobrienset_array_declarator_type (decl, type, abstract_p) 343290075Sobrien tree decl; 343390075Sobrien tree type; 343490075Sobrien int abstract_p; 343590075Sobrien{ 343690075Sobrien TREE_OPERAND (decl, 0) = type; 343790075Sobrien if (abstract_p && (TREE_TYPE (decl) != NULL_TREE || TREE_STATIC (decl))) 343890075Sobrien error ("static or type qualifiers in abstract declarator"); 343990075Sobrien return decl; 344090075Sobrien} 344190075Sobrien 344218334Speter/* Decode a "typename", such as "int **", returning a ..._TYPE node. */ 344318334Speter 344418334Spetertree 344518334Spetergroktypename (typename) 344618334Speter tree typename; 344718334Speter{ 344890075Sobrien tree specs, attrs; 344990075Sobrien 345018334Speter if (TREE_CODE (typename) != TREE_LIST) 345118334Speter return typename; 345290075Sobrien 345390075Sobrien split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs); 345490075Sobrien 345596263Sobrien typename = grokdeclarator (TREE_VALUE (typename), specs, TYPENAME, 0); 345690075Sobrien 345790075Sobrien /* Apply attributes. */ 345890075Sobrien decl_attributes (&typename, attrs, 0); 345990075Sobrien 346090075Sobrien return typename; 346118334Speter} 346218334Speter 346318334Speter/* Return a PARM_DECL node for a given pair of specs and declarator. */ 346418334Speter 346518334Spetertree 346618334Spetergroktypename_in_parm_context (typename) 346718334Speter tree typename; 346818334Speter{ 346918334Speter if (TREE_CODE (typename) != TREE_LIST) 347018334Speter return typename; 347118334Speter return grokdeclarator (TREE_VALUE (typename), 347218334Speter TREE_PURPOSE (typename), 347396263Sobrien PARM, 0); 347418334Speter} 347518334Speter 347618334Speter/* Decode a declarator in an ordinary declaration or data definition. 347718334Speter This is called as soon as the type information and variable name 347818334Speter have been parsed, before parsing the initializer if any. 347918334Speter Here we create the ..._DECL node, fill in its type, 348018334Speter and put it on the list of decls for the current context. 348118334Speter The ..._DECL node is returned as the value. 348218334Speter 348318334Speter Exception: for arrays where the length is not specified, 348418334Speter the type is left null, to be filled in by `finish_decl'. 348518334Speter 348618334Speter Function definitions do not come here; they go to start_function 348718334Speter instead. However, external and forward declarations of functions 348818334Speter do go through here. Structure field declarations are done by 348918334Speter grokfield and not through here. */ 349018334Speter 349118334Spetertree 349290075Sobrienstart_decl (declarator, declspecs, initialized, attributes) 349318334Speter tree declarator, declspecs; 349418334Speter int initialized; 349590075Sobrien tree attributes; 349618334Speter{ 349790075Sobrien tree decl; 349890075Sobrien tree tem; 349990075Sobrien 350090075Sobrien /* An object declared as __attribute__((deprecated)) suppresses 350190075Sobrien warnings of uses of other deprecated items. */ 350290075Sobrien if (lookup_attribute ("deprecated", attributes)) 350390075Sobrien deprecated_state = DEPRECATED_SUPPRESS; 350418334Speter 350590075Sobrien decl = grokdeclarator (declarator, declspecs, 350696263Sobrien NORMAL, initialized); 350790075Sobrien 350890075Sobrien deprecated_state = DEPRECATED_NORMAL; 350918334Speter 351090075Sobrien if (warn_main > 0 && TREE_CODE (decl) != FUNCTION_DECL 351190075Sobrien && MAIN_NAME_P (DECL_NAME (decl))) 351250397Sobrien warning_with_decl (decl, "`%s' is usually a function"); 351350397Sobrien 351418334Speter if (initialized) 351518334Speter /* Is it valid for this decl to have an initializer at all? 351618334Speter If not, set INITIALIZED to zero, which will indirectly 351718334Speter tell `finish_decl' to ignore the initializer once it is parsed. */ 351818334Speter switch (TREE_CODE (decl)) 351918334Speter { 352018334Speter case TYPE_DECL: 352118334Speter /* typedef foo = bar means give foo the same type as bar. 352218334Speter We haven't parsed bar yet, so `finish_decl' will fix that up. 352318334Speter Any other case of an initialization in a TYPE_DECL is an error. */ 352418334Speter if (pedantic || list_length (declspecs) > 1) 352518334Speter { 352618334Speter error ("typedef `%s' is initialized", 352718334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 352818334Speter initialized = 0; 352918334Speter } 353018334Speter break; 353118334Speter 353218334Speter case FUNCTION_DECL: 353318334Speter error ("function `%s' is initialized like a variable", 353418334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 353518334Speter initialized = 0; 353618334Speter break; 353718334Speter 353818334Speter case PARM_DECL: 353918334Speter /* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. */ 354018334Speter error ("parameter `%s' is initialized", 354118334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 354218334Speter initialized = 0; 354318334Speter break; 354418334Speter 354518334Speter default: 354618334Speter /* Don't allow initializations for incomplete types 354718334Speter except for arrays which might be completed by the initialization. */ 354890075Sobrien 354990075Sobrien /* This can happen if the array size is an undefined macro. We already 355090075Sobrien gave a warning, so we don't need another one. */ 355190075Sobrien if (TREE_TYPE (decl) == error_mark_node) 355290075Sobrien initialized = 0; 355390075Sobrien else if (COMPLETE_TYPE_P (TREE_TYPE (decl))) 355418334Speter { 355518334Speter /* A complete type is ok if size is fixed. */ 355618334Speter 355718334Speter if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST 355818334Speter || C_DECL_VARIABLE_SIZE (decl)) 355918334Speter { 356018334Speter error ("variable-sized object may not be initialized"); 356118334Speter initialized = 0; 356218334Speter } 356318334Speter } 356418334Speter else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE) 356518334Speter { 356618334Speter error ("variable `%s' has initializer but incomplete type", 356718334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 356818334Speter initialized = 0; 356918334Speter } 357090075Sobrien else if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) 357118334Speter { 357218334Speter error ("elements of array `%s' have incomplete type", 357318334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 357418334Speter initialized = 0; 357518334Speter } 357618334Speter } 357718334Speter 357818334Speter if (initialized) 357918334Speter { 358090075Sobrien#if 0 358190075Sobrien /* Seems redundant with grokdeclarator. */ 358218334Speter if (current_binding_level != global_binding_level 358318334Speter && DECL_EXTERNAL (decl) 358418334Speter && TREE_CODE (decl) != FUNCTION_DECL) 358518334Speter warning ("declaration of `%s' has `extern' and is initialized", 358618334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 358718334Speter#endif 358818334Speter DECL_EXTERNAL (decl) = 0; 358918334Speter if (current_binding_level == global_binding_level) 359018334Speter TREE_STATIC (decl) = 1; 359118334Speter 359218334Speter /* Tell `pushdecl' this is an initialized decl 359318334Speter even though we don't yet have the initializer expression. 359418334Speter Also tell `finish_decl' it may store the real initializer. */ 359518334Speter DECL_INITIAL (decl) = error_mark_node; 359618334Speter } 359718334Speter 359818334Speter /* If this is a function declaration, write a record describing it to the 359918334Speter prototypes file (if requested). */ 360018334Speter 360118334Speter if (TREE_CODE (decl) == FUNCTION_DECL) 360218334Speter gen_aux_info_record (decl, 0, 0, TYPE_ARG_TYPES (TREE_TYPE (decl)) != 0); 360318334Speter 360450397Sobrien /* ANSI specifies that a tentative definition which is not merged with 360550397Sobrien a non-tentative definition behaves exactly like a definition with an 360650397Sobrien initializer equal to zero. (Section 3.7.2) 360750397Sobrien -fno-common gives strict ANSI behavior. Usually you don't want it. 360850397Sobrien This matters only for variables with external linkage. */ 360950397Sobrien if (! flag_no_common || ! TREE_PUBLIC (decl)) 361050397Sobrien DECL_COMMON (decl) = 1; 361118334Speter 361218334Speter /* Set attributes here so if duplicate decl, will have proper attributes. */ 361390075Sobrien decl_attributes (&decl, attributes, 0); 361418334Speter 361596263Sobrien /* If #pragma weak was used, mark the decl weak now. */ 361696263Sobrien if (current_binding_level == global_binding_level) 361796263Sobrien maybe_apply_pragma_weak (decl); 361896263Sobrien 361990075Sobrien if (TREE_CODE (decl) == FUNCTION_DECL 362090075Sobrien && DECL_DECLARED_INLINE_P (decl) 362190075Sobrien && DECL_UNINLINABLE (decl) 362290075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl))) 362390075Sobrien warning_with_decl (decl, 362490075Sobrien "inline function `%s' given attribute noinline"); 362590075Sobrien 362618334Speter /* Add this decl to the current binding level. 362718334Speter TEM may equal DECL or it may be a previous decl of the same name. */ 362818334Speter tem = pushdecl (decl); 362918334Speter 363018334Speter /* For a local variable, define the RTL now. */ 363118334Speter if (current_binding_level != global_binding_level 363218334Speter /* But not if this is a duplicate decl 363318334Speter and we preserved the rtl from the previous one 363418334Speter (which may or may not happen). */ 363590075Sobrien && !DECL_RTL_SET_P (tem) 363690075Sobrien && !DECL_CONTEXT (tem)) 363718334Speter { 363890075Sobrien if (TREE_TYPE (tem) != error_mark_node 363990075Sobrien && COMPLETE_TYPE_P (TREE_TYPE (tem))) 364018334Speter expand_decl (tem); 364118334Speter else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE 364218334Speter && DECL_INITIAL (tem) != 0) 364318334Speter expand_decl (tem); 364418334Speter } 364518334Speter 364618334Speter return tem; 364718334Speter} 364818334Speter 364918334Speter/* Finish processing of a declaration; 365018334Speter install its initial value. 365118334Speter If the length of an array type is not known before, 365218334Speter it must be determined now, from the initial value, or it is an error. */ 365318334Speter 365418334Spetervoid 365518334Speterfinish_decl (decl, init, asmspec_tree) 365618334Speter tree decl, init; 365718334Speter tree asmspec_tree; 365818334Speter{ 365990075Sobrien tree type = TREE_TYPE (decl); 366018334Speter int was_incomplete = (DECL_SIZE (decl) == 0); 366190075Sobrien const char *asmspec = 0; 366218334Speter 366390075Sobrien /* If a name was specified, get the string. */ 366496263Sobrien if (current_binding_level == global_binding_level) 366596263Sobrien asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree); 366618334Speter if (asmspec_tree) 366718334Speter asmspec = TREE_STRING_POINTER (asmspec_tree); 366818334Speter 366918334Speter /* If `start_decl' didn't like having an initialization, ignore it now. */ 367018334Speter if (init != 0 && DECL_INITIAL (decl) == 0) 367118334Speter init = 0; 367290075Sobrien 367318334Speter /* Don't crash if parm is initialized. */ 367418334Speter if (TREE_CODE (decl) == PARM_DECL) 367518334Speter init = 0; 367618334Speter 367718334Speter if (init) 367818334Speter { 367918334Speter if (TREE_CODE (decl) != TYPE_DECL) 368018334Speter store_init_value (decl, init); 368118334Speter else 368218334Speter { 368318334Speter /* typedef foo = bar; store the type of bar as the type of foo. */ 368418334Speter TREE_TYPE (decl) = TREE_TYPE (init); 368518334Speter DECL_INITIAL (decl) = init = 0; 368618334Speter } 368718334Speter } 368818334Speter 368918334Speter /* Deduce size of array from initialization, if not already known */ 369018334Speter if (TREE_CODE (type) == ARRAY_TYPE 369118334Speter && TYPE_DOMAIN (type) == 0 369218334Speter && TREE_CODE (decl) != TYPE_DECL) 369318334Speter { 369418334Speter int do_default 369518334Speter = (TREE_STATIC (decl) 369618334Speter /* Even if pedantic, an external linkage array 369718334Speter may have incomplete type at first. */ 369818334Speter ? pedantic && !TREE_PUBLIC (decl) 369918334Speter : !DECL_EXTERNAL (decl)); 370018334Speter int failure 370118334Speter = complete_array_type (type, DECL_INITIAL (decl), do_default); 370218334Speter 370318334Speter /* Get the completed type made by complete_array_type. */ 370418334Speter type = TREE_TYPE (decl); 370518334Speter 370618334Speter if (failure == 1) 370718334Speter error_with_decl (decl, "initializer fails to determine size of `%s'"); 370818334Speter 370990075Sobrien else if (failure == 2) 371018334Speter { 371118334Speter if (do_default) 371218334Speter error_with_decl (decl, "array size missing in `%s'"); 371318334Speter /* If a `static' var's size isn't known, 371418334Speter make it extern as well as static, so it does not get 371518334Speter allocated. 371618334Speter If it is not `static', then do not mark extern; 371718334Speter finish_incomplete_decl will give it a default size 371818334Speter and it will get allocated. */ 371918334Speter else if (!pedantic && TREE_STATIC (decl) && ! TREE_PUBLIC (decl)) 372018334Speter DECL_EXTERNAL (decl) = 1; 372118334Speter } 372218334Speter 372318334Speter /* TYPE_MAX_VALUE is always one less than the number of elements 372418334Speter in the array, because we start counting at zero. Therefore, 372518334Speter warn only if the value is less than zero. */ 372690075Sobrien else if (pedantic && TYPE_DOMAIN (type) != 0 372790075Sobrien && tree_int_cst_sgn (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) < 0) 372818334Speter error_with_decl (decl, "zero or negative size array `%s'"); 372918334Speter 373018334Speter layout_decl (decl, 0); 373118334Speter } 373218334Speter 373318334Speter if (TREE_CODE (decl) == VAR_DECL) 373418334Speter { 373590075Sobrien if (DECL_SIZE (decl) == 0 && TREE_TYPE (decl) != error_mark_node 373690075Sobrien && COMPLETE_TYPE_P (TREE_TYPE (decl))) 373718334Speter layout_decl (decl, 0); 373818334Speter 373918334Speter if (DECL_SIZE (decl) == 0 374090075Sobrien /* Don't give an error if we already gave one earlier. */ 374190075Sobrien && TREE_TYPE (decl) != error_mark_node 374218334Speter && (TREE_STATIC (decl) 374318334Speter ? 374418334Speter /* A static variable with an incomplete type 374518334Speter is an error if it is initialized. 374618334Speter Also if it is not file scope. 374718334Speter Otherwise, let it through, but if it is not `extern' 374818334Speter then it may cause an error message later. */ 374950397Sobrien (DECL_INITIAL (decl) != 0 375090075Sobrien || DECL_CONTEXT (decl) != 0) 375118334Speter : 375218334Speter /* An automatic variable with an incomplete type 375318334Speter is an error. */ 375418334Speter !DECL_EXTERNAL (decl))) 375518334Speter { 375618334Speter error_with_decl (decl, "storage size of `%s' isn't known"); 375718334Speter TREE_TYPE (decl) = error_mark_node; 375818334Speter } 375918334Speter 376018334Speter if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl)) 376118334Speter && DECL_SIZE (decl) != 0) 376218334Speter { 376318334Speter if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) 376418334Speter constant_expression_warning (DECL_SIZE (decl)); 376518334Speter else 376618334Speter error_with_decl (decl, "storage size of `%s' isn't constant"); 376718334Speter } 376850397Sobrien 376990075Sobrien if (TREE_USED (type)) 377050397Sobrien TREE_USED (decl) = 1; 377118334Speter } 377218334Speter 377318334Speter /* If this is a function and an assembler name is specified, it isn't 377418334Speter builtin any more. Also reset DECL_RTL so we can give it its new 377518334Speter name. */ 377618334Speter if (TREE_CODE (decl) == FUNCTION_DECL && asmspec) 377790075Sobrien { 377890075Sobrien DECL_BUILT_IN_CLASS (decl) = NOT_BUILT_IN; 377990075Sobrien SET_DECL_RTL (decl, NULL_RTX); 378090075Sobrien SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec)); 378190075Sobrien } 378218334Speter 378318334Speter /* Output the assembler code and/or RTL code for variables and functions, 378418334Speter unless the type is an undefined structure or union. 378518334Speter If not, it will get done when the type is completed. */ 378618334Speter 378718334Speter if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL) 378818334Speter { 378990075Sobrien /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 379090075Sobrien maybe_objc_check_decl (decl); 379190075Sobrien 379290075Sobrien if (!DECL_CONTEXT (decl)) 379318334Speter { 379490075Sobrien if (DECL_INITIAL (decl) == NULL_TREE 379590075Sobrien || DECL_INITIAL (decl) == error_mark_node) 379690075Sobrien /* Don't output anything 379790075Sobrien when a tentative file-scope definition is seen. 379890075Sobrien But at end of compilation, do output code for them. */ 379990075Sobrien DECL_DEFER_OUTPUT (decl) = 1; 380050397Sobrien rest_of_decl_compilation (decl, asmspec, 380150397Sobrien (DECL_CONTEXT (decl) == 0 380290075Sobrien || TREE_ASM_WRITTEN (decl)), 0); 380318334Speter } 380418334Speter else 380518334Speter { 380690075Sobrien /* This is a local variable. If there is an ASMSPEC, the 380790075Sobrien user has requested that we handle it specially. */ 380890075Sobrien if (asmspec) 380990075Sobrien { 381090075Sobrien /* In conjunction with an ASMSPEC, the `register' 381190075Sobrien keyword indicates that we should place the variable 381290075Sobrien in a particular register. */ 381390075Sobrien if (DECL_REGISTER (decl)) 381490075Sobrien DECL_C_HARD_REGISTER (decl) = 1; 381590075Sobrien 381690075Sobrien /* If this is not a static variable, issue a warning. 381790075Sobrien It doesn't make any sense to give an ASMSPEC for an 381890075Sobrien ordinary, non-register local variable. Historically, 381990075Sobrien GCC has accepted -- but ignored -- the ASMSPEC in 382090075Sobrien this case. */ 382190075Sobrien if (TREE_CODE (decl) == VAR_DECL 382290075Sobrien && !DECL_REGISTER (decl) 382390075Sobrien && !TREE_STATIC (decl)) 382490075Sobrien warning_with_decl (decl, 382590075Sobrien "ignoring asm-specifier for non-static local variable `%s'"); 382690075Sobrien else 382790075Sobrien SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec)); 382890075Sobrien } 382990075Sobrien 383090075Sobrien if (TREE_CODE (decl) != FUNCTION_DECL) 383190075Sobrien add_decl_stmt (decl); 383218334Speter } 383390075Sobrien 383418334Speter if (DECL_CONTEXT (decl) != 0) 383518334Speter { 383618334Speter /* Recompute the RTL of a local array now 383718334Speter if it used to be an incomplete type. */ 383818334Speter if (was_incomplete 383918334Speter && ! TREE_STATIC (decl) && ! DECL_EXTERNAL (decl)) 384018334Speter { 384118334Speter /* If we used it already as memory, it must stay in memory. */ 384218334Speter TREE_ADDRESSABLE (decl) = TREE_USED (decl); 384318334Speter /* If it's still incomplete now, no init will save it. */ 384418334Speter if (DECL_SIZE (decl) == 0) 384518334Speter DECL_INITIAL (decl) = 0; 384618334Speter } 384718334Speter } 384818334Speter } 384918334Speter 385018334Speter if (TREE_CODE (decl) == TYPE_DECL) 385118334Speter { 385218334Speter /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 385318334Speter maybe_objc_check_decl (decl); 385490075Sobrien rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == 0, 0); 385518334Speter } 385618334Speter 385718334Speter /* At the end of a declaration, throw away any variable type sizes 385818334Speter of types defined inside that declaration. There is no use 385918334Speter computing them in the following function definition. */ 386018334Speter if (current_binding_level == global_binding_level) 386118334Speter get_pending_sizes (); 386218334Speter} 386318334Speter 386418334Speter/* If DECL has a cleanup, build and return that cleanup here. 386518334Speter This is a callback called by expand_expr. */ 386618334Speter 386718334Spetertree 386818334Spetermaybe_build_cleanup (decl) 386950397Sobrien tree decl ATTRIBUTE_UNUSED; 387018334Speter{ 387118334Speter /* There are no cleanups in C. */ 387218334Speter return NULL_TREE; 387318334Speter} 387418334Speter 387518334Speter/* Given a parsed parameter declaration, 387618334Speter decode it into a PARM_DECL and push that on the current binding level. 387718334Speter Also, for the sake of forward parm decls, 387818334Speter record the given order of parms in `parm_order'. */ 387918334Speter 388018334Spetervoid 388118334Speterpush_parm_decl (parm) 388218334Speter tree parm; 388318334Speter{ 388418334Speter tree decl; 388518334Speter int old_immediate_size_expand = immediate_size_expand; 388618334Speter /* Don't try computing parm sizes now -- wait till fn is called. */ 388718334Speter immediate_size_expand = 0; 388818334Speter 388918334Speter decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)), 389096263Sobrien TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0); 389190075Sobrien decl_attributes (&decl, TREE_VALUE (parm), 0); 389218334Speter 389318334Speter#if 0 389418334Speter if (DECL_NAME (decl)) 389518334Speter { 389618334Speter tree olddecl; 389718334Speter olddecl = lookup_name (DECL_NAME (decl)); 389818334Speter if (pedantic && olddecl != 0 && TREE_CODE (olddecl) == TYPE_DECL) 389990075Sobrien pedwarn_with_decl (decl, 390090075Sobrien "ISO C forbids parameter `%s' shadowing typedef"); 390118334Speter } 390218334Speter#endif 390318334Speter 390418334Speter decl = pushdecl (decl); 390518334Speter 390618334Speter immediate_size_expand = old_immediate_size_expand; 390718334Speter 390818334Speter current_binding_level->parm_order 390918334Speter = tree_cons (NULL_TREE, decl, current_binding_level->parm_order); 391018334Speter 391118334Speter /* Add this decl to the current binding level. */ 391218334Speter finish_decl (decl, NULL_TREE, NULL_TREE); 391318334Speter} 391418334Speter 391518334Speter/* Clear the given order of parms in `parm_order'. 391618334Speter Used at start of parm list, 391718334Speter and also at semicolon terminating forward decls. */ 391818334Speter 391918334Spetervoid 392018334Speterclear_parm_order () 392118334Speter{ 392218334Speter current_binding_level->parm_order = NULL_TREE; 392318334Speter} 392418334Speter 392590075Sobrien/* Build a COMPOUND_LITERAL_EXPR. TYPE is the type given in the compound 392690075Sobrien literal, which may be an incomplete array type completed by the 392790075Sobrien initializer; INIT is a CONSTRUCTOR that initializes the compound 392890075Sobrien literal. */ 392990075Sobrien 393090075Sobrientree 393190075Sobrienbuild_compound_literal (type, init) 393290075Sobrien tree type; 393390075Sobrien tree init; 393490075Sobrien{ 393590075Sobrien /* We do not use start_decl here because we have a type, not a declarator; 393690075Sobrien and do not use finish_decl because the decl should be stored inside 393790075Sobrien the COMPOUND_LITERAL_EXPR rather than added elsewhere as a DECL_STMT. */ 393890075Sobrien tree decl = build_decl (VAR_DECL, NULL_TREE, type); 393990075Sobrien tree complit; 394090075Sobrien tree stmt; 394190075Sobrien DECL_EXTERNAL (decl) = 0; 394290075Sobrien TREE_PUBLIC (decl) = 0; 394390075Sobrien TREE_STATIC (decl) = (current_binding_level == global_binding_level); 394490075Sobrien DECL_CONTEXT (decl) = current_function_decl; 394590075Sobrien TREE_USED (decl) = 1; 394690075Sobrien TREE_TYPE (decl) = type; 3947102790Skan TREE_READONLY (decl) = TREE_READONLY (type); 394890075Sobrien store_init_value (decl, init); 394990075Sobrien 395090075Sobrien if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type)) 395190075Sobrien { 395290075Sobrien int failure = complete_array_type (type, DECL_INITIAL (decl), 1); 395390075Sobrien if (failure) 395490075Sobrien abort (); 395590075Sobrien } 395690075Sobrien 395790075Sobrien type = TREE_TYPE (decl); 395890075Sobrien if (type == error_mark_node || !COMPLETE_TYPE_P (type)) 395990075Sobrien return error_mark_node; 396090075Sobrien 396190075Sobrien stmt = build_stmt (DECL_STMT, decl); 396290075Sobrien complit = build1 (COMPOUND_LITERAL_EXPR, TREE_TYPE (decl), stmt); 396390075Sobrien TREE_SIDE_EFFECTS (complit) = 1; 396490075Sobrien 396590075Sobrien layout_decl (decl, 0); 396690075Sobrien 396790075Sobrien if (TREE_STATIC (decl)) 396890075Sobrien { 396990075Sobrien /* This decl needs a name for the assembler output. We also need 3970102790Skan a unique suffix to be added to the name. */ 3971102790Skan char *name; 3972102790Skan extern int var_labelno; 3973102790Skan 3974102790Skan ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal", var_labelno); 3975102790Skan var_labelno++; 3976102790Skan DECL_NAME (decl) = get_identifier (name); 3977102790Skan DECL_DEFER_OUTPUT (decl) = 1; 3978102790Skan DECL_COMDAT (decl) = 1; 3979102790Skan DECL_ARTIFICIAL (decl) = 1; 3980102790Skan pushdecl (decl); 398190075Sobrien rest_of_decl_compilation (decl, NULL, 1, 0); 398290075Sobrien } 398390075Sobrien 398490075Sobrien return complit; 398590075Sobrien} 398690075Sobrien 398718334Speter/* Make TYPE a complete type based on INITIAL_VALUE. 398818334Speter Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, 398918334Speter 2 if there was no information (in which case assume 1 if DO_DEFAULT). */ 399018334Speter 399118334Speterint 399218334Spetercomplete_array_type (type, initial_value, do_default) 399318334Speter tree type; 399418334Speter tree initial_value; 399518334Speter int do_default; 399618334Speter{ 399790075Sobrien tree maxindex = NULL_TREE; 399818334Speter int value = 0; 399918334Speter 400018334Speter if (initial_value) 400118334Speter { 400218334Speter /* Note MAXINDEX is really the maximum index, 400318334Speter one less than the size. */ 400418334Speter if (TREE_CODE (initial_value) == STRING_CST) 400518334Speter { 400618334Speter int eltsize 400718334Speter = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value))); 400818334Speter maxindex = build_int_2 ((TREE_STRING_LENGTH (initial_value) 400918334Speter / eltsize) - 1, 0); 401018334Speter } 401118334Speter else if (TREE_CODE (initial_value) == CONSTRUCTOR) 401218334Speter { 401318334Speter tree elts = CONSTRUCTOR_ELTS (initial_value); 401490075Sobrien maxindex = build_int_2 (-1, -1); 401518334Speter for (; elts; elts = TREE_CHAIN (elts)) 401618334Speter { 401718334Speter if (TREE_PURPOSE (elts)) 401818334Speter maxindex = TREE_PURPOSE (elts); 401918334Speter else 402090075Sobrien maxindex = fold (build (PLUS_EXPR, integer_type_node, 402190075Sobrien maxindex, integer_one_node)); 402218334Speter } 402318334Speter maxindex = copy_node (maxindex); 402418334Speter } 402518334Speter else 402618334Speter { 402718334Speter /* Make an error message unless that happened already. */ 402818334Speter if (initial_value != error_mark_node) 402918334Speter value = 1; 403018334Speter 403118334Speter /* Prevent further error messages. */ 403218334Speter maxindex = build_int_2 (0, 0); 403318334Speter } 403418334Speter } 403518334Speter 403618334Speter if (!maxindex) 403718334Speter { 403818334Speter if (do_default) 403918334Speter maxindex = build_int_2 (0, 0); 404018334Speter value = 2; 404118334Speter } 404218334Speter 404318334Speter if (maxindex) 404418334Speter { 404518334Speter TYPE_DOMAIN (type) = build_index_type (maxindex); 404618334Speter if (!TREE_TYPE (maxindex)) 404718334Speter TREE_TYPE (maxindex) = TYPE_DOMAIN (type); 404818334Speter } 404918334Speter 405018334Speter /* Lay out the type now that we can get the real answer. */ 405118334Speter 405218334Speter layout_type (type); 405318334Speter 405418334Speter return value; 405518334Speter} 405618334Speter 405718334Speter/* Given declspecs and a declarator, 405818334Speter determine the name and type of the object declared 405918334Speter and construct a ..._DECL node for it. 406018334Speter (In one case we can return a ..._TYPE node instead. 406118334Speter For invalid input we sometimes return 0.) 406218334Speter 406318334Speter DECLSPECS is a chain of tree_list nodes whose value fields 406418334Speter are the storage classes and type specifiers. 406518334Speter 406618334Speter DECL_CONTEXT says which syntactic context this declaration is in: 406718334Speter NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL. 406818334Speter FUNCDEF for a function definition. Like NORMAL but a few different 406918334Speter error messages in each case. Return value may be zero meaning 407018334Speter this definition is too screwy to try to parse. 407118334Speter PARM for a parameter declaration (either within a function prototype 407218334Speter or before a function body). Make a PARM_DECL, or return void_type_node. 407318334Speter TYPENAME if for a typename (in a cast or sizeof). 407418334Speter Don't make a DECL node; just return the ..._TYPE node. 407518334Speter FIELD for a struct or union field; make a FIELD_DECL. 407696263Sobrien BITFIELD for a field with specified width. 407718334Speter INITIALIZED is 1 if the decl has an initializer. 407818334Speter 407918334Speter In the TYPENAME case, DECLARATOR is really an absolute declarator. 408018334Speter It may also be so in the PARM case, for a prototype where the 408118334Speter argument type is specified but not the name. 408218334Speter 408318334Speter This function is where the complicated C meanings of `static' 408418334Speter and `extern' are interpreted. */ 408518334Speter 408618334Speterstatic tree 408796263Sobriengrokdeclarator (declarator, declspecs, decl_context, initialized) 408818334Speter tree declspecs; 408918334Speter tree declarator; 409018334Speter enum decl_context decl_context; 409118334Speter int initialized; 409218334Speter{ 409318334Speter int specbits = 0; 409418334Speter tree spec; 409518334Speter tree type = NULL_TREE; 409618334Speter int longlong = 0; 409718334Speter int constp; 409852284Sobrien int restrictp; 409918334Speter int volatilep; 410052284Sobrien int type_quals = TYPE_UNQUALIFIED; 410118334Speter int inlinep; 410218334Speter int explicit_int = 0; 410318334Speter int explicit_char = 0; 410418334Speter int defaulted_int = 0; 410518334Speter tree typedef_decl = 0; 410696263Sobrien const char *name; 410718334Speter tree typedef_type = 0; 410818334Speter int funcdef_flag = 0; 410918334Speter enum tree_code innermost_code = ERROR_MARK; 411096263Sobrien int bitfield = 0; 411118334Speter int size_varies = 0; 411290075Sobrien tree decl_attr = NULL_TREE; 411390075Sobrien tree array_ptr_quals = NULL_TREE; 411490075Sobrien int array_parm_static = 0; 411590075Sobrien tree returned_attrs = NULL_TREE; 411618334Speter 411796263Sobrien if (decl_context == BITFIELD) 411896263Sobrien bitfield = 1, decl_context = FIELD; 411996263Sobrien 412018334Speter if (decl_context == FUNCDEF) 412118334Speter funcdef_flag = 1, decl_context = NORMAL; 412218334Speter 412318334Speter /* Look inside a declarator for the name being declared 412418334Speter and get it as a string, for an error message. */ 412518334Speter { 412690075Sobrien tree decl = declarator; 412718334Speter name = 0; 412818334Speter 412918334Speter while (decl) 413018334Speter switch (TREE_CODE (decl)) 413118334Speter { 413218334Speter case ARRAY_REF: 413318334Speter case INDIRECT_REF: 413418334Speter case CALL_EXPR: 413518334Speter innermost_code = TREE_CODE (decl); 413618334Speter decl = TREE_OPERAND (decl, 0); 413718334Speter break; 413818334Speter 413990075Sobrien case TREE_LIST: 414090075Sobrien decl = TREE_VALUE (decl); 414190075Sobrien break; 414290075Sobrien 414318334Speter case IDENTIFIER_NODE: 414418334Speter name = IDENTIFIER_POINTER (decl); 414518334Speter decl = 0; 414618334Speter break; 414718334Speter 414818334Speter default: 414918334Speter abort (); 415018334Speter } 415118334Speter if (name == 0) 415218334Speter name = "type name"; 415318334Speter } 415418334Speter 415518334Speter /* A function definition's declarator must have the form of 415618334Speter a function declarator. */ 415718334Speter 415818334Speter if (funcdef_flag && innermost_code != CALL_EXPR) 415918334Speter return 0; 416018334Speter 416118334Speter /* Anything declared one level down from the top level 416218334Speter must be one of the parameters of a function 416318334Speter (because the body is at least two levels down). */ 416418334Speter 416518334Speter /* If this looks like a function definition, make it one, 416618334Speter even if it occurs where parms are expected. 416718334Speter Then store_parm_decls will reject it and not use it as a parm. */ 416818334Speter if (decl_context == NORMAL && !funcdef_flag 416918334Speter && current_binding_level->parm_flag) 417018334Speter decl_context = PARM; 417118334Speter 417218334Speter /* Look through the decl specs and record which ones appear. 417318334Speter Some typespecs are defined as built-in typenames. 417418334Speter Others, the ones that are modifiers of other types, 417518334Speter are represented by bits in SPECBITS: set the bits for 417618334Speter the modifiers that appear. Storage class keywords are also in SPECBITS. 417718334Speter 417818334Speter If there is a typedef name or a type, store the type in TYPE. 417918334Speter This includes builtin typedefs such as `int'. 418018334Speter 418118334Speter Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char' 418218334Speter and did not come from a user typedef. 418318334Speter 418418334Speter Set LONGLONG if `long' is mentioned twice. */ 418518334Speter 418618334Speter for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) 418718334Speter { 418890075Sobrien tree id = TREE_VALUE (spec); 418918334Speter 419090075Sobrien /* If the entire declaration is itself tagged as deprecated then 419190075Sobrien suppress reports of deprecated items. */ 419290075Sobrien if (id && TREE_DEPRECATED (id)) 419390075Sobrien { 419490075Sobrien if (deprecated_state != DEPRECATED_SUPPRESS) 419590075Sobrien warn_deprecated_use (id); 419690075Sobrien } 419790075Sobrien 419818334Speter if (id == ridpointers[(int) RID_INT]) 419918334Speter explicit_int = 1; 420018334Speter if (id == ridpointers[(int) RID_CHAR]) 420118334Speter explicit_char = 1; 420218334Speter 420390075Sobrien if (TREE_CODE (id) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (id)) 420490075Sobrien { 420590075Sobrien enum rid i = C_RID_CODE (id); 420690075Sobrien if ((int) i <= (int) RID_LAST_MODIFIER) 420790075Sobrien { 420890075Sobrien if (i == RID_LONG && (specbits & (1 << (int) i))) 420990075Sobrien { 421090075Sobrien if (longlong) 421190075Sobrien error ("`long long long' is too long for GCC"); 421290075Sobrien else 421390075Sobrien { 421490075Sobrien if (pedantic && !flag_isoc99 && ! in_system_header 421590075Sobrien && warn_long_long) 421690075Sobrien pedwarn ("ISO C89 does not support `long long'"); 421790075Sobrien longlong = 1; 421890075Sobrien } 421990075Sobrien } 422090075Sobrien else if (specbits & (1 << (int) i)) 422190075Sobrien pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); 422290075Sobrien specbits |= 1 << (int) i; 422390075Sobrien goto found; 422490075Sobrien } 422590075Sobrien } 422618334Speter if (type) 422718334Speter error ("two or more data types in declaration of `%s'", name); 422818334Speter /* Actual typedefs come to us as TYPE_DECL nodes. */ 422918334Speter else if (TREE_CODE (id) == TYPE_DECL) 423018334Speter { 423190075Sobrien if (TREE_TYPE (id) == error_mark_node) 423290075Sobrien ; /* Allow the type to default to int to avoid cascading errors. */ 423390075Sobrien else 423490075Sobrien { 423590075Sobrien type = TREE_TYPE (id); 423690075Sobrien decl_attr = DECL_ATTRIBUTES (id); 423790075Sobrien typedef_decl = id; 423890075Sobrien } 423918334Speter } 424018334Speter /* Built-in types come as identifiers. */ 424118334Speter else if (TREE_CODE (id) == IDENTIFIER_NODE) 424218334Speter { 424390075Sobrien tree t = lookup_name (id); 424418334Speter if (TREE_TYPE (t) == error_mark_node) 424518334Speter ; 424618334Speter else if (!t || TREE_CODE (t) != TYPE_DECL) 424718334Speter error ("`%s' fails to be a typedef or built in type", 424818334Speter IDENTIFIER_POINTER (id)); 424918334Speter else 425018334Speter { 425118334Speter type = TREE_TYPE (t); 425218334Speter typedef_decl = t; 425318334Speter } 425418334Speter } 425518334Speter else if (TREE_CODE (id) != ERROR_MARK) 425618334Speter type = id; 425718334Speter 425890075Sobrien found: 425990075Sobrien ; 426018334Speter } 426118334Speter 426218334Speter typedef_type = type; 426318334Speter if (type) 426418334Speter size_varies = C_TYPE_VARIABLE_SIZE (type); 426518334Speter 426618334Speter /* No type at all: default to `int', and set DEFAULTED_INT 426718334Speter because it was not a user-defined typedef. */ 426818334Speter 426918334Speter if (type == 0) 427018334Speter { 427150397Sobrien if ((! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 427250397Sobrien | (1 << (int) RID_SIGNED) 427390075Sobrien | (1 << (int) RID_UNSIGNED) 427490075Sobrien | (1 << (int) RID_COMPLEX)))) 427550397Sobrien /* Don't warn about typedef foo = bar. */ 427650397Sobrien && ! (specbits & (1 << (int) RID_TYPEDEF) && initialized) 427790075Sobrien && ! in_system_header) 427850397Sobrien { 427990075Sobrien /* Issue a warning if this is an ISO C 99 program or if -Wreturn-type 428052284Sobrien and this is a function, or if -Wimplicit; prefer the former 428152284Sobrien warning since it is more explicit. */ 428290075Sobrien if ((warn_implicit_int || warn_return_type || flag_isoc99) 428390075Sobrien && funcdef_flag) 428450397Sobrien warn_about_return_type = 1; 428590075Sobrien else if (warn_implicit_int || flag_isoc99) 428690075Sobrien pedwarn_c99 ("type defaults to `int' in declaration of `%s'", 428790075Sobrien name); 428850397Sobrien } 428950397Sobrien 429018334Speter defaulted_int = 1; 429118334Speter type = integer_type_node; 429218334Speter } 429318334Speter 429418334Speter /* Now process the modifiers that were specified 429518334Speter and check for invalid combinations. */ 429618334Speter 429718334Speter /* Long double is a special combination. */ 429818334Speter 429950397Sobrien if ((specbits & 1 << (int) RID_LONG) && ! longlong 430018334Speter && TYPE_MAIN_VARIANT (type) == double_type_node) 430118334Speter { 430290075Sobrien specbits &= ~(1 << (int) RID_LONG); 430318334Speter type = long_double_type_node; 430418334Speter } 430518334Speter 430618334Speter /* Check all other uses of type modifiers. */ 430718334Speter 430818334Speter if (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 430918334Speter | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED))) 431018334Speter { 431118334Speter int ok = 0; 431218334Speter 431350397Sobrien if ((specbits & 1 << (int) RID_LONG) 431450397Sobrien && (specbits & 1 << (int) RID_SHORT)) 431550397Sobrien error ("both long and short specified for `%s'", name); 431618334Speter else if (((specbits & 1 << (int) RID_LONG) 431718334Speter || (specbits & 1 << (int) RID_SHORT)) 431818334Speter && explicit_char) 431918334Speter error ("long or short specified with char for `%s'", name); 432018334Speter else if (((specbits & 1 << (int) RID_LONG) 432118334Speter || (specbits & 1 << (int) RID_SHORT)) 432218334Speter && TREE_CODE (type) == REAL_TYPE) 432350397Sobrien { 432450397Sobrien static int already = 0; 432550397Sobrien 432650397Sobrien error ("long or short specified with floating type for `%s'", name); 432750397Sobrien if (! already && ! pedantic) 432850397Sobrien { 432950397Sobrien error ("the only valid combination is `long double'"); 433050397Sobrien already = 1; 433150397Sobrien } 433250397Sobrien } 433318334Speter else if ((specbits & 1 << (int) RID_SIGNED) 433418334Speter && (specbits & 1 << (int) RID_UNSIGNED)) 433550397Sobrien error ("both signed and unsigned specified for `%s'", name); 433650397Sobrien else if (TREE_CODE (type) != INTEGER_TYPE) 433750397Sobrien error ("long, short, signed or unsigned invalid for `%s'", name); 433818334Speter else 433918334Speter { 434018334Speter ok = 1; 434118334Speter if (!explicit_int && !defaulted_int && !explicit_char && pedantic) 434218334Speter { 434318334Speter pedwarn ("long, short, signed or unsigned used invalidly for `%s'", 434418334Speter name); 434518334Speter if (flag_pedantic_errors) 434618334Speter ok = 0; 434718334Speter } 434818334Speter } 434918334Speter 435018334Speter /* Discard the type modifiers if they are invalid. */ 435118334Speter if (! ok) 435218334Speter { 435318334Speter specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 435418334Speter | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED)); 435518334Speter longlong = 0; 435618334Speter } 435718334Speter } 435818334Speter 435918334Speter if ((specbits & (1 << (int) RID_COMPLEX)) 436018334Speter && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE) 436118334Speter { 436218334Speter error ("complex invalid for `%s'", name); 436390075Sobrien specbits &= ~(1 << (int) RID_COMPLEX); 436418334Speter } 436518334Speter 436618334Speter /* Decide whether an integer type is signed or not. 436796263Sobrien Optionally treat bitfields as signed by default. */ 436818334Speter if (specbits & 1 << (int) RID_UNSIGNED 436996263Sobrien /* Traditionally, all bitfields are unsigned. */ 437018334Speter || (bitfield && flag_traditional 437118334Speter && (! explicit_flag_signed_bitfields || !flag_signed_bitfields)) 437218334Speter || (bitfield && ! flag_signed_bitfields 437318334Speter && (explicit_int || defaulted_int || explicit_char 437418334Speter /* A typedef for plain `int' without `signed' 437518334Speter can be controlled just like plain `int'. */ 437618334Speter || ! (typedef_decl != 0 437718334Speter && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) 437818334Speter && TREE_CODE (type) != ENUMERAL_TYPE 437918334Speter && !(specbits & 1 << (int) RID_SIGNED))) 438018334Speter { 438118334Speter if (longlong) 438218334Speter type = long_long_unsigned_type_node; 438318334Speter else if (specbits & 1 << (int) RID_LONG) 438418334Speter type = long_unsigned_type_node; 438518334Speter else if (specbits & 1 << (int) RID_SHORT) 438618334Speter type = short_unsigned_type_node; 438718334Speter else if (type == char_type_node) 438818334Speter type = unsigned_char_type_node; 438918334Speter else if (typedef_decl) 439018334Speter type = unsigned_type (type); 439118334Speter else 439218334Speter type = unsigned_type_node; 439318334Speter } 439418334Speter else if ((specbits & 1 << (int) RID_SIGNED) 439518334Speter && type == char_type_node) 439618334Speter type = signed_char_type_node; 439718334Speter else if (longlong) 439818334Speter type = long_long_integer_type_node; 439918334Speter else if (specbits & 1 << (int) RID_LONG) 440018334Speter type = long_integer_type_node; 440118334Speter else if (specbits & 1 << (int) RID_SHORT) 440218334Speter type = short_integer_type_node; 440318334Speter 440418334Speter if (specbits & 1 << (int) RID_COMPLEX) 440518334Speter { 440690075Sobrien if (pedantic && !flag_isoc99) 440790075Sobrien pedwarn ("ISO C89 does not support complex types"); 440818334Speter /* If we just have "complex", it is equivalent to 440918334Speter "complex double", but if any modifiers at all are specified it is 441018334Speter the complex form of TYPE. E.g, "complex short" is 441118334Speter "complex short int". */ 441218334Speter 441318334Speter if (defaulted_int && ! longlong 441418334Speter && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 441518334Speter | (1 << (int) RID_SIGNED) 441618334Speter | (1 << (int) RID_UNSIGNED)))) 441790075Sobrien { 441890075Sobrien if (pedantic) 441990075Sobrien pedwarn ("ISO C does not support plain `complex' meaning `double complex'"); 442090075Sobrien type = complex_double_type_node; 442190075Sobrien } 442218334Speter else if (type == integer_type_node) 442390075Sobrien { 442490075Sobrien if (pedantic) 442590075Sobrien pedwarn ("ISO C does not support complex integer types"); 442690075Sobrien type = complex_integer_type_node; 442790075Sobrien } 442818334Speter else if (type == float_type_node) 442918334Speter type = complex_float_type_node; 443018334Speter else if (type == double_type_node) 443118334Speter type = complex_double_type_node; 443218334Speter else if (type == long_double_type_node) 443318334Speter type = complex_long_double_type_node; 443418334Speter else 443590075Sobrien { 443690075Sobrien if (pedantic) 443790075Sobrien pedwarn ("ISO C does not support complex integer types"); 443890075Sobrien type = build_complex_type (type); 443990075Sobrien } 444018334Speter } 444118334Speter 444252284Sobrien /* Figure out the type qualifiers for the declaration. There are 444352284Sobrien two ways a declaration can become qualified. One is something 444452284Sobrien like `const int i' where the `const' is explicit. Another is 444552284Sobrien something like `typedef const int CI; CI i' where the type of the 444652284Sobrien declaration contains the `const'. */ 444718334Speter constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (type); 444852284Sobrien restrictp = !! (specbits & 1 << (int) RID_RESTRICT) + TYPE_RESTRICT (type); 444918334Speter volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type); 445018334Speter inlinep = !! (specbits & (1 << (int) RID_INLINE)); 445190075Sobrien if (constp > 1 && ! flag_isoc99) 445218334Speter pedwarn ("duplicate `const'"); 445390075Sobrien if (restrictp > 1 && ! flag_isoc99) 445452284Sobrien pedwarn ("duplicate `restrict'"); 445590075Sobrien if (volatilep > 1 && ! flag_isoc99) 445618334Speter pedwarn ("duplicate `volatile'"); 445752284Sobrien if (! flag_gen_aux_info && (TYPE_QUALS (type))) 445818334Speter type = TYPE_MAIN_VARIANT (type); 445952284Sobrien type_quals = ((constp ? TYPE_QUAL_CONST : 0) 446052284Sobrien | (restrictp ? TYPE_QUAL_RESTRICT : 0) 446152284Sobrien | (volatilep ? TYPE_QUAL_VOLATILE : 0)); 446218334Speter 446318334Speter /* Warn if two storage classes are given. Default to `auto'. */ 446418334Speter 446518334Speter { 446618334Speter int nclasses = 0; 446718334Speter 446818334Speter if (specbits & 1 << (int) RID_AUTO) nclasses++; 446918334Speter if (specbits & 1 << (int) RID_STATIC) nclasses++; 447018334Speter if (specbits & 1 << (int) RID_EXTERN) nclasses++; 447118334Speter if (specbits & 1 << (int) RID_REGISTER) nclasses++; 447218334Speter if (specbits & 1 << (int) RID_TYPEDEF) nclasses++; 447318334Speter 447418334Speter /* Warn about storage classes that are invalid for certain 447518334Speter kinds of declarations (parameters, typenames, etc.). */ 447618334Speter 447718334Speter if (nclasses > 1) 447818334Speter error ("multiple storage classes in declaration of `%s'", name); 447918334Speter else if (funcdef_flag 448018334Speter && (specbits 448118334Speter & ((1 << (int) RID_REGISTER) 448218334Speter | (1 << (int) RID_AUTO) 448318334Speter | (1 << (int) RID_TYPEDEF)))) 448418334Speter { 448518334Speter if (specbits & 1 << (int) RID_AUTO 448618334Speter && (pedantic || current_binding_level == global_binding_level)) 448718334Speter pedwarn ("function definition declared `auto'"); 448818334Speter if (specbits & 1 << (int) RID_REGISTER) 448918334Speter error ("function definition declared `register'"); 449018334Speter if (specbits & 1 << (int) RID_TYPEDEF) 449118334Speter error ("function definition declared `typedef'"); 449290075Sobrien specbits &= ~((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) 449390075Sobrien | (1 << (int) RID_AUTO)); 449418334Speter } 449518334Speter else if (decl_context != NORMAL && nclasses > 0) 449618334Speter { 449718334Speter if (decl_context == PARM && specbits & 1 << (int) RID_REGISTER) 449818334Speter ; 449918334Speter else 450018334Speter { 450190075Sobrien switch (decl_context) 450290075Sobrien { 450390075Sobrien case FIELD: 450490075Sobrien error ("storage class specified for structure field `%s'", 450590075Sobrien name); 450690075Sobrien break; 450790075Sobrien case PARM: 450890075Sobrien error ("storage class specified for parameter `%s'", name); 450990075Sobrien break; 451090075Sobrien default: 451190075Sobrien error ("storage class specified for typename"); 451290075Sobrien break; 451390075Sobrien } 451490075Sobrien specbits &= ~((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) 451590075Sobrien | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC) 451690075Sobrien | (1 << (int) RID_EXTERN)); 451718334Speter } 451818334Speter } 451918334Speter else if (specbits & 1 << (int) RID_EXTERN && initialized && ! funcdef_flag) 452018334Speter { 452118334Speter /* `extern' with initialization is invalid if not at top level. */ 452218334Speter if (current_binding_level == global_binding_level) 452318334Speter warning ("`%s' initialized and declared `extern'", name); 452418334Speter else 452518334Speter error ("`%s' has both `extern' and initializer", name); 452618334Speter } 452718334Speter else if (specbits & 1 << (int) RID_EXTERN && funcdef_flag 452818334Speter && current_binding_level != global_binding_level) 452918334Speter error ("nested function `%s' declared `extern'", name); 453018334Speter else if (current_binding_level == global_binding_level 453118334Speter && specbits & (1 << (int) RID_AUTO)) 453218334Speter error ("top-level declaration of `%s' specifies `auto'", name); 453318334Speter } 453418334Speter 453518334Speter /* Now figure out the structure of the declarator proper. 453618334Speter Descend through it, creating more complex types, until we reach 453718334Speter the declared identifier (or NULL_TREE, in an absolute declarator). */ 453818334Speter 453918334Speter while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE) 454018334Speter { 454118334Speter if (type == error_mark_node) 454218334Speter { 454318334Speter declarator = TREE_OPERAND (declarator, 0); 454418334Speter continue; 454518334Speter } 454618334Speter 454718334Speter /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]), 454818334Speter an INDIRECT_REF (for *...), 454918334Speter a CALL_EXPR (for ...(...)), 455090075Sobrien a TREE_LIST (for nested attributes), 455118334Speter an identifier (for the name being declared) 455218334Speter or a null pointer (for the place in an absolute declarator 455318334Speter where the name was omitted). 455418334Speter For the last two cases, we have just exited the loop. 455518334Speter 455618334Speter At this point, TYPE is the type of elements of an array, 455718334Speter or for a function to return, or for a pointer to point to. 455818334Speter After this sequence of ifs, TYPE is the type of the 455918334Speter array or function or pointer, and DECLARATOR has had its 456018334Speter outermost layer removed. */ 456118334Speter 456290075Sobrien if (array_ptr_quals != NULL_TREE || array_parm_static) 456318334Speter { 456490075Sobrien /* Only the innermost declarator (making a parameter be of 456590075Sobrien array type which is converted to pointer type) 456690075Sobrien may have static or type qualifiers. */ 456790075Sobrien error ("static or type qualifiers in non-parameter array declarator"); 456890075Sobrien array_ptr_quals = NULL_TREE; 456990075Sobrien array_parm_static = 0; 457090075Sobrien } 457190075Sobrien 457290075Sobrien if (TREE_CODE (declarator) == TREE_LIST) 457390075Sobrien { 457490075Sobrien /* We encode a declarator with embedded attributes using 457590075Sobrien a TREE_LIST. */ 457690075Sobrien tree attrs = TREE_PURPOSE (declarator); 457790075Sobrien tree inner_decl; 457890075Sobrien int attr_flags = 0; 457990075Sobrien declarator = TREE_VALUE (declarator); 458090075Sobrien inner_decl = declarator; 458190075Sobrien while (inner_decl != NULL_TREE 458290075Sobrien && TREE_CODE (inner_decl) == TREE_LIST) 458390075Sobrien inner_decl = TREE_VALUE (inner_decl); 458490075Sobrien if (inner_decl == NULL_TREE 458590075Sobrien || TREE_CODE (inner_decl) == IDENTIFIER_NODE) 458690075Sobrien attr_flags |= (int) ATTR_FLAG_DECL_NEXT; 458796263Sobrien else if (TREE_CODE (inner_decl) == CALL_EXPR) 458890075Sobrien attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT; 458996263Sobrien else if (TREE_CODE (inner_decl) == ARRAY_REF) 459090075Sobrien attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT; 459190075Sobrien returned_attrs = decl_attributes (&type, 459290075Sobrien chainon (returned_attrs, attrs), 459390075Sobrien attr_flags); 459490075Sobrien } 459590075Sobrien else if (TREE_CODE (declarator) == ARRAY_REF) 459690075Sobrien { 459790075Sobrien tree itype = NULL_TREE; 459890075Sobrien tree size = TREE_OPERAND (declarator, 1); 459918334Speter /* The index is a signed object `sizetype' bits wide. */ 460018334Speter tree index_type = signed_type (sizetype); 460118334Speter 460290075Sobrien array_ptr_quals = TREE_TYPE (declarator); 460390075Sobrien array_parm_static = TREE_STATIC (declarator); 460490075Sobrien 460518334Speter declarator = TREE_OPERAND (declarator, 0); 460618334Speter 460718334Speter /* Check for some types that there cannot be arrays of. */ 460818334Speter 460990075Sobrien if (VOID_TYPE_P (type)) 461018334Speter { 461118334Speter error ("declaration of `%s' as array of voids", name); 461218334Speter type = error_mark_node; 461318334Speter } 461418334Speter 461518334Speter if (TREE_CODE (type) == FUNCTION_TYPE) 461618334Speter { 461718334Speter error ("declaration of `%s' as array of functions", name); 461818334Speter type = error_mark_node; 461918334Speter } 462018334Speter 462118334Speter if (size == error_mark_node) 462218334Speter type = error_mark_node; 462318334Speter 462418334Speter if (type == error_mark_node) 462518334Speter continue; 462618334Speter 462718334Speter /* If size was specified, set ITYPE to a range-type for that size. 462818334Speter Otherwise, ITYPE remains null. finish_decl may figure it out 462918334Speter from an initial value. */ 463018334Speter 463118334Speter if (size) 463218334Speter { 463318334Speter /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ 463418334Speter STRIP_TYPE_NOPS (size); 463518334Speter 463690075Sobrien if (! INTEGRAL_TYPE_P (TREE_TYPE (size))) 463718334Speter { 463818334Speter error ("size of array `%s' has non-integer type", name); 463918334Speter size = integer_one_node; 464018334Speter } 464118334Speter 464218334Speter if (pedantic && integer_zerop (size)) 464390075Sobrien pedwarn ("ISO C forbids zero-size array `%s'", name); 464418334Speter 464518334Speter if (TREE_CODE (size) == INTEGER_CST) 464618334Speter { 464718334Speter constant_expression_warning (size); 464818334Speter if (tree_int_cst_sgn (size) < 0) 464918334Speter { 465018334Speter error ("size of array `%s' is negative", name); 465118334Speter size = integer_one_node; 465218334Speter } 465318334Speter } 465418334Speter else 465518334Speter { 465618334Speter /* Make sure the array size remains visibly nonconstant 465718334Speter even if it is (eg) a const variable with known value. */ 465818334Speter size_varies = 1; 465918334Speter 4660102790Skan if (!flag_isoc99 && pedantic) 466118334Speter { 466218334Speter if (TREE_CONSTANT (size)) 466390075Sobrien pedwarn ("ISO C89 forbids array `%s' whose size can't be evaluated", 466490075Sobrien name); 466518334Speter else 466690075Sobrien pedwarn ("ISO C89 forbids variable-size array `%s'", 466790075Sobrien name); 466818334Speter } 466918334Speter } 467018334Speter 467190075Sobrien if (integer_zerop (size)) 467250397Sobrien { 467390075Sobrien /* A zero-length array cannot be represented with an 467490075Sobrien unsigned index type, which is what we'll get with 467590075Sobrien build_index_type. Create an open-ended range instead. */ 467690075Sobrien itype = build_range_type (sizetype, size, NULL_TREE); 467750397Sobrien } 467890075Sobrien else 467990075Sobrien { 468090075Sobrien /* Compute the maximum valid index, that is, size - 1. 468190075Sobrien Do the calculation in index_type, so that if it is 468290075Sobrien a variable the computations will be done in the 468390075Sobrien proper mode. */ 468490075Sobrien itype = fold (build (MINUS_EXPR, index_type, 468590075Sobrien convert (index_type, size), 468690075Sobrien convert (index_type, size_one_node))); 468750397Sobrien 468890075Sobrien /* If that overflowed, the array is too big. 468990075Sobrien ??? While a size of INT_MAX+1 technically shouldn't 469090075Sobrien cause an overflow (because we subtract 1), the overflow 469190075Sobrien is recorded during the conversion to index_type, before 469290075Sobrien the subtraction. Handling this case seems like an 469390075Sobrien unnecessary complication. */ 469490075Sobrien if (TREE_OVERFLOW (itype)) 469590075Sobrien { 469690075Sobrien error ("size of array `%s' is too large", name); 469790075Sobrien type = error_mark_node; 469890075Sobrien continue; 469990075Sobrien } 470090075Sobrien 470190075Sobrien if (size_varies) 470290075Sobrien itype = variable_size (itype); 470390075Sobrien itype = build_index_type (itype); 470490075Sobrien } 470518334Speter } 470690075Sobrien else if (decl_context == FIELD) 470790075Sobrien { 470890075Sobrien if (pedantic && !flag_isoc99 && !in_system_header) 470990075Sobrien pedwarn ("ISO C89 does not support flexible array members"); 471018334Speter 471190075Sobrien /* ISO C99 Flexible array members are effectively identical 471290075Sobrien to GCC's zero-length array extension. */ 471390075Sobrien itype = build_range_type (sizetype, size_zero_node, NULL_TREE); 471490075Sobrien } 471518334Speter 471690075Sobrien /* If pedantic, complain about arrays of incomplete types. */ 471790075Sobrien 471890075Sobrien if (pedantic && !COMPLETE_TYPE_P (type)) 471990075Sobrien pedwarn ("array type has incomplete element type"); 472090075Sobrien 472190075Sobrien#if 0 472290075Sobrien /* We shouldn't have a function type here at all! 472390075Sobrien Functions aren't allowed as array elements. */ 472418334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 472518334Speter && (constp || volatilep)) 472690075Sobrien pedwarn ("ISO C forbids const or volatile function types"); 472718334Speter#endif 472818334Speter 472918334Speter /* Build the array type itself, then merge any constancy or 473018334Speter volatility into the target type. We must do it in this order 473118334Speter to ensure that the TYPE_MAIN_VARIANT field of the array type 473218334Speter is set correctly. */ 473318334Speter 473418334Speter type = build_array_type (type, itype); 473552284Sobrien if (type_quals) 473652284Sobrien type = c_build_qualified_type (type, type_quals); 473718334Speter 473818334Speter if (size_varies) 473918334Speter C_TYPE_VARIABLE_SIZE (type) = 1; 474090075Sobrien 474190075Sobrien /* The GCC extension for zero-length arrays differs from 474290075Sobrien ISO flexible array members in that sizeof yields zero. */ 474390075Sobrien if (size && integer_zerop (size)) 474490075Sobrien { 474590075Sobrien layout_type (type); 474690075Sobrien TYPE_SIZE (type) = bitsize_zero_node; 474790075Sobrien TYPE_SIZE_UNIT (type) = size_zero_node; 474890075Sobrien } 474990075Sobrien if (decl_context != PARM 475090075Sobrien && (array_ptr_quals != NULL_TREE || array_parm_static)) 475190075Sobrien { 475290075Sobrien error ("static or type qualifiers in non-parameter array declarator"); 475390075Sobrien array_ptr_quals = NULL_TREE; 475490075Sobrien array_parm_static = 0; 475590075Sobrien } 475618334Speter } 475718334Speter else if (TREE_CODE (declarator) == CALL_EXPR) 475818334Speter { 475918334Speter tree arg_types; 476018334Speter 476118334Speter /* Declaring a function type. 476218334Speter Make sure we have a valid type for the function to return. */ 476318334Speter if (type == error_mark_node) 476418334Speter continue; 476518334Speter 476618334Speter size_varies = 0; 476718334Speter 476818334Speter /* Warn about some types functions can't return. */ 476918334Speter 477018334Speter if (TREE_CODE (type) == FUNCTION_TYPE) 477118334Speter { 477218334Speter error ("`%s' declared as function returning a function", name); 477318334Speter type = integer_type_node; 477418334Speter } 477518334Speter if (TREE_CODE (type) == ARRAY_TYPE) 477618334Speter { 477718334Speter error ("`%s' declared as function returning an array", name); 477818334Speter type = integer_type_node; 477918334Speter } 478018334Speter 478118334Speter#ifndef TRADITIONAL_RETURN_FLOAT 478218334Speter /* Traditionally, declaring return type float means double. */ 478318334Speter 478418334Speter if (flag_traditional && TYPE_MAIN_VARIANT (type) == float_type_node) 478518334Speter type = double_type_node; 478618334Speter#endif /* TRADITIONAL_RETURN_FLOAT */ 478718334Speter 478818334Speter /* Construct the function type and go to the next 478918334Speter inner layer of declarator. */ 479018334Speter 479118334Speter arg_types = grokparms (TREE_OPERAND (declarator, 1), 479218334Speter funcdef_flag 479318334Speter /* Say it's a definition 479418334Speter only for the CALL_EXPR 479518334Speter closest to the identifier. */ 479618334Speter && TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE); 479752284Sobrien /* Type qualifiers before the return type of the function 479852284Sobrien qualify the return type, not the function type. */ 479952284Sobrien if (type_quals) 480090075Sobrien { 480190075Sobrien /* Type qualifiers on a function return type are normally 480290075Sobrien permitted by the standard but have no effect, so give a 480390075Sobrien warning at -W. Qualifiers on a void return type have 480490075Sobrien meaning as a GNU extension, and are banned on function 480590075Sobrien definitions in ISO C. FIXME: strictly we shouldn't 480690075Sobrien pedwarn for qualified void return types except on function 480790075Sobrien definitions, but not doing so could lead to the undesirable 480890075Sobrien state of a "volatile void" function return type not being 480990075Sobrien warned about, and a use of the function being compiled 481090075Sobrien with GNU semantics, with no diagnostics under -pedantic. */ 481190075Sobrien if (VOID_TYPE_P (type) && pedantic && !in_system_header) 481290075Sobrien pedwarn ("ISO C forbids qualified void function return type"); 481390075Sobrien else if (extra_warnings 481490075Sobrien && !(VOID_TYPE_P (type) 481590075Sobrien && type_quals == TYPE_QUAL_VOLATILE)) 481690075Sobrien warning ("type qualifiers ignored on function return type"); 481790075Sobrien 481890075Sobrien type = c_build_qualified_type (type, type_quals); 481990075Sobrien } 482052284Sobrien type_quals = TYPE_UNQUALIFIED; 482118334Speter 482218334Speter type = build_function_type (type, arg_types); 482318334Speter declarator = TREE_OPERAND (declarator, 0); 482418334Speter 482518334Speter /* Set the TYPE_CONTEXTs for each tagged type which is local to 482618334Speter the formal parameter list of this FUNCTION_TYPE to point to 482718334Speter the FUNCTION_TYPE node itself. */ 482818334Speter 482918334Speter { 483090075Sobrien tree link; 483118334Speter 483250397Sobrien for (link = last_function_parm_tags; 483318334Speter link; 483418334Speter link = TREE_CHAIN (link)) 483518334Speter TYPE_CONTEXT (TREE_VALUE (link)) = type; 483618334Speter } 483718334Speter } 483818334Speter else if (TREE_CODE (declarator) == INDIRECT_REF) 483918334Speter { 484018334Speter /* Merge any constancy or volatility into the target type 484118334Speter for the pointer. */ 484218334Speter 484318334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 484452284Sobrien && type_quals) 484590075Sobrien pedwarn ("ISO C forbids qualified function types"); 484652284Sobrien if (type_quals) 484752284Sobrien type = c_build_qualified_type (type, type_quals); 484852284Sobrien type_quals = TYPE_UNQUALIFIED; 484918334Speter size_varies = 0; 485018334Speter 485118334Speter type = build_pointer_type (type); 485218334Speter 485318334Speter /* Process a list of type modifier keywords 485418334Speter (such as const or volatile) that were given inside the `*'. */ 485518334Speter 485618334Speter if (TREE_TYPE (declarator)) 485718334Speter { 485890075Sobrien tree typemodlist; 485918334Speter int erred = 0; 486052284Sobrien 486152284Sobrien constp = 0; 486252284Sobrien volatilep = 0; 486352284Sobrien restrictp = 0; 486418334Speter for (typemodlist = TREE_TYPE (declarator); typemodlist; 486518334Speter typemodlist = TREE_CHAIN (typemodlist)) 486618334Speter { 486752284Sobrien tree qualifier = TREE_VALUE (typemodlist); 486852284Sobrien 486990075Sobrien if (C_IS_RESERVED_WORD (qualifier)) 487018334Speter { 487190075Sobrien if (C_RID_CODE (qualifier) == RID_CONST) 487290075Sobrien constp++; 487390075Sobrien else if (C_RID_CODE (qualifier) == RID_VOLATILE) 487490075Sobrien volatilep++; 487590075Sobrien else if (C_RID_CODE (qualifier) == RID_RESTRICT) 487690075Sobrien restrictp++; 487790075Sobrien else 487890075Sobrien erred++; 487918334Speter } 488090075Sobrien else 488190075Sobrien erred++; 488218334Speter } 488390075Sobrien 488490075Sobrien if (erred) 488590075Sobrien error ("invalid type modifier within pointer declarator"); 488690075Sobrien if (constp > 1 && ! flag_isoc99) 488718334Speter pedwarn ("duplicate `const'"); 488890075Sobrien if (volatilep > 1 && ! flag_isoc99) 488918334Speter pedwarn ("duplicate `volatile'"); 489090075Sobrien if (restrictp > 1 && ! flag_isoc99) 489152284Sobrien pedwarn ("duplicate `restrict'"); 489252284Sobrien 489352284Sobrien type_quals = ((constp ? TYPE_QUAL_CONST : 0) 489452284Sobrien | (restrictp ? TYPE_QUAL_RESTRICT : 0) 489552284Sobrien | (volatilep ? TYPE_QUAL_VOLATILE : 0)); 489618334Speter } 489718334Speter 489818334Speter declarator = TREE_OPERAND (declarator, 0); 489918334Speter } 490018334Speter else 490118334Speter abort (); 490218334Speter 490318334Speter } 490418334Speter 490518334Speter /* Now TYPE has the actual type. */ 490618334Speter 490750397Sobrien /* Did array size calculations overflow? */ 490850397Sobrien 490950397Sobrien if (TREE_CODE (type) == ARRAY_TYPE 491090075Sobrien && COMPLETE_TYPE_P (type) 491150397Sobrien && TREE_OVERFLOW (TYPE_SIZE (type))) 491290075Sobrien { 491390075Sobrien error ("size of array `%s' is too large", name); 491490075Sobrien /* If we proceed with the array type as it is, we'll eventually 491590075Sobrien crash in tree_low_cst(). */ 491690075Sobrien type = error_mark_node; 491790075Sobrien } 491850397Sobrien 491918334Speter /* If this is declaring a typedef name, return a TYPE_DECL. */ 492018334Speter 492118334Speter if (specbits & (1 << (int) RID_TYPEDEF)) 492218334Speter { 492318334Speter tree decl; 492418334Speter /* Note that the grammar rejects storage classes 492518334Speter in typenames, fields or parameters */ 492618334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 492752284Sobrien && type_quals) 492890075Sobrien pedwarn ("ISO C forbids qualified function types"); 492952284Sobrien if (type_quals) 493052284Sobrien type = c_build_qualified_type (type, type_quals); 493118334Speter decl = build_decl (TYPE_DECL, declarator, type); 493218334Speter if ((specbits & (1 << (int) RID_SIGNED)) 493318334Speter || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) 493418334Speter C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1; 493590075Sobrien decl_attributes (&decl, returned_attrs, 0); 493618334Speter return decl; 493718334Speter } 493818334Speter 493918334Speter /* Detect the case of an array type of unspecified size 494018334Speter which came, as such, direct from a typedef name. 494118334Speter We must copy the type, so that each identifier gets 494218334Speter a distinct type, so that each identifier's size can be 494318334Speter controlled separately by its own initializer. */ 494418334Speter 494518334Speter if (type != 0 && typedef_type != 0 494690075Sobrien && TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0 494790075Sobrien && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type)) 494818334Speter { 494918334Speter type = build_array_type (TREE_TYPE (type), 0); 495018334Speter if (size_varies) 495118334Speter C_TYPE_VARIABLE_SIZE (type) = 1; 495218334Speter } 495318334Speter 495418334Speter /* If this is a type name (such as, in a cast or sizeof), 495518334Speter compute the type and return it now. */ 495618334Speter 495718334Speter if (decl_context == TYPENAME) 495818334Speter { 495918334Speter /* Note that the grammar rejects storage classes 496018334Speter in typenames, fields or parameters */ 496118334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 496252284Sobrien && type_quals) 496390075Sobrien pedwarn ("ISO C forbids const or volatile function types"); 496452284Sobrien if (type_quals) 496552284Sobrien type = c_build_qualified_type (type, type_quals); 496690075Sobrien decl_attributes (&type, returned_attrs, 0); 496718334Speter return type; 496818334Speter } 496918334Speter 497018334Speter /* Aside from typedefs and type names (handle above), 497118334Speter `void' at top level (not within pointer) 497218334Speter is allowed only in public variables. 497318334Speter We don't complain about parms either, but that is because 497418334Speter a better error message can be made later. */ 497518334Speter 497690075Sobrien if (VOID_TYPE_P (type) && decl_context != PARM 497718334Speter && ! ((decl_context != FIELD && TREE_CODE (type) != FUNCTION_TYPE) 497818334Speter && ((specbits & (1 << (int) RID_EXTERN)) 497918334Speter || (current_binding_level == global_binding_level 498018334Speter && !(specbits 498118334Speter & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER))))))) 498218334Speter { 498318334Speter error ("variable or field `%s' declared void", name); 498418334Speter type = integer_type_node; 498518334Speter } 498618334Speter 498718334Speter /* Now create the decl, which may be a VAR_DECL, a PARM_DECL 498818334Speter or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ 498918334Speter 499018334Speter { 499190075Sobrien tree decl; 499218334Speter 499318334Speter if (decl_context == PARM) 499418334Speter { 499590075Sobrien tree type_as_written; 499690075Sobrien tree promoted_type; 499718334Speter 499818334Speter /* A parameter declared as an array of T is really a pointer to T. 499918334Speter One declared as a function is really a pointer to a function. */ 500018334Speter 500118334Speter if (TREE_CODE (type) == ARRAY_TYPE) 500218334Speter { 500318334Speter /* Transfer const-ness of array into that of type pointed to. */ 500418334Speter type = TREE_TYPE (type); 500552284Sobrien if (type_quals) 500652284Sobrien type = c_build_qualified_type (type, type_quals); 500718334Speter type = build_pointer_type (type); 500852284Sobrien type_quals = TYPE_UNQUALIFIED; 500990075Sobrien if (array_ptr_quals) 501090075Sobrien { 501190075Sobrien tree new_ptr_quals, new_ptr_attrs; 501290075Sobrien int erred = 0; 501390075Sobrien split_specs_attrs (array_ptr_quals, &new_ptr_quals, &new_ptr_attrs); 501490075Sobrien /* We don't yet implement attributes in this context. */ 501590075Sobrien if (new_ptr_attrs != NULL_TREE) 501690075Sobrien warning ("attributes in parameter array declarator ignored"); 501790075Sobrien 501890075Sobrien constp = 0; 501990075Sobrien volatilep = 0; 502090075Sobrien restrictp = 0; 502190075Sobrien for (; new_ptr_quals; new_ptr_quals = TREE_CHAIN (new_ptr_quals)) 502290075Sobrien { 502390075Sobrien tree qualifier = TREE_VALUE (new_ptr_quals); 502490075Sobrien 502590075Sobrien if (C_IS_RESERVED_WORD (qualifier)) 502690075Sobrien { 502790075Sobrien if (C_RID_CODE (qualifier) == RID_CONST) 502890075Sobrien constp++; 502990075Sobrien else if (C_RID_CODE (qualifier) == RID_VOLATILE) 503090075Sobrien volatilep++; 503190075Sobrien else if (C_RID_CODE (qualifier) == RID_RESTRICT) 503290075Sobrien restrictp++; 503390075Sobrien else 503490075Sobrien erred++; 503590075Sobrien } 503690075Sobrien else 503790075Sobrien erred++; 503890075Sobrien } 503990075Sobrien 504090075Sobrien if (erred) 504190075Sobrien error ("invalid type modifier within array declarator"); 504290075Sobrien 504390075Sobrien type_quals = ((constp ? TYPE_QUAL_CONST : 0) 504490075Sobrien | (restrictp ? TYPE_QUAL_RESTRICT : 0) 504590075Sobrien | (volatilep ? TYPE_QUAL_VOLATILE : 0)); 504690075Sobrien } 504718334Speter size_varies = 0; 504818334Speter } 504918334Speter else if (TREE_CODE (type) == FUNCTION_TYPE) 505018334Speter { 505152284Sobrien if (pedantic && type_quals) 505290075Sobrien pedwarn ("ISO C forbids qualified function types"); 505352284Sobrien if (type_quals) 505452284Sobrien type = c_build_qualified_type (type, type_quals); 505518334Speter type = build_pointer_type (type); 505652284Sobrien type_quals = TYPE_UNQUALIFIED; 505718334Speter } 505890075Sobrien else if (type_quals) 505990075Sobrien type = c_build_qualified_type (type, type_quals); 506090075Sobrien 506190075Sobrien type_as_written = type; 506218334Speter 506318334Speter decl = build_decl (PARM_DECL, declarator, type); 506418334Speter if (size_varies) 506518334Speter C_DECL_VARIABLE_SIZE (decl) = 1; 506618334Speter 506718334Speter /* Compute the type actually passed in the parmlist, 506818334Speter for the case where there is no prototype. 506918334Speter (For example, shorts and chars are passed as ints.) 507018334Speter When there is a prototype, this is overridden later. */ 507118334Speter 507290075Sobrien if (type == error_mark_node) 507390075Sobrien promoted_type = type; 507490075Sobrien else 507518334Speter { 507690075Sobrien promoted_type = simple_type_promotes_to (type); 507790075Sobrien if (! promoted_type) 507890075Sobrien promoted_type = type; 507918334Speter } 508018334Speter 508190075Sobrien DECL_ARG_TYPE (decl) = promoted_type; 508218334Speter DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written; 508318334Speter } 508418334Speter else if (decl_context == FIELD) 508518334Speter { 508618334Speter /* Structure field. It may not be a function. */ 508796263Sobrien 508818334Speter if (TREE_CODE (type) == FUNCTION_TYPE) 508918334Speter { 509018334Speter error ("field `%s' declared as a function", name); 509118334Speter type = build_pointer_type (type); 509218334Speter } 509390075Sobrien else if (TREE_CODE (type) != ERROR_MARK 509490075Sobrien && !COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (type)) 509518334Speter { 509618334Speter error ("field `%s' has incomplete type", name); 509718334Speter type = error_mark_node; 509818334Speter } 509918334Speter /* Move type qualifiers down to element of an array. */ 510052284Sobrien if (TREE_CODE (type) == ARRAY_TYPE && type_quals) 510118334Speter { 510252284Sobrien type = build_array_type (c_build_qualified_type (TREE_TYPE (type), 510352284Sobrien type_quals), 510418334Speter TYPE_DOMAIN (type)); 510590075Sobrien#if 0 510690075Sobrien /* Leave the field const or volatile as well. */ 510752284Sobrien type_quals = TYPE_UNQUALIFIED; 510818334Speter#endif 510918334Speter } 511018334Speter decl = build_decl (FIELD_DECL, declarator, type); 511190075Sobrien DECL_NONADDRESSABLE_P (decl) = bitfield; 511290075Sobrien 511318334Speter if (size_varies) 511418334Speter C_DECL_VARIABLE_SIZE (decl) = 1; 511518334Speter } 511618334Speter else if (TREE_CODE (type) == FUNCTION_TYPE) 511718334Speter { 511818334Speter /* Every function declaration is "external" 511918334Speter except for those which are inside a function body 512018334Speter in which `auto' is used. 512118334Speter That is a case not specified by ANSI C, 512218334Speter and we use it for forward declarations for nested functions. */ 512318334Speter int extern_ref = (!(specbits & (1 << (int) RID_AUTO)) 512418334Speter || current_binding_level == global_binding_level); 512518334Speter 512618334Speter if (specbits & (1 << (int) RID_AUTO) 512718334Speter && (pedantic || current_binding_level == global_binding_level)) 512818334Speter pedwarn ("invalid storage class for function `%s'", name); 512918334Speter if (specbits & (1 << (int) RID_REGISTER)) 513018334Speter error ("invalid storage class for function `%s'", name); 513118334Speter /* Function declaration not at top level. 513218334Speter Storage classes other than `extern' are not allowed 513318334Speter and `extern' makes no difference. */ 513418334Speter if (current_binding_level != global_binding_level 513518334Speter && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE))) 513618334Speter && pedantic) 513718334Speter pedwarn ("invalid storage class for function `%s'", name); 513818334Speter 513918334Speter decl = build_decl (FUNCTION_DECL, declarator, type); 514090075Sobrien decl = build_decl_attribute_variant (decl, decl_attr); 514118334Speter 514290075Sobrien DECL_LANG_SPECIFIC (decl) = (struct lang_decl *) 514390075Sobrien ggc_alloc_cleared (sizeof (struct lang_decl)); 514490075Sobrien 514552284Sobrien if (pedantic && type_quals && ! DECL_IN_SYSTEM_HEADER (decl)) 514690075Sobrien pedwarn ("ISO C forbids qualified function types"); 514718334Speter 514852284Sobrien /* GNU C interprets a `volatile void' return type to indicate 514952284Sobrien that the function does not return. */ 515052284Sobrien if ((type_quals & TYPE_QUAL_VOLATILE) 515190075Sobrien && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) 515218334Speter warning ("`noreturn' function returns non-void value"); 515318334Speter 515418334Speter if (extern_ref) 515518334Speter DECL_EXTERNAL (decl) = 1; 515618334Speter /* Record absence of global scope for `static' or `auto'. */ 515718334Speter TREE_PUBLIC (decl) 515818334Speter = !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO))); 515918334Speter 516096263Sobrien if (defaulted_int) 516196263Sobrien C_FUNCTION_IMPLICIT_INT (decl) = 1; 516296263Sobrien 516318334Speter /* Record presence of `inline', if it is reasonable. */ 516490075Sobrien if (MAIN_NAME_P (declarator)) 516518334Speter { 516690075Sobrien if (inlinep) 516718334Speter warning ("cannot inline function `main'"); 516890075Sobrien } 516990075Sobrien else if (inlinep) 517090075Sobrien { 517190075Sobrien /* Assume that otherwise the function can be inlined. */ 517290075Sobrien DECL_DECLARED_INLINE_P (decl) = 1; 517318334Speter 517490075Sobrien /* Do not mark bare declarations as DECL_INLINE. Doing so 517590075Sobrien in the presence of multiple declarations can result in 517690075Sobrien the abstract origin pointing between the declarations, 517790075Sobrien which will confuse dwarf2out. */ 517890075Sobrien if (initialized) 517990075Sobrien { 518090075Sobrien DECL_INLINE (decl) = 1; 518190075Sobrien if (specbits & (1 << (int) RID_EXTERN)) 518290075Sobrien current_extern_inline = 1; 518390075Sobrien } 518418334Speter } 518590075Sobrien /* If -finline-functions, assume it can be inlined. This does 518690075Sobrien two things: let the function be deferred until it is actually 518790075Sobrien needed, and let dwarf2 know that the function is inlinable. */ 518890075Sobrien else if (flag_inline_trees == 2 && initialized) 518990075Sobrien { 519090075Sobrien DECL_INLINE (decl) = 1; 519190075Sobrien DECL_DECLARED_INLINE_P (decl) = 0; 519290075Sobrien } 519318334Speter } 519418334Speter else 519518334Speter { 519618334Speter /* It's a variable. */ 519718334Speter /* An uninitialized decl with `extern' is a reference. */ 519818334Speter int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN)); 519918334Speter 520018334Speter /* Move type qualifiers down to element of an array. */ 520152284Sobrien if (TREE_CODE (type) == ARRAY_TYPE && type_quals) 520218334Speter { 520390075Sobrien int saved_align = TYPE_ALIGN(type); 520452284Sobrien type = build_array_type (c_build_qualified_type (TREE_TYPE (type), 520552284Sobrien type_quals), 520618334Speter TYPE_DOMAIN (type)); 520790075Sobrien TYPE_ALIGN (type) = saved_align; 520818334Speter#if 0 /* Leave the variable const or volatile as well. */ 520952284Sobrien type_quals = TYPE_UNQUALIFIED; 521018334Speter#endif 521118334Speter } 521290075Sobrien else if (type_quals) 521390075Sobrien type = c_build_qualified_type (type, type_quals); 521490075Sobrien 521518334Speter decl = build_decl (VAR_DECL, declarator, type); 521618334Speter if (size_varies) 521718334Speter C_DECL_VARIABLE_SIZE (decl) = 1; 521818334Speter 521918334Speter if (inlinep) 522018334Speter pedwarn_with_decl (decl, "variable `%s' declared `inline'"); 522118334Speter 522218334Speter DECL_EXTERNAL (decl) = extern_ref; 522318334Speter /* At top level, the presence of a `static' or `register' storage 522418334Speter class specifier, or the absence of all storage class specifiers 522518334Speter makes this declaration a definition (perhaps tentative). Also, 522618334Speter the absence of both `static' and `register' makes it public. */ 522718334Speter if (current_binding_level == global_binding_level) 522818334Speter { 522918334Speter TREE_PUBLIC (decl) 523018334Speter = !(specbits 523118334Speter & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER))); 523218334Speter TREE_STATIC (decl) = ! DECL_EXTERNAL (decl); 523318334Speter } 523418334Speter /* Not at top level, only `static' makes a static definition. */ 523518334Speter else 523618334Speter { 523718334Speter TREE_STATIC (decl) = (specbits & (1 << (int) RID_STATIC)) != 0; 523818334Speter TREE_PUBLIC (decl) = DECL_EXTERNAL (decl); 523918334Speter } 524018334Speter } 524118334Speter 524218334Speter /* Record `register' declaration for warnings on & 524318334Speter and in case doing stupid register allocation. */ 524418334Speter 524518334Speter if (specbits & (1 << (int) RID_REGISTER)) 524618334Speter DECL_REGISTER (decl) = 1; 524718334Speter 524818334Speter /* Record constancy and volatility. */ 524952284Sobrien c_apply_type_quals_to_decl (type_quals, decl); 525018334Speter 525118334Speter /* If a type has volatile components, it should be stored in memory. 525218334Speter Otherwise, the fact that those components are volatile 525318334Speter will be ignored, and would even crash the compiler. */ 525418334Speter if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl))) 525518334Speter mark_addressable (decl); 525618334Speter 525790075Sobrien decl_attributes (&decl, returned_attrs, 0); 525818334Speter 525918334Speter return decl; 526018334Speter } 526118334Speter} 526218334Speter 526318334Speter/* Decode the parameter-list info for a function type or function definition. 526418334Speter The argument is the value returned by `get_parm_info' (or made in parse.y 526518334Speter if there is an identifier list instead of a parameter decl list). 526618334Speter These two functions are separate because when a function returns 526718334Speter or receives functions then each is called multiple times but the order 526818334Speter of calls is different. The last call to `grokparms' is always the one 526918334Speter that contains the formal parameter names of a function definition. 527018334Speter 527118334Speter Store in `last_function_parms' a chain of the decls of parms. 527218334Speter Also store in `last_function_parm_tags' a chain of the struct, union, 527318334Speter and enum tags declared among the parms. 527418334Speter 527518334Speter Return a list of arg types to use in the FUNCTION_TYPE for this function. 527618334Speter 527718334Speter FUNCDEF_FLAG is nonzero for a function definition, 0 for 527818334Speter a mere declaration. A nonempty identifier-list gets an error message 527918334Speter when FUNCDEF_FLAG is zero. */ 528018334Speter 528118334Speterstatic tree 528218334Spetergrokparms (parms_info, funcdef_flag) 528318334Speter tree parms_info; 528418334Speter int funcdef_flag; 528518334Speter{ 528618334Speter tree first_parm = TREE_CHAIN (parms_info); 528718334Speter 528818334Speter last_function_parms = TREE_PURPOSE (parms_info); 528918334Speter last_function_parm_tags = TREE_VALUE (parms_info); 529018334Speter 529118334Speter if (warn_strict_prototypes && first_parm == 0 && !funcdef_flag 529218334Speter && !in_system_header) 529318334Speter warning ("function declaration isn't a prototype"); 529418334Speter 529518334Speter if (first_parm != 0 529618334Speter && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE) 529718334Speter { 529818334Speter if (! funcdef_flag) 529918334Speter pedwarn ("parameter names (without types) in function declaration"); 530018334Speter 530118334Speter last_function_parms = first_parm; 530218334Speter return 0; 530318334Speter } 530418334Speter else 530518334Speter { 530618334Speter tree parm; 530718334Speter tree typelt; 530818334Speter /* We no longer test FUNCDEF_FLAG. 530918334Speter If the arg types are incomplete in a declaration, 531018334Speter they must include undefined tags. 531118334Speter These tags can never be defined in the scope of the declaration, 531218334Speter so the types can never be completed, 531318334Speter and no call can be compiled successfully. */ 531418334Speter#if 0 531518334Speter /* In a fcn definition, arg types must be complete. */ 531618334Speter if (funcdef_flag) 531718334Speter#endif 531818334Speter for (parm = last_function_parms, typelt = first_parm; 531918334Speter parm; 532018334Speter parm = TREE_CHAIN (parm)) 532118334Speter /* Skip over any enumeration constants declared here. */ 532218334Speter if (TREE_CODE (parm) == PARM_DECL) 532318334Speter { 532418334Speter /* Barf if the parameter itself has an incomplete type. */ 532518334Speter tree type = TREE_VALUE (typelt); 532690075Sobrien if (type == error_mark_node) 532790075Sobrien continue; 532890075Sobrien if (!COMPLETE_TYPE_P (type)) 532918334Speter { 533018334Speter if (funcdef_flag && DECL_NAME (parm) != 0) 533118334Speter error ("parameter `%s' has incomplete type", 533218334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 533318334Speter else 533418334Speter warning ("parameter has incomplete type"); 533518334Speter if (funcdef_flag) 533618334Speter { 533718334Speter TREE_VALUE (typelt) = error_mark_node; 533818334Speter TREE_TYPE (parm) = error_mark_node; 533918334Speter } 534018334Speter } 534190075Sobrien#if 0 534290075Sobrien /* This has been replaced by parm_tags_warning, which 534390075Sobrien uses a more accurate criterion for what to warn 534490075Sobrien about. */ 534518334Speter else 534618334Speter { 534718334Speter /* Now warn if is a pointer to an incomplete type. */ 534818334Speter while (TREE_CODE (type) == POINTER_TYPE 534918334Speter || TREE_CODE (type) == REFERENCE_TYPE) 535018334Speter type = TREE_TYPE (type); 535118334Speter type = TYPE_MAIN_VARIANT (type); 535290075Sobrien if (!COMPLETE_TYPE_P (type)) 535318334Speter { 535418334Speter if (DECL_NAME (parm) != 0) 535518334Speter warning ("parameter `%s' points to incomplete type", 535618334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 535718334Speter else 535818334Speter warning ("parameter points to incomplete type"); 535918334Speter } 536018334Speter } 536118334Speter#endif 536218334Speter typelt = TREE_CHAIN (typelt); 536318334Speter } 536418334Speter 536590075Sobrien return first_parm; 536618334Speter } 536718334Speter} 536818334Speter 536918334Speter/* Return a tree_list node with info on a parameter list just parsed. 537018334Speter The TREE_PURPOSE is a chain of decls of those parms. 537118334Speter The TREE_VALUE is a list of structure, union and enum tags defined. 537218334Speter The TREE_CHAIN is a list of argument types to go in the FUNCTION_TYPE. 537318334Speter This tree_list node is later fed to `grokparms'. 537418334Speter 537518334Speter VOID_AT_END nonzero means append `void' to the end of the type-list. 537618334Speter Zero means the parmlist ended with an ellipsis so don't append `void'. */ 537718334Speter 537818334Spetertree 537918334Speterget_parm_info (void_at_end) 538018334Speter int void_at_end; 538118334Speter{ 538290075Sobrien tree decl, t; 538390075Sobrien tree types = 0; 538418334Speter int erred = 0; 538518334Speter tree tags = gettags (); 538618334Speter tree parms = getdecls (); 538718334Speter tree new_parms = 0; 538818334Speter tree order = current_binding_level->parm_order; 538918334Speter 539090075Sobrien /* Just `void' (and no ellipsis) is special. There are really no parms. 539190075Sobrien But if the `void' is qualified (by `const' or `volatile') or has a 539290075Sobrien storage class specifier (`register'), then the behavior is undefined; 539390075Sobrien by not counting it as the special case of `void' we will cause an 539490075Sobrien error later. Typedefs for `void' are OK (see DR#157). */ 539518334Speter if (void_at_end && parms != 0 539618334Speter && TREE_CHAIN (parms) == 0 539790075Sobrien && VOID_TYPE_P (TREE_TYPE (parms)) 539890075Sobrien && ! TREE_THIS_VOLATILE (parms) 539990075Sobrien && ! TREE_READONLY (parms) 540090075Sobrien && ! DECL_REGISTER (parms) 540118334Speter && DECL_NAME (parms) == 0) 540218334Speter { 540318334Speter parms = NULL_TREE; 540418334Speter storedecls (NULL_TREE); 540590075Sobrien return tree_cons (NULL_TREE, NULL_TREE, 540690075Sobrien tree_cons (NULL_TREE, void_type_node, NULL_TREE)); 540718334Speter } 540818334Speter 540918334Speter /* Extract enumerator values and other non-parms declared with the parms. 541018334Speter Likewise any forward parm decls that didn't have real parm decls. */ 541190075Sobrien for (decl = parms; decl;) 541218334Speter { 541318334Speter tree next = TREE_CHAIN (decl); 541418334Speter 541518334Speter if (TREE_CODE (decl) != PARM_DECL) 541618334Speter { 541718334Speter TREE_CHAIN (decl) = new_parms; 541818334Speter new_parms = decl; 541918334Speter } 542018334Speter else if (TREE_ASM_WRITTEN (decl)) 542118334Speter { 542290075Sobrien error_with_decl (decl, 542390075Sobrien "parameter `%s' has just a forward declaration"); 542418334Speter TREE_CHAIN (decl) = new_parms; 542518334Speter new_parms = decl; 542618334Speter } 542718334Speter decl = next; 542818334Speter } 542918334Speter 543018334Speter /* Put the parm decls back in the order they were in in the parm list. */ 543118334Speter for (t = order; t; t = TREE_CHAIN (t)) 543218334Speter { 543318334Speter if (TREE_CHAIN (t)) 543418334Speter TREE_CHAIN (TREE_VALUE (t)) = TREE_VALUE (TREE_CHAIN (t)); 543518334Speter else 543618334Speter TREE_CHAIN (TREE_VALUE (t)) = 0; 543718334Speter } 543818334Speter 543918334Speter new_parms = chainon (order ? nreverse (TREE_VALUE (order)) : 0, 544018334Speter new_parms); 544118334Speter 544218334Speter /* Store the parmlist in the binding level since the old one 544318334Speter is no longer a valid list. (We have changed the chain pointers.) */ 544418334Speter storedecls (new_parms); 544518334Speter 544618334Speter for (decl = new_parms; decl; decl = TREE_CHAIN (decl)) 544718334Speter /* There may also be declarations for enumerators if an enumeration 544818334Speter type is declared among the parms. Ignore them here. */ 544918334Speter if (TREE_CODE (decl) == PARM_DECL) 545018334Speter { 545118334Speter /* Since there is a prototype, 545218334Speter args are passed in their declared types. */ 545318334Speter tree type = TREE_TYPE (decl); 545418334Speter DECL_ARG_TYPE (decl) = type; 545590075Sobrien if (PROMOTE_PROTOTYPES 545690075Sobrien && INTEGRAL_TYPE_P (type) 545718334Speter && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) 545818334Speter DECL_ARG_TYPE (decl) = integer_type_node; 545918334Speter 546090075Sobrien types = tree_cons (NULL_TREE, TREE_TYPE (decl), types); 546190075Sobrien if (VOID_TYPE_P (TREE_VALUE (types)) && ! erred 546218334Speter && DECL_NAME (decl) == 0) 546318334Speter { 546418334Speter error ("`void' in parameter list must be the entire list"); 546518334Speter erred = 1; 546618334Speter } 546718334Speter } 546818334Speter 546918334Speter if (void_at_end) 547090075Sobrien return tree_cons (new_parms, tags, 547190075Sobrien nreverse (tree_cons (NULL_TREE, void_type_node, types))); 547218334Speter 547390075Sobrien return tree_cons (new_parms, tags, nreverse (types)); 547418334Speter} 547518334Speter 547618334Speter/* At end of parameter list, warn about any struct, union or enum tags 547718334Speter defined within. Do so because these types cannot ever become complete. */ 547818334Speter 547918334Spetervoid 548018334Speterparmlist_tags_warning () 548118334Speter{ 548218334Speter tree elt; 548318334Speter static int already; 548418334Speter 548518334Speter for (elt = current_binding_level->tags; elt; elt = TREE_CHAIN (elt)) 548618334Speter { 548718334Speter enum tree_code code = TREE_CODE (TREE_VALUE (elt)); 548818334Speter /* An anonymous union parm type is meaningful as a GNU extension. 548918334Speter So don't warn for that. */ 549050397Sobrien if (code == UNION_TYPE && TREE_PURPOSE (elt) == 0 && !pedantic) 549118334Speter continue; 549218334Speter if (TREE_PURPOSE (elt) != 0) 549390075Sobrien { 549490075Sobrien if (code == RECORD_TYPE) 549590075Sobrien warning ("`struct %s' declared inside parameter list", 549690075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (elt))); 549790075Sobrien else if (code == UNION_TYPE) 549890075Sobrien warning ("`union %s' declared inside parameter list", 549990075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (elt))); 550090075Sobrien else 550190075Sobrien warning ("`enum %s' declared inside parameter list", 550290075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (elt))); 550390075Sobrien } 550418334Speter else 550590075Sobrien { 550690075Sobrien /* For translation these need to be separate warnings */ 550790075Sobrien if (code == RECORD_TYPE) 550890075Sobrien warning ("anonymous struct declared inside parameter list"); 550990075Sobrien else if (code == UNION_TYPE) 551090075Sobrien warning ("anonymous union declared inside parameter list"); 551190075Sobrien else 551290075Sobrien warning ("anonymous enum declared inside parameter list"); 551390075Sobrien } 551418334Speter if (! already) 551518334Speter { 551690075Sobrien warning ("its scope is only this definition or declaration, which is probably not what you want"); 551718334Speter already = 1; 551818334Speter } 551918334Speter } 552018334Speter} 552118334Speter 552218334Speter/* Get the struct, enum or union (CODE says which) with tag NAME. 552318334Speter Define the tag as a forward-reference if it is not defined. */ 552418334Speter 552518334Spetertree 552618334Speterxref_tag (code, name) 552718334Speter enum tree_code code; 552818334Speter tree name; 552918334Speter{ 553018334Speter /* If a cross reference is requested, look up the type 553118334Speter already defined for this tag and return it. */ 553218334Speter 553390075Sobrien tree ref = lookup_tag (code, name, current_binding_level, 0); 553490075Sobrien /* If this is the right type of tag, return what we found. 553590075Sobrien (This reference will be shadowed by shadow_tag later if appropriate.) 553690075Sobrien If this is the wrong type of tag, do not return it. If it was the 553790075Sobrien wrong type in the same binding level, we will have had an error 553890075Sobrien message already; if in a different binding level and declaring 553990075Sobrien a name, pending_xref_error will give an error message; but if in a 554090075Sobrien different binding level and not declaring a name, this tag should 554190075Sobrien shadow the previous declaration of a different type of tag, and 554290075Sobrien this would not work properly if we return the reference found. 554390075Sobrien (For example, with "struct foo" in an outer scope, "union foo;" 554490075Sobrien must shadow that tag with a new one of union type.) */ 554590075Sobrien if (ref && TREE_CODE (ref) == code) 554618334Speter return ref; 554718334Speter 554818334Speter /* If no such tag is yet defined, create a forward-reference node 554918334Speter and record it as the "definition". 555018334Speter When a real declaration of this type is found, 555118334Speter the forward-reference will be altered into a real type. */ 555218334Speter 555318334Speter ref = make_node (code); 555418334Speter if (code == ENUMERAL_TYPE) 555518334Speter { 555618334Speter /* Give the type a default layout like unsigned int 555718334Speter to avoid crashing if it does not get defined. */ 555818334Speter TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node); 555918334Speter TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node); 556090075Sobrien TYPE_USER_ALIGN (ref) = 0; 556118334Speter TREE_UNSIGNED (ref) = 1; 556218334Speter TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node); 556318334Speter TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node); 556418334Speter TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node); 556518334Speter } 556618334Speter 556718334Speter pushtag (name, ref); 556818334Speter 556918334Speter return ref; 557018334Speter} 557118334Speter 557218334Speter/* Make sure that the tag NAME is defined *in the current binding level* 557318334Speter at least as a forward reference. 557490075Sobrien CODE says which kind of tag NAME ought to be. */ 557518334Speter 557618334Spetertree 557718334Speterstart_struct (code, name) 557818334Speter enum tree_code code; 557918334Speter tree name; 558018334Speter{ 558118334Speter /* If there is already a tag defined at this binding level 558218334Speter (as a forward reference), just return it. */ 558318334Speter 558490075Sobrien tree ref = 0; 558518334Speter 558618334Speter if (name != 0) 558718334Speter ref = lookup_tag (code, name, current_binding_level, 1); 558818334Speter if (ref && TREE_CODE (ref) == code) 558918334Speter { 559018334Speter C_TYPE_BEING_DEFINED (ref) = 1; 559150397Sobrien TYPE_PACKED (ref) = flag_pack_struct; 559218334Speter if (TYPE_FIELDS (ref)) 559390075Sobrien { 559490075Sobrien if (code == UNION_TYPE) 559590075Sobrien error ("redefinition of `union %s'", 559690075Sobrien IDENTIFIER_POINTER (name)); 559790075Sobrien else 559890075Sobrien error ("redefinition of `struct %s'", 559990075Sobrien IDENTIFIER_POINTER (name)); 560090075Sobrien } 560118334Speter 560218334Speter return ref; 560318334Speter } 560418334Speter 560518334Speter /* Otherwise create a forward-reference just so the tag is in scope. */ 560618334Speter 560718334Speter ref = make_node (code); 560818334Speter pushtag (name, ref); 560918334Speter C_TYPE_BEING_DEFINED (ref) = 1; 561050397Sobrien TYPE_PACKED (ref) = flag_pack_struct; 561118334Speter return ref; 561218334Speter} 561318334Speter 561418334Speter/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted) 561518334Speter of a structure component, returning a FIELD_DECL node. 561696263Sobrien WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. 561718334Speter 561818334Speter This is done during the parsing of the struct declaration. 561918334Speter The FIELD_DECL nodes are chained together and the lot of them 562018334Speter are ultimately passed to `build_struct' to make the RECORD_TYPE node. */ 562118334Speter 562218334Spetertree 562318334Spetergrokfield (filename, line, declarator, declspecs, width) 562452284Sobrien const char *filename ATTRIBUTE_UNUSED; 562552284Sobrien int line ATTRIBUTE_UNUSED; 562618334Speter tree declarator, declspecs, width; 562718334Speter{ 562818334Speter tree value; 562918334Speter 563090075Sobrien if (declarator == NULL_TREE && width == NULL_TREE) 563190075Sobrien { 563290075Sobrien /* This is an unnamed decl. We only support unnamed 563390075Sobrien structs/unions, so check for other things and refuse them. */ 5634102790Skan tree type = TREE_VALUE (declspecs); 5635102790Skan 5636102790Skan if (TREE_CODE (type) == TYPE_DECL) 5637102790Skan type = TREE_TYPE (type); 5638102790Skan if (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE) 563990075Sobrien { 564090075Sobrien error ("unnamed fields of type other than struct or union are not allowed"); 564190075Sobrien return NULL_TREE; 564290075Sobrien } 564390075Sobrien } 564418334Speter 564596263Sobrien value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0); 564618334Speter 564718334Speter finish_decl (value, NULL_TREE, NULL_TREE); 564896263Sobrien DECL_INITIAL (value) = width; 564918334Speter 565018334Speter maybe_objc_check_decl (value); 565118334Speter return value; 565218334Speter} 565318334Speter 565418334Speter/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T. 565518334Speter FIELDLIST is a chain of FIELD_DECL nodes for the fields. 565690075Sobrien ATTRIBUTES are attributes to be applied to the structure. */ 565718334Speter 565818334Spetertree 565918334Speterfinish_struct (t, fieldlist, attributes) 566018334Speter tree t; 566118334Speter tree fieldlist; 566218334Speter tree attributes; 566318334Speter{ 566490075Sobrien tree x; 566518334Speter int toplevel = global_binding_level == current_binding_level; 566690075Sobrien int saw_named_field; 566718334Speter 566818334Speter /* If this type was previously laid out as a forward reference, 566918334Speter make sure we lay it out again. */ 567018334Speter 567118334Speter TYPE_SIZE (t) = 0; 567218334Speter 567390075Sobrien decl_attributes (&t, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE); 567418334Speter 567518334Speter /* Nameless union parm types are useful as GCC extension. */ 567618334Speter if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic) 567718334Speter /* Otherwise, warn about any struct or union def. in parmlist. */ 567818334Speter if (in_parm_level_p ()) 567918334Speter { 568018334Speter if (pedantic) 568190075Sobrien pedwarn ("%s defined inside parms", 568290075Sobrien TREE_CODE (t) == UNION_TYPE ? _("union") : _("structure")); 568318334Speter else if (! flag_traditional) 568490075Sobrien warning ("%s defined inside parms", 568590075Sobrien TREE_CODE (t) == UNION_TYPE ? _("union") : _("structure")); 568618334Speter } 568718334Speter 568850397Sobrien if (pedantic) 568950397Sobrien { 569050397Sobrien for (x = fieldlist; x; x = TREE_CHAIN (x)) 569150397Sobrien if (DECL_NAME (x) != 0) 569250397Sobrien break; 569318334Speter 569450397Sobrien if (x == 0) 569590075Sobrien pedwarn ("%s has no %s", 569690075Sobrien TREE_CODE (t) == UNION_TYPE ? _("union") : _("struct"), 569790075Sobrien fieldlist ? _("named members") : _("members")); 569850397Sobrien } 569950397Sobrien 570096263Sobrien /* Install struct as DECL_CONTEXT of each field decl. 570196263Sobrien Also process specified field sizes,m which is found in the DECL_INITIAL. 570296263Sobrien Store 0 there, except for ": 0" fields (so we can find them 570396263Sobrien and delete them, below). */ 570418334Speter 570590075Sobrien saw_named_field = 0; 570618334Speter for (x = fieldlist; x; x = TREE_CHAIN (x)) 570718334Speter { 570818334Speter DECL_CONTEXT (x) = t; 570918334Speter DECL_PACKED (x) |= TYPE_PACKED (t); 571018334Speter 571118334Speter /* If any field is const, the structure type is pseudo-const. */ 571218334Speter if (TREE_READONLY (x)) 571318334Speter C_TYPE_FIELDS_READONLY (t) = 1; 571418334Speter else 571518334Speter { 571618334Speter /* A field that is pseudo-const makes the structure likewise. */ 571718334Speter tree t1 = TREE_TYPE (x); 571818334Speter while (TREE_CODE (t1) == ARRAY_TYPE) 571918334Speter t1 = TREE_TYPE (t1); 572018334Speter if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE) 572118334Speter && C_TYPE_FIELDS_READONLY (t1)) 572218334Speter C_TYPE_FIELDS_READONLY (t) = 1; 572318334Speter } 572418334Speter 572518334Speter /* Any field that is volatile means variables of this type must be 572618334Speter treated in some ways as volatile. */ 572718334Speter if (TREE_THIS_VOLATILE (x)) 572818334Speter C_TYPE_FIELDS_VOLATILE (t) = 1; 572918334Speter 573018334Speter /* Any field of nominal variable size implies structure is too. */ 573118334Speter if (C_DECL_VARIABLE_SIZE (x)) 573218334Speter C_TYPE_VARIABLE_SIZE (t) = 1; 573318334Speter 573418334Speter /* Detect invalid nested redefinition. */ 573518334Speter if (TREE_TYPE (x) == t) 573618334Speter error ("nested redefinition of `%s'", 573718334Speter IDENTIFIER_POINTER (TYPE_NAME (t))); 573818334Speter 573996263Sobrien /* Detect invalid bit-field size. */ 574096263Sobrien if (DECL_INITIAL (x)) 574196263Sobrien STRIP_NOPS (DECL_INITIAL (x)); 574296263Sobrien if (DECL_INITIAL (x)) 574318334Speter { 574496263Sobrien if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST) 574596263Sobrien constant_expression_warning (DECL_INITIAL (x)); 574696263Sobrien else 574796263Sobrien { 574896263Sobrien error_with_decl (x, 574996263Sobrien "bit-field `%s' width not an integer constant"); 575096263Sobrien DECL_INITIAL (x) = NULL; 575196263Sobrien } 575296263Sobrien } 575396263Sobrien 575496263Sobrien /* Detect invalid bit-field type. */ 575596263Sobrien if (DECL_INITIAL (x) 575696263Sobrien && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE 575796263Sobrien && TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE 575896263Sobrien && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE) 575996263Sobrien { 576096263Sobrien error_with_decl (x, "bit-field `%s' has invalid type"); 576196263Sobrien DECL_INITIAL (x) = NULL; 576296263Sobrien } 576396263Sobrien 576496263Sobrien if (DECL_INITIAL (x) && pedantic 576596263Sobrien && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node 576696263Sobrien && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node 576796263Sobrien && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != c_bool_type_node 576896263Sobrien /* Accept an enum that's equivalent to int or unsigned int. */ 576996263Sobrien && !(TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE 577096263Sobrien && (TYPE_PRECISION (TREE_TYPE (x)) 577196263Sobrien == TYPE_PRECISION (integer_type_node)))) 577296263Sobrien pedwarn_with_decl (x, "bit-field `%s' type invalid in ISO C"); 577396263Sobrien 577496263Sobrien /* Detect and ignore out of range field width and process valid 577596263Sobrien field widths. */ 577696263Sobrien if (DECL_INITIAL (x)) 577796263Sobrien { 577896263Sobrien int max_width 577996263Sobrien = (TYPE_MAIN_VARIANT (TREE_TYPE (x)) == c_bool_type_node 578096263Sobrien ? CHAR_TYPE_SIZE : TYPE_PRECISION (TREE_TYPE (x))); 578196263Sobrien 578296263Sobrien if (tree_int_cst_sgn (DECL_INITIAL (x)) < 0) 578396263Sobrien error_with_decl (x, "negative width in bit-field `%s'"); 578496263Sobrien else if (0 < compare_tree_int (DECL_INITIAL (x), max_width)) 578596263Sobrien pedwarn_with_decl (x, "width of `%s' exceeds its type"); 578696263Sobrien else if (integer_zerop (DECL_INITIAL (x)) && DECL_NAME (x) != 0) 578796263Sobrien error_with_decl (x, "zero width for bit-field `%s'"); 578896263Sobrien else 578996263Sobrien { 579096263Sobrien /* The test above has assured us that TREE_INT_CST_HIGH is 0. */ 579196263Sobrien unsigned HOST_WIDE_INT width 579296263Sobrien = tree_low_cst (DECL_INITIAL (x), 1); 579396263Sobrien 579496263Sobrien if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE 579596263Sobrien && (width < min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)), 579696263Sobrien TREE_UNSIGNED (TREE_TYPE (x))) 579796263Sobrien || (width 579896263Sobrien < min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)), 579996263Sobrien TREE_UNSIGNED (TREE_TYPE (x)))))) 580096263Sobrien warning_with_decl (x, 580196263Sobrien "`%s' is narrower than values of its type"); 580296263Sobrien 580396263Sobrien DECL_SIZE (x) = bitsize_int (width); 580496263Sobrien DECL_BIT_FIELD (x) = 1; 580596263Sobrien SET_DECL_C_BIT_FIELD (x); 580696263Sobrien 580796263Sobrien if (width == 0 580896263Sobrien && ! (* targetm.ms_bitfield_layout_p) (t)) 580996263Sobrien { 581096263Sobrien /* field size 0 => force desired amount of alignment. */ 581196263Sobrien#ifdef EMPTY_FIELD_BOUNDARY 581296263Sobrien DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY); 581396263Sobrien#endif 581496263Sobrien#ifdef PCC_BITFIELD_TYPE_MATTERS 581596263Sobrien if (PCC_BITFIELD_TYPE_MATTERS) 581696263Sobrien { 581796263Sobrien DECL_ALIGN (x) = MAX (DECL_ALIGN (x), 581896263Sobrien TYPE_ALIGN (TREE_TYPE (x))); 581996263Sobrien DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x)); 582096263Sobrien } 582196263Sobrien#endif 582296263Sobrien } 582396263Sobrien } 582496263Sobrien } 582596263Sobrien 582696263Sobrien else if (TREE_TYPE (x) != error_mark_node) 582796263Sobrien { 582890075Sobrien unsigned int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT 582990075Sobrien : TYPE_ALIGN (TREE_TYPE (x))); 583018334Speter 583190075Sobrien /* Non-bit-fields are aligned for their type, except packed 583290075Sobrien fields which require only BITS_PER_UNIT alignment. */ 583390075Sobrien DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align); 583490075Sobrien if (! DECL_PACKED (x)) 583590075Sobrien DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x)); 583618334Speter } 583718334Speter 583896263Sobrien DECL_INITIAL (x) = 0; 583996263Sobrien 584090075Sobrien /* Detect flexible array member in an invalid context. */ 584190075Sobrien if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE 584290075Sobrien && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE 584390075Sobrien && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE 584490075Sobrien && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE) 584518334Speter { 584690075Sobrien if (TREE_CODE (t) == UNION_TYPE) 584790075Sobrien error_with_decl (x, "flexible array member in union"); 584890075Sobrien else if (TREE_CHAIN (x) != NULL_TREE) 584990075Sobrien error_with_decl (x, "flexible array member not at end of struct"); 585090075Sobrien else if (! saw_named_field) 585190075Sobrien error_with_decl (x, "flexible array member in otherwise empty struct"); 585218334Speter } 585390075Sobrien if (DECL_NAME (x)) 585490075Sobrien saw_named_field = 1; 585518334Speter } 585618334Speter 585718334Speter /* Delete all duplicate fields from the fieldlist */ 585818334Speter for (x = fieldlist; x && TREE_CHAIN (x);) 585918334Speter /* Anonymous fields aren't duplicates. */ 586018334Speter if (DECL_NAME (TREE_CHAIN (x)) == 0) 586118334Speter x = TREE_CHAIN (x); 586218334Speter else 586318334Speter { 586490075Sobrien tree y = fieldlist; 586590075Sobrien 586618334Speter while (1) 586718334Speter { 586818334Speter if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x))) 586918334Speter break; 587018334Speter if (y == x) 587118334Speter break; 587218334Speter y = TREE_CHAIN (y); 587318334Speter } 587418334Speter if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x))) 587518334Speter { 587618334Speter error_with_decl (TREE_CHAIN (x), "duplicate member `%s'"); 587718334Speter TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x)); 587818334Speter } 587990075Sobrien else 588090075Sobrien x = TREE_CHAIN (x); 588118334Speter } 588218334Speter 588318334Speter /* Now we have the nearly final fieldlist. Record it, 588418334Speter then lay out the structure or union (including the fields). */ 588518334Speter 588618334Speter TYPE_FIELDS (t) = fieldlist; 588718334Speter 588818334Speter layout_type (t); 588918334Speter 589090075Sobrien /* Delete all zero-width bit-fields from the fieldlist */ 589190075Sobrien { 589290075Sobrien tree *fieldlistp = &fieldlist; 589390075Sobrien while (*fieldlistp) 589490075Sobrien if (TREE_CODE (*fieldlistp) == FIELD_DECL && DECL_INITIAL (*fieldlistp)) 589590075Sobrien *fieldlistp = TREE_CHAIN (*fieldlistp); 589690075Sobrien else 589790075Sobrien fieldlistp = &TREE_CHAIN (*fieldlistp); 589890075Sobrien } 589918334Speter 590090075Sobrien /* Now we have the truly final field list. 590190075Sobrien Store it in this type and in the variants. */ 590218334Speter 590318334Speter TYPE_FIELDS (t) = fieldlist; 590418334Speter 590518334Speter for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x)) 590618334Speter { 590718334Speter TYPE_FIELDS (x) = TYPE_FIELDS (t); 590818334Speter TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t); 590918334Speter TYPE_ALIGN (x) = TYPE_ALIGN (t); 591090075Sobrien TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (t); 591118334Speter } 591218334Speter 591318334Speter /* If this was supposed to be a transparent union, but we can't 591418334Speter make it one, warn and turn off the flag. */ 591518334Speter if (TREE_CODE (t) == UNION_TYPE 591618334Speter && TYPE_TRANSPARENT_UNION (t) 591718334Speter && TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t))) 591818334Speter { 591918334Speter TYPE_TRANSPARENT_UNION (t) = 0; 592050397Sobrien warning ("union cannot be made transparent"); 592118334Speter } 592218334Speter 592318334Speter /* If this structure or union completes the type of any previous 592418334Speter variable declaration, lay it out and output its rtl. */ 592518334Speter 592618334Speter if (current_binding_level->n_incomplete != 0) 592718334Speter { 592818334Speter tree decl; 592918334Speter for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl)) 593018334Speter { 593190075Sobrien if (TYPE_MAIN_VARIANT (TREE_TYPE (decl)) == TYPE_MAIN_VARIANT (t) 593218334Speter && TREE_CODE (decl) != TYPE_DECL) 593318334Speter { 593418334Speter layout_decl (decl, 0); 593518334Speter /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 593618334Speter maybe_objc_check_decl (decl); 593790075Sobrien rest_of_decl_compilation (decl, NULL, toplevel, 0); 593818334Speter if (! toplevel) 593918334Speter expand_decl (decl); 594090075Sobrien if (--current_binding_level->n_incomplete == 0) 594190075Sobrien break; 594218334Speter } 594390075Sobrien else if (!COMPLETE_TYPE_P (TREE_TYPE (decl)) 594418334Speter && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) 594518334Speter { 594618334Speter tree element = TREE_TYPE (decl); 594718334Speter while (TREE_CODE (element) == ARRAY_TYPE) 594818334Speter element = TREE_TYPE (element); 594918334Speter if (element == t) 595090075Sobrien { 595190075Sobrien layout_array_type (TREE_TYPE (decl)); 595290075Sobrien if (TREE_CODE (decl) != TYPE_DECL) 595390075Sobrien { 595490075Sobrien layout_decl (decl, 0); 595590075Sobrien maybe_objc_check_decl (decl); 595690075Sobrien rest_of_decl_compilation (decl, NULL, toplevel, 0); 595790075Sobrien if (! toplevel) 595890075Sobrien expand_decl (decl); 595990075Sobrien } 596090075Sobrien if (--current_binding_level->n_incomplete == 0) 596190075Sobrien break; 596290075Sobrien } 596318334Speter } 596418334Speter } 596518334Speter } 596618334Speter 596718334Speter /* Finish debugging output for this type. */ 596818334Speter rest_of_type_compilation (t, toplevel); 596918334Speter 597018334Speter return t; 597118334Speter} 597218334Speter 597318334Speter/* Lay out the type T, and its element type, and so on. */ 597418334Speter 597518334Speterstatic void 597618334Speterlayout_array_type (t) 597718334Speter tree t; 597818334Speter{ 597918334Speter if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) 598018334Speter layout_array_type (TREE_TYPE (t)); 598118334Speter layout_type (t); 598218334Speter} 598318334Speter 598418334Speter/* Begin compiling the definition of an enumeration type. 598518334Speter NAME is its name (or null if anonymous). 598618334Speter Returns the type object, as yet incomplete. 598718334Speter Also records info about it so that build_enumerator 598818334Speter may be used to declare the individual values as they are read. */ 598918334Speter 599018334Spetertree 599118334Speterstart_enum (name) 599218334Speter tree name; 599318334Speter{ 599490075Sobrien tree enumtype = 0; 599518334Speter 599618334Speter /* If this is the real definition for a previous forward reference, 599718334Speter fill in the contents in the same object that used to be the 599818334Speter forward reference. */ 599918334Speter 600018334Speter if (name != 0) 600118334Speter enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1); 600218334Speter 600318334Speter if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE) 600418334Speter { 600518334Speter enumtype = make_node (ENUMERAL_TYPE); 600618334Speter pushtag (name, enumtype); 600718334Speter } 600818334Speter 600918334Speter C_TYPE_BEING_DEFINED (enumtype) = 1; 601018334Speter 601118334Speter if (TYPE_VALUES (enumtype) != 0) 601218334Speter { 601318334Speter /* This enum is a named one that has been declared already. */ 601418334Speter error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name)); 601518334Speter 601618334Speter /* Completely replace its old definition. 601718334Speter The old enumerators remain defined, however. */ 601818334Speter TYPE_VALUES (enumtype) = 0; 601918334Speter } 602018334Speter 602118334Speter enum_next_value = integer_zero_node; 602218334Speter enum_overflow = 0; 602318334Speter 602450397Sobrien if (flag_short_enums) 602550397Sobrien TYPE_PACKED (enumtype) = 1; 602650397Sobrien 602718334Speter return enumtype; 602818334Speter} 602918334Speter 603018334Speter/* After processing and defining all the values of an enumeration type, 603118334Speter install their decls in the enumeration type and finish it off. 603218334Speter ENUMTYPE is the type object, VALUES a list of decl-value pairs, 603318334Speter and ATTRIBUTES are the specified attributes. 603418334Speter Returns ENUMTYPE. */ 603518334Speter 603618334Spetertree 603718334Speterfinish_enum (enumtype, values, attributes) 603818334Speter tree enumtype; 603918334Speter tree values; 604018334Speter tree attributes; 604118334Speter{ 604290075Sobrien tree pair, tem; 604390075Sobrien tree minnode = 0, maxnode = 0, enum_value_type; 604490075Sobrien int precision, unsign; 604590075Sobrien int toplevel = (global_binding_level == current_binding_level); 604618334Speter 604718334Speter if (in_parm_level_p ()) 604818334Speter warning ("enum defined inside parms"); 604918334Speter 605090075Sobrien decl_attributes (&enumtype, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE); 605118334Speter 605218334Speter /* Calculate the maximum value of any enumerator in this type. */ 605318334Speter 605418334Speter if (values == error_mark_node) 605518334Speter minnode = maxnode = integer_zero_node; 605618334Speter else 605790075Sobrien { 605890075Sobrien minnode = maxnode = TREE_VALUE (values); 605990075Sobrien for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair)) 606090075Sobrien { 606190075Sobrien tree value = TREE_VALUE (pair); 606290075Sobrien if (tree_int_cst_lt (maxnode, value)) 606390075Sobrien maxnode = value; 606490075Sobrien if (tree_int_cst_lt (value, minnode)) 606590075Sobrien minnode = value; 606690075Sobrien } 606790075Sobrien } 606818334Speter 606990075Sobrien /* Construct the final type of this enumeration. It is the same 607090075Sobrien as one of the integral types - the narrowest one that fits, except 607190075Sobrien that normally we only go as narrow as int - and signed iff any of 607290075Sobrien the values are negative. */ 607390075Sobrien unsign = (tree_int_cst_sgn (minnode) >= 0); 607490075Sobrien precision = MAX (min_precision (minnode, unsign), 607590075Sobrien min_precision (maxnode, unsign)); 607650397Sobrien if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node)) 607750397Sobrien { 607890075Sobrien tree narrowest = type_for_size (precision, unsign); 607950397Sobrien if (narrowest == 0) 608050397Sobrien { 608150397Sobrien warning ("enumeration values exceed range of largest integer"); 608250397Sobrien narrowest = long_long_integer_type_node; 608350397Sobrien } 608450397Sobrien 608590075Sobrien precision = TYPE_PRECISION (narrowest); 608650397Sobrien } 608718334Speter else 608890075Sobrien precision = TYPE_PRECISION (integer_type_node); 608918334Speter 609090075Sobrien if (precision == TYPE_PRECISION (integer_type_node)) 609190075Sobrien enum_value_type = type_for_size (precision, 0); 609290075Sobrien else 609390075Sobrien enum_value_type = enumtype; 609490075Sobrien 609590075Sobrien TYPE_MIN_VALUE (enumtype) = minnode; 609690075Sobrien TYPE_MAX_VALUE (enumtype) = maxnode; 609790075Sobrien TYPE_PRECISION (enumtype) = precision; 609890075Sobrien TREE_UNSIGNED (enumtype) = unsign; 609918334Speter TYPE_SIZE (enumtype) = 0; 610018334Speter layout_type (enumtype); 610118334Speter 610218334Speter if (values != error_mark_node) 610318334Speter { 610490075Sobrien /* Change the type of the enumerators to be the enum type. We 610590075Sobrien need to do this irrespective of the size of the enum, for 610690075Sobrien proper type checking. Replace the DECL_INITIALs of the 610790075Sobrien enumerators, and the value slots of the list, with copies 610890075Sobrien that have the enum type; they cannot be modified in place 610990075Sobrien because they may be shared (e.g. integer_zero_node) Finally, 611090075Sobrien change the purpose slots to point to the names of the decls. */ 611118334Speter for (pair = values; pair; pair = TREE_CHAIN (pair)) 611218334Speter { 611390075Sobrien tree enu = TREE_PURPOSE (pair); 611490075Sobrien 611590075Sobrien TREE_TYPE (enu) = enumtype; 611690075Sobrien DECL_SIZE (enu) = TYPE_SIZE (enumtype); 611790075Sobrien DECL_SIZE_UNIT (enu) = TYPE_SIZE_UNIT (enumtype); 611890075Sobrien DECL_ALIGN (enu) = TYPE_ALIGN (enumtype); 611990075Sobrien DECL_USER_ALIGN (enu) = TYPE_USER_ALIGN (enumtype); 612090075Sobrien DECL_MODE (enu) = TYPE_MODE (enumtype); 612190075Sobrien 612290075Sobrien /* The ISO C Standard mandates enumerators to have type int, 612390075Sobrien even though the underlying type of an enum type is 612490075Sobrien unspecified. Here we convert any enumerators that fit in 612590075Sobrien an int to type int, to avoid promotions to unsigned types 612690075Sobrien when comparing integers with enumerators that fit in the 612790075Sobrien int range. When -pedantic is given, build_enumerator() 612890075Sobrien would have already taken care of those that don't fit. */ 612990075Sobrien if (int_fits_type_p (DECL_INITIAL (enu), enum_value_type)) 613090075Sobrien DECL_INITIAL (enu) = convert (enum_value_type, DECL_INITIAL (enu)); 613190075Sobrien else 613290075Sobrien DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu)); 613390075Sobrien 613490075Sobrien TREE_PURPOSE (pair) = DECL_NAME (enu); 613590075Sobrien TREE_VALUE (pair) = DECL_INITIAL (enu); 613618334Speter } 613718334Speter 613818334Speter TYPE_VALUES (enumtype) = values; 613918334Speter } 614018334Speter 614118334Speter /* Fix up all variant types of this enum type. */ 614218334Speter for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem)) 614318334Speter { 614490075Sobrien if (tem == enumtype) 614590075Sobrien continue; 614618334Speter TYPE_VALUES (tem) = TYPE_VALUES (enumtype); 614718334Speter TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype); 614818334Speter TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype); 614918334Speter TYPE_SIZE (tem) = TYPE_SIZE (enumtype); 615050397Sobrien TYPE_SIZE_UNIT (tem) = TYPE_SIZE_UNIT (enumtype); 615118334Speter TYPE_MODE (tem) = TYPE_MODE (enumtype); 615218334Speter TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype); 615318334Speter TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype); 615490075Sobrien TYPE_USER_ALIGN (tem) = TYPE_USER_ALIGN (enumtype); 615518334Speter TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype); 615618334Speter } 615718334Speter 615818334Speter /* Finish debugging output for this type. */ 615918334Speter rest_of_type_compilation (enumtype, toplevel); 616018334Speter 616118334Speter return enumtype; 616218334Speter} 616318334Speter 616418334Speter/* Build and install a CONST_DECL for one value of the 616518334Speter current enumeration type (one that was begun with start_enum). 616618334Speter Return a tree-list containing the CONST_DECL and its value. 616718334Speter Assignment of sequential values by default is handled here. */ 616818334Speter 616918334Spetertree 617018334Speterbuild_enumerator (name, value) 617118334Speter tree name, value; 617218334Speter{ 617390075Sobrien tree decl, type; 617418334Speter 617518334Speter /* Validate and default VALUE. */ 617618334Speter 617718334Speter /* Remove no-op casts from the value. */ 617818334Speter if (value) 617918334Speter STRIP_TYPE_NOPS (value); 618018334Speter 618118334Speter if (value != 0) 618218334Speter { 618318334Speter if (TREE_CODE (value) == INTEGER_CST) 618418334Speter { 618518334Speter value = default_conversion (value); 618618334Speter constant_expression_warning (value); 618718334Speter } 618818334Speter else 618918334Speter { 619018334Speter error ("enumerator value for `%s' not integer constant", 619118334Speter IDENTIFIER_POINTER (name)); 619218334Speter value = 0; 619318334Speter } 619418334Speter } 619518334Speter 619618334Speter /* Default based on previous value. */ 619718334Speter /* It should no longer be possible to have NON_LVALUE_EXPR 619818334Speter in the default. */ 619918334Speter if (value == 0) 620018334Speter { 620118334Speter value = enum_next_value; 620218334Speter if (enum_overflow) 620318334Speter error ("overflow in enumeration values"); 620418334Speter } 620518334Speter 620618334Speter if (pedantic && ! int_fits_type_p (value, integer_type_node)) 620718334Speter { 620890075Sobrien pedwarn ("ISO C restricts enumerator values to range of `int'"); 620990075Sobrien value = convert (integer_type_node, value); 621018334Speter } 621118334Speter 621218334Speter /* Set basis for default for next value. */ 621318334Speter enum_next_value = build_binary_op (PLUS_EXPR, value, integer_one_node, 0); 621418334Speter enum_overflow = tree_int_cst_lt (enum_next_value, value); 621518334Speter 621618334Speter /* Now create a declaration for the enum value name. */ 621718334Speter 621818334Speter type = TREE_TYPE (value); 621918334Speter type = type_for_size (MAX (TYPE_PRECISION (type), 622018334Speter TYPE_PRECISION (integer_type_node)), 622118334Speter ((flag_traditional 622218334Speter || TYPE_PRECISION (type) >= TYPE_PRECISION (integer_type_node)) 622318334Speter && TREE_UNSIGNED (type))); 622418334Speter 622518334Speter decl = build_decl (CONST_DECL, name, type); 622690075Sobrien DECL_INITIAL (decl) = convert (type, value); 622718334Speter pushdecl (decl); 622818334Speter 622990075Sobrien return tree_cons (decl, value, NULL_TREE); 623018334Speter} 623190075Sobrien 623218334Speter 623318334Speter/* Create the FUNCTION_DECL for a function definition. 623490075Sobrien DECLSPECS, DECLARATOR and ATTRIBUTES are the parts of 623518334Speter the declaration; they describe the function's name and the type it returns, 623618334Speter but twisted together in a fashion that parallels the syntax of C. 623718334Speter 623818334Speter This function creates a binding context for the function body 623918334Speter as well as setting up the FUNCTION_DECL in current_function_decl. 624018334Speter 624118334Speter Returns 1 on success. If the DECLARATOR is not suitable for a function 624218334Speter (it defines a datum instead), we return 0, which tells 624390075Sobrien yyparse to report a parse error. */ 624418334Speter 624518334Speterint 624690075Sobrienstart_function (declspecs, declarator, attributes) 624790075Sobrien tree declarator, declspecs, attributes; 624818334Speter{ 624918334Speter tree decl1, old_decl; 625018334Speter tree restype; 625118334Speter int old_immediate_size_expand = immediate_size_expand; 625218334Speter 625350397Sobrien current_function_returns_value = 0; /* Assume, until we see it does. */ 625418334Speter current_function_returns_null = 0; 625596263Sobrien current_function_returns_abnormally = 0; 625618334Speter warn_about_return_type = 0; 625718334Speter current_extern_inline = 0; 625818334Speter c_function_varargs = 0; 625918334Speter named_labels = 0; 626018334Speter shadowed_labels = 0; 626118334Speter 626218334Speter /* Don't expand any sizes in the return type of the function. */ 626318334Speter immediate_size_expand = 0; 626418334Speter 626596263Sobrien decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1); 626618334Speter 626718334Speter /* If the declarator is not suitable for a function definition, 626818334Speter cause a syntax error. */ 626918334Speter if (decl1 == 0) 627050397Sobrien { 627150397Sobrien immediate_size_expand = old_immediate_size_expand; 627250397Sobrien return 0; 627350397Sobrien } 627418334Speter 627590075Sobrien decl_attributes (&decl1, attributes, 0); 627618334Speter 627796263Sobrien /* If #pragma weak was used, mark the decl weak now. */ 627896263Sobrien if (current_binding_level == global_binding_level) 627996263Sobrien maybe_apply_pragma_weak (decl1); 628096263Sobrien 628190075Sobrien if (DECL_DECLARED_INLINE_P (decl1) 628290075Sobrien && DECL_UNINLINABLE (decl1) 628390075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1))) 628490075Sobrien warning_with_decl (decl1, 628590075Sobrien "inline function `%s' given attribute noinline"); 628690075Sobrien 628718334Speter announce_function (decl1); 628818334Speter 628990075Sobrien if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl1)))) 629018334Speter { 629190075Sobrien error ("return type is an incomplete type"); 629218334Speter /* Make it return void instead. */ 629318334Speter TREE_TYPE (decl1) 629418334Speter = build_function_type (void_type_node, 629518334Speter TYPE_ARG_TYPES (TREE_TYPE (decl1))); 629618334Speter } 629718334Speter 629818334Speter if (warn_about_return_type) 629990075Sobrien pedwarn_c99 ("return type defaults to `int'"); 630018334Speter 630118334Speter /* Save the parm names or decls from this function's declarator 630218334Speter where store_parm_decls will find them. */ 630318334Speter current_function_parms = last_function_parms; 630418334Speter current_function_parm_tags = last_function_parm_tags; 630518334Speter 630618334Speter /* Make the init_value nonzero so pushdecl knows this is not tentative. 630718334Speter error_mark_node is replaced below (in poplevel) with the BLOCK. */ 630818334Speter DECL_INITIAL (decl1) = error_mark_node; 630918334Speter 631018334Speter /* If this definition isn't a prototype and we had a prototype declaration 631118334Speter before, copy the arg type info from that prototype. 631218334Speter But not if what we had before was a builtin function. */ 631318334Speter old_decl = lookup_name_current_level (DECL_NAME (decl1)); 631418334Speter if (old_decl != 0 && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE 631518334Speter && !DECL_BUILT_IN (old_decl) 631618334Speter && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1))) 631718334Speter == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (old_decl)))) 631818334Speter && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0) 631918334Speter { 632018334Speter TREE_TYPE (decl1) = TREE_TYPE (old_decl); 632118334Speter current_function_prototype_file = DECL_SOURCE_FILE (old_decl); 632218334Speter current_function_prototype_line = DECL_SOURCE_LINE (old_decl); 632318334Speter } 632418334Speter 632518334Speter /* If there is no explicit declaration, look for any out-of-scope implicit 632618334Speter declarations. */ 632718334Speter if (old_decl == 0) 632818334Speter old_decl = IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)); 632918334Speter 633018334Speter /* Optionally warn of old-fashioned def with no previous prototype. */ 633118334Speter if (warn_strict_prototypes 633218334Speter && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0 633390075Sobrien && !(old_decl != 0 633490075Sobrien && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0 633590075Sobrien || (DECL_BUILT_IN (old_decl) 633696557Sobrien && ! C_DECL_ANTICIPATED (old_decl)))) 633796557Sobrien && !(flag_bsd_no_warn_kr_main && 0 == 633896557Sobrien strcmp ("main", IDENTIFIER_POINTER (DECL_NAME (decl1))))) 633918334Speter warning ("function declaration isn't a prototype"); 634018334Speter /* Optionally warn of any global def with no previous prototype. */ 634118334Speter else if (warn_missing_prototypes 634218334Speter && TREE_PUBLIC (decl1) 634390075Sobrien && !(old_decl != 0 634490075Sobrien && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0 634590075Sobrien || (DECL_BUILT_IN (old_decl) 634690075Sobrien && ! C_DECL_ANTICIPATED (old_decl)))) 634790075Sobrien && ! MAIN_NAME_P (DECL_NAME (decl1))) 634818334Speter warning_with_decl (decl1, "no previous prototype for `%s'"); 634918334Speter /* Optionally warn of any def with no previous prototype 635018334Speter if the function has already been used. */ 635118334Speter else if (warn_missing_prototypes 635218334Speter && old_decl != 0 && TREE_USED (old_decl) 635318334Speter && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) == 0) 635418334Speter warning_with_decl (decl1, 635590075Sobrien "`%s' was used with no prototype before its definition"); 635618334Speter /* Optionally warn of any global def with no previous declaration. */ 635718334Speter else if (warn_missing_declarations 635818334Speter && TREE_PUBLIC (decl1) 635918334Speter && old_decl == 0 636090075Sobrien && ! MAIN_NAME_P (DECL_NAME (decl1))) 636118334Speter warning_with_decl (decl1, "no previous declaration for `%s'"); 636218334Speter /* Optionally warn of any def with no previous declaration 636318334Speter if the function has already been used. */ 636418334Speter else if (warn_missing_declarations 636518334Speter && old_decl != 0 && TREE_USED (old_decl) 636618334Speter && old_decl == IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1))) 636718334Speter warning_with_decl (decl1, 636890075Sobrien "`%s' was used with no declaration before its definition"); 636918334Speter 637018334Speter /* This is a definition, not a reference. 637118334Speter So normally clear DECL_EXTERNAL. 637218334Speter However, `extern inline' acts like a declaration 637318334Speter except for defining how to inline. So set DECL_EXTERNAL in that case. */ 637418334Speter DECL_EXTERNAL (decl1) = current_extern_inline; 637518334Speter 637618334Speter /* This function exists in static storage. 637718334Speter (This does not mean `static' in the C sense!) */ 637818334Speter TREE_STATIC (decl1) = 1; 637918334Speter 638018334Speter /* A nested function is not global. */ 638118334Speter if (current_function_decl != 0) 638218334Speter TREE_PUBLIC (decl1) = 0; 638318334Speter 638490075Sobrien /* Warn for unlikely, improbable, or stupid declarations of `main'. */ 638590075Sobrien if (warn_main > 0 && MAIN_NAME_P (DECL_NAME (decl1))) 638650397Sobrien { 638750397Sobrien tree args; 638850397Sobrien int argct = 0; 638950397Sobrien 639050397Sobrien if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1))) 639190075Sobrien != integer_type_node) 639250397Sobrien pedwarn_with_decl (decl1, "return type of `%s' is not `int'"); 639350397Sobrien 639450397Sobrien for (args = TYPE_ARG_TYPES (TREE_TYPE (decl1)); args; 639550397Sobrien args = TREE_CHAIN (args)) 639650397Sobrien { 639750397Sobrien tree type = args ? TREE_VALUE (args) : 0; 639850397Sobrien 639950397Sobrien if (type == void_type_node) 640050397Sobrien break; 640150397Sobrien 640250397Sobrien ++argct; 640350397Sobrien switch (argct) 640450397Sobrien { 640550397Sobrien case 1: 640650397Sobrien if (TYPE_MAIN_VARIANT (type) != integer_type_node) 640750397Sobrien pedwarn_with_decl (decl1, 640850397Sobrien "first argument of `%s' should be `int'"); 640950397Sobrien break; 641050397Sobrien 641150397Sobrien case 2: 641250397Sobrien if (TREE_CODE (type) != POINTER_TYPE 641350397Sobrien || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE 641450397Sobrien || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) 641550397Sobrien != char_type_node)) 641650397Sobrien pedwarn_with_decl (decl1, 641790075Sobrien "second argument of `%s' should be `char **'"); 641850397Sobrien break; 641950397Sobrien 642050397Sobrien case 3: 642150397Sobrien if (TREE_CODE (type) != POINTER_TYPE 642250397Sobrien || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE 642350397Sobrien || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) 642450397Sobrien != char_type_node)) 642550397Sobrien pedwarn_with_decl (decl1, 642690075Sobrien "third argument of `%s' should probably be `char **'"); 642750397Sobrien break; 642850397Sobrien } 642950397Sobrien } 643050397Sobrien 643150397Sobrien /* It is intentional that this message does not mention the third 643290075Sobrien argument because it's only mentioned in an appendix of the 643390075Sobrien standard. */ 643450397Sobrien if (argct > 0 && (argct < 2 || argct > 3)) 643550397Sobrien pedwarn_with_decl (decl1, "`%s' takes only zero or two arguments"); 643650397Sobrien 643750397Sobrien if (! TREE_PUBLIC (decl1)) 643850397Sobrien pedwarn_with_decl (decl1, "`%s' is normally a non-static function"); 643950397Sobrien } 644050397Sobrien 644118334Speter /* Record the decl so that the function name is defined. 644218334Speter If we already have a decl for this name, and it is a FUNCTION_DECL, 644318334Speter use the old decl. */ 644418334Speter 644518334Speter current_function_decl = pushdecl (decl1); 644618334Speter 644718334Speter pushlevel (0); 644818334Speter declare_parm_level (1); 644918334Speter current_binding_level->subblocks_tag_transparent = 1; 645018334Speter 645190075Sobrien make_decl_rtl (current_function_decl, NULL); 645218334Speter 645318334Speter restype = TREE_TYPE (TREE_TYPE (current_function_decl)); 645418334Speter /* Promote the value to int before returning it. */ 645590075Sobrien if (c_promoting_integer_type_p (restype)) 645618334Speter { 645718334Speter /* It retains unsignedness if traditional 645818334Speter or if not really getting wider. */ 645918334Speter if (TREE_UNSIGNED (restype) 646018334Speter && (flag_traditional 646118334Speter || (TYPE_PRECISION (restype) 646218334Speter == TYPE_PRECISION (integer_type_node)))) 646318334Speter restype = unsigned_type_node; 646418334Speter else 646518334Speter restype = integer_type_node; 646618334Speter } 646718334Speter DECL_RESULT (current_function_decl) 646818334Speter = build_decl (RESULT_DECL, NULL_TREE, restype); 646918334Speter 647018334Speter /* If this fcn was already referenced via a block-scope `extern' decl 647118334Speter (or an implicit decl), propagate certain information about the usage. */ 647218334Speter if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl))) 647318334Speter TREE_ADDRESSABLE (current_function_decl) = 1; 647418334Speter 647518334Speter immediate_size_expand = old_immediate_size_expand; 647618334Speter 647790075Sobrien start_fname_decls (); 647890075Sobrien 647918334Speter return 1; 648018334Speter} 648118334Speter 648218334Speter/* Record that this function is going to be a varargs function. 648318334Speter This is called before store_parm_decls, which is too early 648418334Speter to call mark_varargs directly. */ 648518334Speter 648618334Spetervoid 648718334Speterc_mark_varargs () 648818334Speter{ 648918334Speter c_function_varargs = 1; 649018334Speter} 649118334Speter 649218334Speter/* Store the parameter declarations into the current function declaration. 649318334Speter This is called after parsing the parameter declarations, before 649418334Speter digesting the body of the function. 649518334Speter 649618334Speter For an old-style definition, modify the function's type 649718334Speter to specify at least the number of arguments. */ 649818334Speter 649918334Spetervoid 650018334Speterstore_parm_decls () 650118334Speter{ 650290075Sobrien tree fndecl = current_function_decl; 650390075Sobrien tree parm; 650418334Speter 650518334Speter /* This is either a chain of PARM_DECLs (if a prototype was used) 650618334Speter or a list of IDENTIFIER_NODEs (for an old-fashioned C definition). */ 650718334Speter tree specparms = current_function_parms; 650818334Speter 650918334Speter /* This is a list of types declared among parms in a prototype. */ 651018334Speter tree parmtags = current_function_parm_tags; 651118334Speter 651218334Speter /* This is a chain of PARM_DECLs from old-style parm declarations. */ 651390075Sobrien tree parmdecls = getdecls (); 651418334Speter 651518334Speter /* This is a chain of any other decls that came in among the parm 651618334Speter declarations. If a parm is declared with enum {foo, bar} x; 651718334Speter then CONST_DECLs for foo and bar are put here. */ 651818334Speter tree nonparms = 0; 651918334Speter 652090075Sobrien /* The function containing FNDECL, if any. */ 652190075Sobrien tree context = decl_function_context (fndecl); 652290075Sobrien 652318334Speter /* Nonzero if this definition is written with a prototype. */ 652418334Speter int prototype = 0; 652518334Speter 652690075Sobrien int saved_warn_shadow = warn_shadow; 652790075Sobrien 652890075Sobrien /* Don't re-emit shadow warnings. */ 652990075Sobrien warn_shadow = 0; 653090075Sobrien 653118334Speter if (specparms != 0 && TREE_CODE (specparms) != TREE_LIST) 653218334Speter { 653318334Speter /* This case is when the function was defined with an ANSI prototype. 653418334Speter The parms already have decls, so we need not do anything here 653518334Speter except record them as in effect 653618334Speter and complain if any redundant old-style parm decls were written. */ 653718334Speter 653890075Sobrien tree next; 653918334Speter tree others = 0; 654018334Speter 654118334Speter prototype = 1; 654218334Speter 654318334Speter if (parmdecls != 0) 654418334Speter { 654518334Speter tree decl, link; 654618334Speter 654718334Speter error_with_decl (fndecl, 654818334Speter "parm types given both in parmlist and separately"); 654918334Speter /* Get rid of the erroneous decls; don't keep them on 655018334Speter the list of parms, since they might not be PARM_DECLs. */ 655118334Speter for (decl = current_binding_level->names; 655218334Speter decl; decl = TREE_CHAIN (decl)) 655318334Speter if (DECL_NAME (decl)) 655418334Speter IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) = 0; 655518334Speter for (link = current_binding_level->shadowed; 655618334Speter link; link = TREE_CHAIN (link)) 655718334Speter IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); 655818334Speter current_binding_level->names = 0; 655918334Speter current_binding_level->shadowed = 0; 656018334Speter } 656118334Speter 656218334Speter specparms = nreverse (specparms); 656318334Speter for (parm = specparms; parm; parm = next) 656418334Speter { 656518334Speter next = TREE_CHAIN (parm); 656618334Speter if (TREE_CODE (parm) == PARM_DECL) 656718334Speter { 656818334Speter if (DECL_NAME (parm) == 0) 656918334Speter error_with_decl (parm, "parameter name omitted"); 657090075Sobrien else if (TREE_CODE (TREE_TYPE (parm)) != ERROR_MARK 657190075Sobrien && VOID_TYPE_P (TREE_TYPE (parm))) 657218334Speter { 657318334Speter error_with_decl (parm, "parameter `%s' declared void"); 657418334Speter /* Change the type to error_mark_node so this parameter 657518334Speter will be ignored by assign_parms. */ 657618334Speter TREE_TYPE (parm) = error_mark_node; 657718334Speter } 657818334Speter pushdecl (parm); 657918334Speter } 658018334Speter else 658118334Speter { 658218334Speter /* If we find an enum constant or a type tag, 658318334Speter put it aside for the moment. */ 658418334Speter TREE_CHAIN (parm) = 0; 658518334Speter others = chainon (others, parm); 658618334Speter } 658718334Speter } 658818334Speter 658918334Speter /* Get the decls in their original chain order 659018334Speter and record in the function. */ 659118334Speter DECL_ARGUMENTS (fndecl) = getdecls (); 659218334Speter 659318334Speter#if 0 659418334Speter /* If this function takes a variable number of arguments, 659518334Speter add a phony parameter to the end of the parm list, 659618334Speter to represent the position of the first unnamed argument. */ 659718334Speter if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl)))) 659818334Speter != void_type_node) 659918334Speter { 660018334Speter tree dummy = build_decl (PARM_DECL, NULL_TREE, void_type_node); 660118334Speter /* Let's hope the address of the unnamed parm 660218334Speter won't depend on its type. */ 660318334Speter TREE_TYPE (dummy) = integer_type_node; 660418334Speter DECL_ARG_TYPE (dummy) = integer_type_node; 660590075Sobrien DECL_ARGUMENTS (fndecl) = chainon (DECL_ARGUMENTS (fndecl), dummy); 660618334Speter } 660718334Speter#endif 660818334Speter 660918334Speter /* Now pushdecl the enum constants. */ 661018334Speter for (parm = others; parm; parm = next) 661118334Speter { 661218334Speter next = TREE_CHAIN (parm); 661318334Speter if (DECL_NAME (parm) == 0) 661418334Speter ; 661518334Speter else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node) 661618334Speter ; 661718334Speter else if (TREE_CODE (parm) != PARM_DECL) 661818334Speter pushdecl (parm); 661918334Speter } 662018334Speter 662118334Speter storetags (chainon (parmtags, gettags ())); 662218334Speter } 662318334Speter else 662418334Speter { 662518334Speter /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes 662618334Speter each with a parm name as the TREE_VALUE. 662718334Speter 662818334Speter PARMDECLS is a chain of declarations for parameters. 662918334Speter Warning! It can also contain CONST_DECLs which are not parameters 663018334Speter but are names of enumerators of any enum types 663118334Speter declared among the parameters. 663218334Speter 663318334Speter First match each formal parameter name with its declaration. 663418334Speter Associate decls with the names and store the decls 663518334Speter into the TREE_PURPOSE slots. */ 663618334Speter 663790075Sobrien /* We use DECL_WEAK as a flag to show which parameters have been 663890075Sobrien seen already since it is not used on PARM_DECL or CONST_DECL. */ 663918334Speter for (parm = parmdecls; parm; parm = TREE_CHAIN (parm)) 664090075Sobrien DECL_WEAK (parm) = 0; 664118334Speter 664218334Speter for (parm = specparms; parm; parm = TREE_CHAIN (parm)) 664318334Speter { 664490075Sobrien tree tail, found = NULL; 664518334Speter 664618334Speter if (TREE_VALUE (parm) == 0) 664718334Speter { 664890075Sobrien error_with_decl (fndecl, 664990075Sobrien "parameter name missing from parameter list"); 665018334Speter TREE_PURPOSE (parm) = 0; 665118334Speter continue; 665218334Speter } 665318334Speter 665418334Speter /* See if any of the parmdecls specifies this parm by name. 665518334Speter Ignore any enumerator decls. */ 665618334Speter for (tail = parmdecls; tail; tail = TREE_CHAIN (tail)) 665718334Speter if (DECL_NAME (tail) == TREE_VALUE (parm) 665818334Speter && TREE_CODE (tail) == PARM_DECL) 665918334Speter { 666018334Speter found = tail; 666118334Speter break; 666218334Speter } 666318334Speter 666418334Speter /* If declaration already marked, we have a duplicate name. 666590075Sobrien Complain, and don't use this decl twice. */ 666690075Sobrien if (found && DECL_WEAK (found)) 666718334Speter { 666818334Speter error_with_decl (found, "multiple parameters named `%s'"); 666918334Speter found = 0; 667018334Speter } 667118334Speter 667218334Speter /* If the declaration says "void", complain and ignore it. */ 667390075Sobrien if (found && VOID_TYPE_P (TREE_TYPE (found))) 667418334Speter { 667518334Speter error_with_decl (found, "parameter `%s' declared void"); 667618334Speter TREE_TYPE (found) = integer_type_node; 667718334Speter DECL_ARG_TYPE (found) = integer_type_node; 667818334Speter layout_decl (found, 0); 667918334Speter } 668018334Speter 668118334Speter /* Traditionally, a parm declared float is actually a double. */ 668218334Speter if (found && flag_traditional 668318334Speter && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == float_type_node) 668418334Speter { 668518334Speter TREE_TYPE (found) = double_type_node; 668618334Speter DECL_ARG_TYPE (found) = double_type_node; 668718334Speter layout_decl (found, 0); 668818334Speter } 668918334Speter 669018334Speter /* If no declaration found, default to int. */ 669118334Speter if (!found) 669218334Speter { 669318334Speter found = build_decl (PARM_DECL, TREE_VALUE (parm), 669418334Speter integer_type_node); 669518334Speter DECL_ARG_TYPE (found) = TREE_TYPE (found); 669618334Speter DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl); 669718334Speter DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl); 669890075Sobrien if (flag_isoc99) 669990075Sobrien pedwarn_with_decl (found, "type of `%s' defaults to `int'"); 670090075Sobrien else if (extra_warnings) 670118334Speter warning_with_decl (found, "type of `%s' defaults to `int'"); 670218334Speter pushdecl (found); 670318334Speter } 670418334Speter 670518334Speter TREE_PURPOSE (parm) = found; 670618334Speter 670790075Sobrien /* Mark this decl as "already found". */ 670890075Sobrien DECL_WEAK (found) = 1; 670918334Speter } 671018334Speter 671118334Speter /* Put anything which is on the parmdecls chain and which is 671218334Speter not a PARM_DECL onto the list NONPARMS. (The types of 671318334Speter non-parm things which might appear on the list include 671418334Speter enumerators and NULL-named TYPE_DECL nodes.) Complain about 671518334Speter any actual PARM_DECLs not matched with any names. */ 671618334Speter 671718334Speter nonparms = 0; 671890075Sobrien for (parm = parmdecls; parm;) 671918334Speter { 672018334Speter tree next = TREE_CHAIN (parm); 672118334Speter TREE_CHAIN (parm) = 0; 672218334Speter 672318334Speter if (TREE_CODE (parm) != PARM_DECL) 672418334Speter nonparms = chainon (nonparms, parm); 672518334Speter else 672618334Speter { 672718334Speter /* Complain about args with incomplete types. */ 672890075Sobrien if (!COMPLETE_TYPE_P (TREE_TYPE (parm))) 672990075Sobrien { 673090075Sobrien error_with_decl (parm, "parameter `%s' has incomplete type"); 673190075Sobrien TREE_TYPE (parm) = error_mark_node; 673290075Sobrien } 673318334Speter 673490075Sobrien if (! DECL_WEAK (parm)) 673590075Sobrien { 673690075Sobrien error_with_decl (parm, 673790075Sobrien "declaration for parameter `%s' but no such parameter"); 673818334Speter /* Pretend the parameter was not missing. 673918334Speter This gets us to a standard state and minimizes 674018334Speter further error messages. */ 674190075Sobrien specparms 674218334Speter = chainon (specparms, 674318334Speter tree_cons (parm, NULL_TREE, NULL_TREE)); 674418334Speter } 674518334Speter } 674618334Speter 674718334Speter parm = next; 674818334Speter } 674918334Speter 675090075Sobrien /* Chain the declarations together in the order of the list of 675190075Sobrien names. Store that chain in the function decl, replacing the 675290075Sobrien list of names. */ 675318334Speter parm = specparms; 675418334Speter DECL_ARGUMENTS (fndecl) = 0; 675518334Speter { 675690075Sobrien tree last; 675718334Speter for (last = 0; parm; parm = TREE_CHAIN (parm)) 675818334Speter if (TREE_PURPOSE (parm)) 675918334Speter { 676018334Speter if (last == 0) 676118334Speter DECL_ARGUMENTS (fndecl) = TREE_PURPOSE (parm); 676218334Speter else 676318334Speter TREE_CHAIN (last) = TREE_PURPOSE (parm); 676418334Speter last = TREE_PURPOSE (parm); 676518334Speter TREE_CHAIN (last) = 0; 676618334Speter } 676718334Speter } 676818334Speter 676918334Speter /* If there was a previous prototype, 677018334Speter set the DECL_ARG_TYPE of each argument according to 677118334Speter the type previously specified, and report any mismatches. */ 677218334Speter 677318334Speter if (TYPE_ARG_TYPES (TREE_TYPE (fndecl))) 677418334Speter { 677590075Sobrien tree type; 677618334Speter for (parm = DECL_ARGUMENTS (fndecl), 677718334Speter type = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); 677818334Speter parm || (type && (TYPE_MAIN_VARIANT (TREE_VALUE (type)) 677918334Speter != void_type_node)); 678018334Speter parm = TREE_CHAIN (parm), type = TREE_CHAIN (type)) 678118334Speter { 678218334Speter if (parm == 0 || type == 0 678318334Speter || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node) 678418334Speter { 678518334Speter error ("number of arguments doesn't match prototype"); 678618334Speter error_with_file_and_line (current_function_prototype_file, 678718334Speter current_function_prototype_line, 678818334Speter "prototype declaration"); 678918334Speter break; 679018334Speter } 679190075Sobrien /* Type for passing arg must be consistent with that 679290075Sobrien declared for the arg. ISO C says we take the unqualified 679390075Sobrien type for parameters declared with qualified type. */ 679490075Sobrien if (! comptypes (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm)), 679590075Sobrien TYPE_MAIN_VARIANT (TREE_VALUE (type)))) 679618334Speter { 679718334Speter if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) 679818334Speter == TYPE_MAIN_VARIANT (TREE_VALUE (type))) 679918334Speter { 680018334Speter /* Adjust argument to match prototype. E.g. a previous 680118334Speter `int foo(float);' prototype causes 680218334Speter `int foo(x) float x; {...}' to be treated like 680318334Speter `int foo(float x) {...}'. This is particularly 680418334Speter useful for argument types like uid_t. */ 680518334Speter DECL_ARG_TYPE (parm) = TREE_TYPE (parm); 680690075Sobrien 680790075Sobrien if (PROMOTE_PROTOTYPES 680890075Sobrien && INTEGRAL_TYPE_P (TREE_TYPE (parm)) 680918334Speter && TYPE_PRECISION (TREE_TYPE (parm)) 681018334Speter < TYPE_PRECISION (integer_type_node)) 681118334Speter DECL_ARG_TYPE (parm) = integer_type_node; 681290075Sobrien 681318334Speter if (pedantic) 681418334Speter { 681518334Speter pedwarn ("promoted argument `%s' doesn't match prototype", 681618334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 681718334Speter warning_with_file_and_line 681818334Speter (current_function_prototype_file, 681918334Speter current_function_prototype_line, 682018334Speter "prototype declaration"); 682118334Speter } 682218334Speter } 682318334Speter /* If -traditional, allow `int' argument to match 682418334Speter `unsigned' prototype. */ 682518334Speter else if (! (flag_traditional 682618334Speter && TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == integer_type_node 682718334Speter && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node)) 682818334Speter { 682918334Speter error ("argument `%s' doesn't match prototype", 683018334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 683118334Speter error_with_file_and_line (current_function_prototype_file, 683218334Speter current_function_prototype_line, 683318334Speter "prototype declaration"); 683418334Speter } 683518334Speter } 683618334Speter } 683718334Speter TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0; 683818334Speter } 683918334Speter 684018334Speter /* Otherwise, create a prototype that would match. */ 684118334Speter 684218334Speter else 684318334Speter { 684418334Speter tree actual = 0, last = 0, type; 684518334Speter 684618334Speter for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm)) 684718334Speter { 684890075Sobrien type = tree_cons (NULL_TREE, DECL_ARG_TYPE (parm), NULL_TREE); 684918334Speter if (last) 685018334Speter TREE_CHAIN (last) = type; 685118334Speter else 685218334Speter actual = type; 685318334Speter last = type; 685418334Speter } 685590075Sobrien type = tree_cons (NULL_TREE, void_type_node, NULL_TREE); 685618334Speter if (last) 685718334Speter TREE_CHAIN (last) = type; 685818334Speter else 685918334Speter actual = type; 686018334Speter 686118334Speter /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES 686218334Speter of the type of this function, but we need to avoid having this 686318334Speter affect the types of other similarly-typed functions, so we must 686418334Speter first force the generation of an identical (but separate) type 686518334Speter node for the relevant function type. The new node we create 686618334Speter will be a variant of the main variant of the original function 686718334Speter type. */ 686818334Speter 686918334Speter TREE_TYPE (fndecl) = build_type_copy (TREE_TYPE (fndecl)); 687018334Speter 687118334Speter TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = actual; 687218334Speter } 687318334Speter 687418334Speter /* Now store the final chain of decls for the arguments 687518334Speter as the decl-chain of the current lexical scope. 687618334Speter Put the enumerators in as well, at the front so that 687718334Speter DECL_ARGUMENTS is not modified. */ 687818334Speter 687918334Speter storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); 688018334Speter } 688118334Speter 688218334Speter /* Make sure the binding level for the top of the function body 688318334Speter gets a BLOCK if there are any in the function. 688418334Speter Otherwise, the dbx output is wrong. */ 688518334Speter 688618334Speter keep_next_if_subblocks = 1; 688718334Speter 688818334Speter /* ??? This might be an improvement, 688918334Speter but needs to be thought about some more. */ 689018334Speter#if 0 689118334Speter keep_next_level_flag = 1; 689218334Speter#endif 689318334Speter 689418334Speter /* Write a record describing this function definition to the prototypes 689518334Speter file (if requested). */ 689618334Speter 689718334Speter gen_aux_info_record (fndecl, 1, 0, prototype); 689818334Speter 689918334Speter /* Initialize the RTL code for the function. */ 690018334Speter init_function_start (fndecl, input_filename, lineno); 690118334Speter 690290075Sobrien /* Begin the statement tree for this function. */ 690390075Sobrien begin_stmt_tree (&DECL_SAVED_TREE (current_function_decl)); 690418334Speter 690590075Sobrien /* If this is a nested function, save away the sizes of any 690690075Sobrien variable-size types so that we can expand them when generating 690790075Sobrien RTL. */ 690890075Sobrien if (context) 690918334Speter { 691090075Sobrien tree t; 691118334Speter 691290075Sobrien DECL_LANG_SPECIFIC (fndecl)->pending_sizes 691390075Sobrien = nreverse (get_pending_sizes ()); 691490075Sobrien for (t = DECL_LANG_SPECIFIC (fndecl)->pending_sizes; 691590075Sobrien t; 691690075Sobrien t = TREE_CHAIN (t)) 691790075Sobrien SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = context; 691818334Speter } 691918334Speter 692090075Sobrien /* This function is being processed in whole-function mode. */ 692190075Sobrien cfun->x_whole_function_mode_p = 1; 692218334Speter 692390075Sobrien /* Even though we're inside a function body, we still don't want to 692490075Sobrien call expand_expr to calculate the size of a variable-sized array. 692590075Sobrien We haven't necessarily assigned RTL to all variables yet, so it's 692690075Sobrien not safe to try to expand expressions involving them. */ 692790075Sobrien immediate_size_expand = 0; 692890075Sobrien cfun->x_dont_save_pending_sizes_p = 1; 692918334Speter 693090075Sobrien warn_shadow = saved_warn_shadow; 693118334Speter} 693218334Speter 693318334Speter/* Finish up a function declaration and compile that function 693418334Speter all the way to assembler language output. The free the storage 693518334Speter for the function definition. 693618334Speter 693718334Speter This is called after parsing the body of the function definition. 693818334Speter 693996263Sobrien NESTED is nonzero if the function being finished is nested in another. 694096263Sobrien CAN_DEFER_P is nonzero if the function may be deferred. */ 694118334Speter 694218334Spetervoid 694396263Sobrienfinish_function (nested, can_defer_p) 694418334Speter int nested; 694596263Sobrien int can_defer_p; 694618334Speter{ 694790075Sobrien tree fndecl = current_function_decl; 694818334Speter 694996263Sobrien#if 0 695096263Sobrien /* This caused &foo to be of type ptr-to-const-function which then 695196263Sobrien got a warning when stored in a ptr-to-function variable. */ 695296263Sobrien TREE_READONLY (fndecl) = 1; 695396263Sobrien#endif 695418334Speter 695518334Speter poplevel (1, 0, 1); 695618334Speter BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; 695718334Speter 695818334Speter /* Must mark the RESULT_DECL as being in this function. */ 695918334Speter 696018334Speter DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; 696118334Speter 696218334Speter /* Obey `register' declarations if `setjmp' is called in this fn. */ 696318334Speter if (flag_traditional && current_function_calls_setjmp) 696418334Speter { 696518334Speter setjmp_protect (DECL_INITIAL (fndecl)); 696618334Speter setjmp_protect_args (); 696718334Speter } 696818334Speter 696990075Sobrien if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted) 697018334Speter { 697118334Speter if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl))) 697218334Speter != integer_type_node) 697350397Sobrien { 697452284Sobrien /* If warn_main is 1 (-Wmain) or 2 (-Wall), we have already warned. 697590075Sobrien If warn_main is -1 (-Wno-main) we don't want to be warned. */ 697650397Sobrien if (! warn_main) 697750397Sobrien pedwarn_with_decl (fndecl, "return type of `%s' is not `int'"); 697850397Sobrien } 697918334Speter else 698018334Speter { 698150397Sobrien#ifdef DEFAULT_MAIN_RETURN 698218334Speter /* Make it so that `main' always returns success by default. */ 698318334Speter DEFAULT_MAIN_RETURN; 698490075Sobrien#else 698590075Sobrien if (flag_isoc99) 698690075Sobrien c_expand_return (integer_zero_node); 698750397Sobrien#endif 698818334Speter } 698918334Speter } 699090075Sobrien 699190075Sobrien finish_fname_decls (); 699218334Speter 699390075Sobrien /* Tie off the statement tree for this function. */ 699490075Sobrien finish_stmt_tree (&DECL_SAVED_TREE (fndecl)); 699596263Sobrien 699696263Sobrien /* Complain if there's just no return statement. */ 699796263Sobrien if (warn_return_type 699896263Sobrien && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE 699996263Sobrien && !current_function_returns_value && !current_function_returns_null 700096263Sobrien /* Don't complain if we abort. */ 700196263Sobrien && !current_function_returns_abnormally 700296263Sobrien /* Don't warn for main(). */ 700396263Sobrien && !MAIN_NAME_P (DECL_NAME (fndecl)) 700496263Sobrien /* Or if they didn't actually specify a return type. */ 700596263Sobrien && !C_FUNCTION_IMPLICIT_INT (fndecl) 700696263Sobrien /* Normally, with -Wreturn-type, flow will complain. Unless we're an 700796263Sobrien inline function, as we might never be compiled separately. */ 700896263Sobrien && DECL_INLINE (fndecl)) 700996263Sobrien warning ("no return statement in function returning non-void"); 701096263Sobrien 701190075Sobrien /* Clear out memory we no longer need. */ 701290075Sobrien free_after_parsing (cfun); 701390075Sobrien /* Since we never call rest_of_compilation, we never clear 701490075Sobrien CFUN. Do so explicitly. */ 701590075Sobrien free_after_compilation (cfun); 701690075Sobrien cfun = NULL; 701790075Sobrien 701890075Sobrien if (! nested) 701990075Sobrien { 702090075Sobrien /* Generate RTL for the body of this function. */ 702196263Sobrien c_expand_body (fndecl, nested, can_defer_p); 702296263Sobrien 702390075Sobrien /* Let the error reporting routines know that we're outside a 702490075Sobrien function. For a nested function, this value is used in 702590075Sobrien pop_c_function_context and then reset via pop_function_context. */ 702690075Sobrien current_function_decl = NULL; 702790075Sobrien } 702890075Sobrien} 702990075Sobrien 703090075Sobrien/* Generate the RTL for a deferred function FNDECL. */ 703190075Sobrien 703290075Sobrienvoid 703390075Sobrienc_expand_deferred_function (fndecl) 703490075Sobrien tree fndecl; 703590075Sobrien{ 703690075Sobrien /* DECL_INLINE or DECL_RESULT might got cleared after the inline 703790075Sobrien function was deferred, e.g. in duplicate_decls. */ 703890075Sobrien if (DECL_INLINE (fndecl) && DECL_RESULT (fndecl)) 703990075Sobrien { 704090075Sobrien c_expand_body (fndecl, 0, 0); 704190075Sobrien current_function_decl = NULL; 704290075Sobrien } 704390075Sobrien} 704490075Sobrien 704590075Sobrien/* Generate the RTL for the body of FNDECL. If NESTED_P is non-zero, 704690075Sobrien then we are already in the process of generating RTL for another 704790075Sobrien function. If can_defer_p is zero, we won't attempt to defer the 704890075Sobrien generation of RTL. */ 704990075Sobrien 705090075Sobrienstatic void 705190075Sobrienc_expand_body (fndecl, nested_p, can_defer_p) 705290075Sobrien tree fndecl; 705390075Sobrien int nested_p, can_defer_p; 705490075Sobrien{ 705590075Sobrien int uninlinable = 1; 705690075Sobrien 705790075Sobrien /* There's no reason to do any of the work here if we're only doing 705890075Sobrien semantic analysis; this code just generates RTL. */ 705990075Sobrien if (flag_syntax_only) 706090075Sobrien return; 706190075Sobrien 706290075Sobrien if (flag_inline_trees) 706390075Sobrien { 706490075Sobrien /* First, cache whether the current function is inlinable. Some 706590075Sobrien predicates depend on cfun and current_function_decl to 706690075Sobrien function completely. */ 706790075Sobrien timevar_push (TV_INTEGRATION); 706890075Sobrien uninlinable = ! tree_inlinable_function_p (fndecl); 706990075Sobrien 707090075Sobrien if (! uninlinable && can_defer_p 707190075Sobrien /* Save function tree for inlining. Should return 0 if the 707290075Sobrien language does not support function deferring or the 707390075Sobrien function could not be deferred. */ 707490075Sobrien && defer_fn (fndecl)) 707590075Sobrien { 707690075Sobrien /* Let the back-end know that this function exists. */ 707790075Sobrien (*debug_hooks->deferred_inline_function) (fndecl); 707890075Sobrien timevar_pop (TV_INTEGRATION); 707990075Sobrien return; 708090075Sobrien } 708190075Sobrien 708290075Sobrien /* Then, inline any functions called in it. */ 708390075Sobrien optimize_inline_calls (fndecl); 708490075Sobrien timevar_pop (TV_INTEGRATION); 708590075Sobrien } 708690075Sobrien 708790075Sobrien timevar_push (TV_EXPAND); 708890075Sobrien 708990075Sobrien if (nested_p) 709090075Sobrien { 709190075Sobrien /* Make sure that we will evaluate variable-sized types involved 709290075Sobrien in our function's type. */ 709390075Sobrien expand_pending_sizes (DECL_LANG_SPECIFIC (fndecl)->pending_sizes); 709490075Sobrien /* Squirrel away our current state. */ 709590075Sobrien push_function_context (); 709690075Sobrien } 709790075Sobrien 709890075Sobrien /* Initialize the RTL code for the function. */ 709990075Sobrien current_function_decl = fndecl; 710090075Sobrien input_filename = DECL_SOURCE_FILE (fndecl); 710190075Sobrien init_function_start (fndecl, input_filename, DECL_SOURCE_LINE (fndecl)); 710290075Sobrien 710390075Sobrien /* This function is being processed in whole-function mode. */ 710490075Sobrien cfun->x_whole_function_mode_p = 1; 710590075Sobrien 710690075Sobrien /* Even though we're inside a function body, we still don't want to 710790075Sobrien call expand_expr to calculate the size of a variable-sized array. 710890075Sobrien We haven't necessarily assigned RTL to all variables yet, so it's 710990075Sobrien not safe to try to expand expressions involving them. */ 711090075Sobrien immediate_size_expand = 0; 711190075Sobrien cfun->x_dont_save_pending_sizes_p = 1; 711290075Sobrien 711390075Sobrien /* If this is a varargs function, inform function.c. */ 711490075Sobrien if (c_function_varargs) 711590075Sobrien mark_varargs (); 711690075Sobrien 711790075Sobrien /* Set up parameters and prepare for return, for the function. */ 711890075Sobrien expand_function_start (fndecl, 0); 711990075Sobrien 712090075Sobrien /* If this function is `main', emit a call to `__main' 712190075Sobrien to run global initializers, etc. */ 712290075Sobrien if (DECL_NAME (fndecl) 712390075Sobrien && MAIN_NAME_P (DECL_NAME (fndecl)) 712490075Sobrien && DECL_CONTEXT (fndecl) == NULL_TREE) 712590075Sobrien expand_main_function (); 712690075Sobrien 712790075Sobrien /* Generate the RTL for this function. */ 712890075Sobrien expand_stmt (DECL_SAVED_TREE (fndecl)); 712990075Sobrien if (uninlinable) 713090075Sobrien { 713190075Sobrien /* Allow the body of the function to be garbage collected. */ 713290075Sobrien DECL_SAVED_TREE (fndecl) = NULL_TREE; 713390075Sobrien } 713490075Sobrien 713590075Sobrien /* We hard-wired immediate_size_expand to zero above. 713690075Sobrien expand_function_end will decrement this variable. So, we set the 713790075Sobrien variable to one here, so that after the decrement it will remain 713890075Sobrien zero. */ 713990075Sobrien immediate_size_expand = 1; 714090075Sobrien 714190075Sobrien /* Allow language dialects to perform special processing. */ 714290075Sobrien if (lang_expand_function_end) 714390075Sobrien (*lang_expand_function_end) (); 714490075Sobrien 714518334Speter /* Generate rtl for function exit. */ 714618334Speter expand_function_end (input_filename, lineno, 0); 714718334Speter 714890075Sobrien /* If this is a nested function, protect the local variables in the stack 714990075Sobrien above us from being collected while we're compiling this function. */ 715090075Sobrien if (nested_p) 715190075Sobrien ggc_push_context (); 715218334Speter 715318334Speter /* Run the optimizers and output the assembler code for this function. */ 715418334Speter rest_of_compilation (fndecl); 715518334Speter 715690075Sobrien /* Undo the GC context switch. */ 715790075Sobrien if (nested_p) 715890075Sobrien ggc_pop_context (); 715918334Speter 716018334Speter /* With just -W, complain only if function returns both with 716118334Speter and without a value. */ 716290075Sobrien if (extra_warnings 716390075Sobrien && current_function_returns_value 716490075Sobrien && current_function_returns_null) 716518334Speter warning ("this function may return with or without a value"); 716618334Speter 716718334Speter /* If requested, warn about function definitions where the function will 716818334Speter return a value (usually of some struct or union type) which itself will 716918334Speter take up a lot of stack space. */ 717018334Speter 717118334Speter if (warn_larger_than && !DECL_EXTERNAL (fndecl) && TREE_TYPE (fndecl)) 717218334Speter { 717390075Sobrien tree ret_type = TREE_TYPE (TREE_TYPE (fndecl)); 717418334Speter 717590075Sobrien if (ret_type && TYPE_SIZE_UNIT (ret_type) 717690075Sobrien && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST 717790075Sobrien && 0 < compare_tree_int (TYPE_SIZE_UNIT (ret_type), 717890075Sobrien larger_than_size)) 717918334Speter { 718090075Sobrien unsigned int size_as_int 718190075Sobrien = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type)); 718218334Speter 718390075Sobrien if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0) 718490075Sobrien warning_with_decl (fndecl, 718590075Sobrien "size of return value of `%s' is %u bytes", 718690075Sobrien size_as_int); 718790075Sobrien else 718890075Sobrien warning_with_decl (fndecl, 718990075Sobrien "size of return value of `%s' is larger than %d bytes", 719090075Sobrien larger_than_size); 719118334Speter } 719218334Speter } 719318334Speter 719490075Sobrien if (DECL_SAVED_INSNS (fndecl) == 0 && ! nested_p 719590075Sobrien && ! flag_inline_trees) 719618334Speter { 719790075Sobrien /* Stop pointing to the local nodes about to be freed. 719890075Sobrien But DECL_INITIAL must remain nonzero so we know this 719990075Sobrien was an actual function definition. 720090075Sobrien For a nested function, this is done in pop_c_function_context. 720190075Sobrien If rest_of_compilation set this to 0, leave it 0. */ 720218334Speter if (DECL_INITIAL (fndecl) != 0) 720318334Speter DECL_INITIAL (fndecl) = error_mark_node; 720490075Sobrien 720518334Speter DECL_ARGUMENTS (fndecl) = 0; 720618334Speter } 720718334Speter 720818334Speter if (DECL_STATIC_CONSTRUCTOR (fndecl)) 720918334Speter { 721090075Sobrien if (targetm.have_ctors_dtors) 721190075Sobrien (* targetm.asm_out.constructor) (XEXP (DECL_RTL (fndecl), 0), 721290075Sobrien DEFAULT_INIT_PRIORITY); 721318334Speter else 721490075Sobrien static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors); 721518334Speter } 721690075Sobrien 721718334Speter if (DECL_STATIC_DESTRUCTOR (fndecl)) 721818334Speter { 721990075Sobrien if (targetm.have_ctors_dtors) 722090075Sobrien (* targetm.asm_out.destructor) (XEXP (DECL_RTL (fndecl), 0), 722190075Sobrien DEFAULT_INIT_PRIORITY); 722218334Speter else 722390075Sobrien static_dtors = tree_cons (NULL_TREE, fndecl, static_dtors); 722418334Speter } 722518334Speter 722690075Sobrien if (nested_p) 722790075Sobrien /* Return to the enclosing function. */ 722890075Sobrien pop_function_context (); 722990075Sobrien timevar_pop (TV_EXPAND); 723090075Sobrien} 723190075Sobrien 723290075Sobrien/* Check the declarations given in a for-loop for satisfying the C99 723390075Sobrien constraints. */ 723490075Sobrienvoid 723590075Sobriencheck_for_loop_decls () 723690075Sobrien{ 723790075Sobrien tree t; 723890075Sobrien 723990075Sobrien if (!flag_isoc99) 724018334Speter { 724190075Sobrien /* If we get here, declarations have been used in a for loop without 724290075Sobrien the C99 for loop scope. This doesn't make much sense, so don't 724390075Sobrien allow it. */ 724490075Sobrien error ("`for' loop initial declaration used outside C99 mode"); 724590075Sobrien return; 724618334Speter } 724790075Sobrien /* C99 subclause 6.8.5 paragraph 3: 724890075Sobrien 724990075Sobrien [#3] The declaration part of a for statement shall only 725090075Sobrien declare identifiers for objects having storage class auto or 725190075Sobrien register. 725290075Sobrien 725390075Sobrien It isn't clear whether, in this sentence, "identifiers" binds to 725490075Sobrien "shall only declare" or to "objects" - that is, whether all identifiers 725590075Sobrien declared must be identifiers for objects, or whether the restriction 725690075Sobrien only applies to those that are. (A question on this in comp.std.c 725790075Sobrien in November 2000 received no answer.) We implement the strictest 725890075Sobrien interpretation, to avoid creating an extension which later causes 725990075Sobrien problems. */ 726090075Sobrien 726190075Sobrien for (t = gettags (); t; t = TREE_CHAIN (t)) 726290075Sobrien { 726390075Sobrien if (TREE_PURPOSE (t) != 0) 726490075Sobrien { 726590075Sobrien enum tree_code code = TREE_CODE (TREE_VALUE (t)); 726690075Sobrien 726790075Sobrien if (code == RECORD_TYPE) 726890075Sobrien error ("`struct %s' declared in `for' loop initial declaration", 726990075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (t))); 727090075Sobrien else if (code == UNION_TYPE) 727190075Sobrien error ("`union %s' declared in `for' loop initial declaration", 727290075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (t))); 727390075Sobrien else 727490075Sobrien error ("`enum %s' declared in `for' loop initial declaration", 727590075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (t))); 727690075Sobrien } 727790075Sobrien } 727890075Sobrien 727990075Sobrien for (t = getdecls (); t; t = TREE_CHAIN (t)) 728090075Sobrien { 728190075Sobrien if (TREE_CODE (t) != VAR_DECL && DECL_NAME (t)) 728290075Sobrien error_with_decl (t, "declaration of non-variable `%s' in `for' loop initial declaration"); 728390075Sobrien else if (TREE_STATIC (t)) 728490075Sobrien error_with_decl (t, "declaration of static variable `%s' in `for' loop initial declaration"); 728590075Sobrien else if (DECL_EXTERNAL (t)) 728690075Sobrien error_with_decl (t, "declaration of `extern' variable `%s' in `for' loop initial declaration"); 728790075Sobrien } 728818334Speter} 728918334Speter 729018334Speter/* Save and restore the variables in this file and elsewhere 729118334Speter that keep track of the progress of compilation of the current function. 729218334Speter Used for nested functions. */ 729318334Speter 729490075Sobrienstruct c_language_function 729518334Speter{ 729690075Sobrien struct language_function base; 729718334Speter tree named_labels; 729818334Speter tree shadowed_labels; 729918334Speter int returns_value; 730018334Speter int returns_null; 730196263Sobrien int returns_abnormally; 730218334Speter int warn_about_return_type; 730318334Speter int extern_inline; 730418334Speter struct binding_level *binding_level; 730518334Speter}; 730618334Speter 730718334Speter/* Save and reinitialize the variables 730818334Speter used during compilation of a C function. */ 730918334Speter 731018334Spetervoid 731190075Sobrienpush_c_function_context (f) 731290075Sobrien struct function *f; 731318334Speter{ 731490075Sobrien struct c_language_function *p; 731590075Sobrien p = ((struct c_language_function *) 731690075Sobrien xmalloc (sizeof (struct c_language_function))); 731790075Sobrien f->language = (struct language_function *) p; 731818334Speter 731990075Sobrien p->base.x_stmt_tree = c_stmt_tree; 732090075Sobrien p->base.x_scope_stmt_stack = c_scope_stmt_stack; 732118334Speter p->named_labels = named_labels; 732218334Speter p->shadowed_labels = shadowed_labels; 732318334Speter p->returns_value = current_function_returns_value; 732418334Speter p->returns_null = current_function_returns_null; 732596263Sobrien p->returns_abnormally = current_function_returns_abnormally; 732618334Speter p->warn_about_return_type = warn_about_return_type; 732718334Speter p->extern_inline = current_extern_inline; 732818334Speter p->binding_level = current_binding_level; 732918334Speter} 733018334Speter 733118334Speter/* Restore the variables used during compilation of a C function. */ 733218334Speter 733318334Spetervoid 733490075Sobrienpop_c_function_context (f) 733590075Sobrien struct function *f; 733618334Speter{ 733790075Sobrien struct c_language_function *p 733890075Sobrien = (struct c_language_function *) f->language; 733918334Speter tree link; 734018334Speter 734118334Speter /* Bring back all the labels that were shadowed. */ 734218334Speter for (link = shadowed_labels; link; link = TREE_CHAIN (link)) 734318334Speter if (DECL_NAME (TREE_VALUE (link)) != 0) 734418334Speter IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) 734518334Speter = TREE_VALUE (link); 734618334Speter 734790075Sobrien if (DECL_SAVED_INSNS (current_function_decl) == 0 734890075Sobrien && DECL_SAVED_TREE (current_function_decl) == NULL_TREE) 734918334Speter { 735018334Speter /* Stop pointing to the local nodes about to be freed. */ 735118334Speter /* But DECL_INITIAL must remain nonzero so we know this 735218334Speter was an actual function definition. */ 735318334Speter DECL_INITIAL (current_function_decl) = error_mark_node; 735418334Speter DECL_ARGUMENTS (current_function_decl) = 0; 735518334Speter } 735618334Speter 735790075Sobrien c_stmt_tree = p->base.x_stmt_tree; 735890075Sobrien c_scope_stmt_stack = p->base.x_scope_stmt_stack; 735918334Speter named_labels = p->named_labels; 736018334Speter shadowed_labels = p->shadowed_labels; 736118334Speter current_function_returns_value = p->returns_value; 736218334Speter current_function_returns_null = p->returns_null; 736396263Sobrien current_function_returns_abnormally = p->returns_abnormally; 736418334Speter warn_about_return_type = p->warn_about_return_type; 736518334Speter current_extern_inline = p->extern_inline; 736618334Speter current_binding_level = p->binding_level; 736718334Speter 736818334Speter free (p); 736990075Sobrien f->language = 0; 737018334Speter} 737118334Speter 737290075Sobrien/* Mark the language specific parts of F for GC. */ 737318334Speter 737418334Spetervoid 737590075Sobrienmark_c_function_context (f) 737690075Sobrien struct function *f; 737790075Sobrien{ 737890075Sobrien struct c_language_function *p 737990075Sobrien = (struct c_language_function *) f->language; 738090075Sobrien 738190075Sobrien if (p == 0) 738290075Sobrien return; 738390075Sobrien 738490075Sobrien mark_c_language_function (&p->base); 738590075Sobrien ggc_mark_tree (p->shadowed_labels); 738690075Sobrien ggc_mark_tree (p->named_labels); 738790075Sobrien mark_binding_level (&p->binding_level); 738890075Sobrien} 738990075Sobrien 739090075Sobrien/* Copy the DECL_LANG_SPECIFIC data associated with NODE. */ 739190075Sobrien 739290075Sobrienvoid 739390075Sobriencopy_lang_decl (decl) 739490075Sobrien tree decl; 739590075Sobrien{ 739690075Sobrien struct lang_decl *ld; 739790075Sobrien 739890075Sobrien if (!DECL_LANG_SPECIFIC (decl)) 739990075Sobrien return; 740090075Sobrien 740190075Sobrien ld = (struct lang_decl *) ggc_alloc (sizeof (struct lang_decl)); 740290075Sobrien memcpy ((char *) ld, (char *) DECL_LANG_SPECIFIC (decl), 740390075Sobrien sizeof (struct lang_decl)); 740490075Sobrien DECL_LANG_SPECIFIC (decl) = ld; 740590075Sobrien} 740690075Sobrien 740790075Sobrien/* Mark the language specific bits in T for GC. */ 740890075Sobrien 740990075Sobrienvoid 741090075Sobrienlang_mark_tree (t) 741190075Sobrien tree t; 741290075Sobrien{ 741390075Sobrien if (TREE_CODE (t) == IDENTIFIER_NODE) 741490075Sobrien { 741590075Sobrien struct lang_identifier *i = (struct lang_identifier *) t; 741690075Sobrien ggc_mark_tree (i->global_value); 741790075Sobrien ggc_mark_tree (i->local_value); 741890075Sobrien ggc_mark_tree (i->label_value); 741990075Sobrien ggc_mark_tree (i->implicit_decl); 742090075Sobrien ggc_mark_tree (i->error_locus); 742190075Sobrien ggc_mark_tree (i->limbo_value); 742290075Sobrien } 742390075Sobrien else if (TYPE_P (t) && TYPE_LANG_SPECIFIC (t)) 742490075Sobrien ggc_mark (TYPE_LANG_SPECIFIC (t)); 742590075Sobrien else if (DECL_P (t) && DECL_LANG_SPECIFIC (t)) 742690075Sobrien { 742790075Sobrien ggc_mark (DECL_LANG_SPECIFIC (t)); 742890075Sobrien c_mark_lang_decl (&DECL_LANG_SPECIFIC (t)->base); 742990075Sobrien ggc_mark_tree (DECL_LANG_SPECIFIC (t)->pending_sizes); 743090075Sobrien } 743190075Sobrien} 743290075Sobrien 743390075Sobrien/* The functions below are required for functionality of doing 743490075Sobrien function at once processing in the C front end. Currently these 743590075Sobrien functions are not called from anywhere in the C front end, but as 743690075Sobrien these changes continue, that will change. */ 743790075Sobrien 743890075Sobrien/* Returns non-zero if the current statement is a full expression, 743990075Sobrien i.e. temporaries created during that statement should be destroyed 744090075Sobrien at the end of the statement. */ 744190075Sobrien 744290075Sobrienint 744390075Sobrienstmts_are_full_exprs_p () 744490075Sobrien{ 744590075Sobrien return 0; 744690075Sobrien} 744790075Sobrien 744890075Sobrien/* Returns the stmt_tree (if any) to which statements are currently 744990075Sobrien being added. If there is no active statement-tree, NULL is 745090075Sobrien returned. */ 745190075Sobrien 745290075Sobrienstmt_tree 745390075Sobriencurrent_stmt_tree () 745490075Sobrien{ 745590075Sobrien return &c_stmt_tree; 745690075Sobrien} 745790075Sobrien 745890075Sobrien/* Returns the stack of SCOPE_STMTs for the current function. */ 745990075Sobrien 746090075Sobrientree * 746190075Sobriencurrent_scope_stmt_stack () 746290075Sobrien{ 746390075Sobrien return &c_scope_stmt_stack; 746490075Sobrien} 746590075Sobrien 746690075Sobrien/* Nonzero if TYPE is an anonymous union or struct type. Always 0 in 746790075Sobrien C. */ 746890075Sobrien 746990075Sobrienint 747090075Sobrienanon_aggr_type_p (node) 747150397Sobrien tree node ATTRIBUTE_UNUSED; 747218334Speter{ 747390075Sobrien return 0; 747418334Speter} 747590075Sobrien 747690075Sobrien/* Dummy function in place of callback used by C++. */ 747790075Sobrien 747890075Sobrienvoid 747990075Sobrienextract_interface_info () 748090075Sobrien{ 748190075Sobrien} 748290075Sobrien 748390075Sobrien/* Return a new COMPOUND_STMT, after adding it to the current 748490075Sobrien statement tree. */ 748590075Sobrien 748690075Sobrientree 748790075Sobrienc_begin_compound_stmt () 748890075Sobrien{ 748990075Sobrien tree stmt; 749090075Sobrien 749190075Sobrien /* Create the COMPOUND_STMT. */ 749290075Sobrien stmt = add_stmt (build_stmt (COMPOUND_STMT, NULL_TREE)); 749390075Sobrien 749490075Sobrien return stmt; 749590075Sobrien} 749690075Sobrien 749790075Sobrien/* Expand T (a DECL_STMT) if it declares an entity not handled by the 749890075Sobrien common code. */ 749990075Sobrien 750090075Sobrienvoid 750190075Sobrienc_expand_decl_stmt (t) 750290075Sobrien tree t; 750390075Sobrien{ 750490075Sobrien tree decl = DECL_STMT_DECL (t); 750590075Sobrien 750690075Sobrien /* Expand nested functions. */ 750790075Sobrien if (TREE_CODE (decl) == FUNCTION_DECL 750890075Sobrien && DECL_CONTEXT (decl) == current_function_decl 750990075Sobrien && DECL_SAVED_TREE (decl)) 751090075Sobrien c_expand_body (decl, /*nested_p=*/1, /*can_defer_p=*/0); 751190075Sobrien} 751290075Sobrien 751390075Sobrien/* Return the IDENTIFIER_GLOBAL_VALUE of T, for use in common code, since 751490075Sobrien the definition of IDENTIFIER_GLOBAL_VALUE is different for C and C++. */ 751590075Sobrien 751690075Sobrientree 751790075Sobrienidentifier_global_value (t) 751890075Sobrien tree t; 751990075Sobrien{ 752090075Sobrien return IDENTIFIER_GLOBAL_VALUE (t); 752190075Sobrien} 752290075Sobrien 752390075Sobrien/* Record a builtin type for C. If NAME is non-NULL, it is the name used; 752490075Sobrien otherwise the name is found in ridpointers from RID_INDEX. */ 752590075Sobrien 752690075Sobrienvoid 752790075Sobrienrecord_builtin_type (rid_index, name, type) 752890075Sobrien enum rid rid_index; 752990075Sobrien const char *name; 753090075Sobrien tree type; 753190075Sobrien{ 753290075Sobrien tree id; 753390075Sobrien if (name == 0) 753490075Sobrien id = ridpointers[(int) rid_index]; 753590075Sobrien else 753690075Sobrien id = get_identifier (name); 753790075Sobrien pushdecl (build_decl (TYPE_DECL, id, type)); 753890075Sobrien} 753990075Sobrien 754090075Sobrien/* Build the void_list_node (void_type_node having been created). */ 754190075Sobrientree 754290075Sobrienbuild_void_list_node () 754390075Sobrien{ 754490075Sobrien tree t = build_tree_list (NULL_TREE, void_type_node); 754590075Sobrien return t; 754690075Sobrien} 7547