c-decl.c revision 104761
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 104761 2002-10-10 04:46:44Z 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: 3521104761Skan error ("typedef `%s' is initialized", 3522104761Skan IDENTIFIER_POINTER (DECL_NAME (decl))); 3523104761Skan initialized = 0; 352418334Speter break; 352518334Speter 352618334Speter case FUNCTION_DECL: 352718334Speter error ("function `%s' is initialized like a variable", 352818334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 352918334Speter initialized = 0; 353018334Speter break; 353118334Speter 353218334Speter case PARM_DECL: 353318334Speter /* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. */ 353418334Speter error ("parameter `%s' is initialized", 353518334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 353618334Speter initialized = 0; 353718334Speter break; 353818334Speter 353918334Speter default: 354018334Speter /* Don't allow initializations for incomplete types 354118334Speter except for arrays which might be completed by the initialization. */ 354290075Sobrien 354390075Sobrien /* This can happen if the array size is an undefined macro. We already 354490075Sobrien gave a warning, so we don't need another one. */ 354590075Sobrien if (TREE_TYPE (decl) == error_mark_node) 354690075Sobrien initialized = 0; 354790075Sobrien else if (COMPLETE_TYPE_P (TREE_TYPE (decl))) 354818334Speter { 354918334Speter /* A complete type is ok if size is fixed. */ 355018334Speter 355118334Speter if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST 355218334Speter || C_DECL_VARIABLE_SIZE (decl)) 355318334Speter { 355418334Speter error ("variable-sized object may not be initialized"); 355518334Speter initialized = 0; 355618334Speter } 355718334Speter } 355818334Speter else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE) 355918334Speter { 356018334Speter error ("variable `%s' has initializer but incomplete type", 356118334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 356218334Speter initialized = 0; 356318334Speter } 356490075Sobrien else if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) 356518334Speter { 356618334Speter error ("elements of array `%s' have incomplete type", 356718334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 356818334Speter initialized = 0; 356918334Speter } 357018334Speter } 357118334Speter 357218334Speter if (initialized) 357318334Speter { 357490075Sobrien#if 0 357590075Sobrien /* Seems redundant with grokdeclarator. */ 357618334Speter if (current_binding_level != global_binding_level 357718334Speter && DECL_EXTERNAL (decl) 357818334Speter && TREE_CODE (decl) != FUNCTION_DECL) 357918334Speter warning ("declaration of `%s' has `extern' and is initialized", 358018334Speter IDENTIFIER_POINTER (DECL_NAME (decl))); 358118334Speter#endif 358218334Speter DECL_EXTERNAL (decl) = 0; 358318334Speter if (current_binding_level == global_binding_level) 358418334Speter TREE_STATIC (decl) = 1; 358518334Speter 358618334Speter /* Tell `pushdecl' this is an initialized decl 358718334Speter even though we don't yet have the initializer expression. 358818334Speter Also tell `finish_decl' it may store the real initializer. */ 358918334Speter DECL_INITIAL (decl) = error_mark_node; 359018334Speter } 359118334Speter 359218334Speter /* If this is a function declaration, write a record describing it to the 359318334Speter prototypes file (if requested). */ 359418334Speter 359518334Speter if (TREE_CODE (decl) == FUNCTION_DECL) 359618334Speter gen_aux_info_record (decl, 0, 0, TYPE_ARG_TYPES (TREE_TYPE (decl)) != 0); 359718334Speter 359850397Sobrien /* ANSI specifies that a tentative definition which is not merged with 359950397Sobrien a non-tentative definition behaves exactly like a definition with an 360050397Sobrien initializer equal to zero. (Section 3.7.2) 360150397Sobrien -fno-common gives strict ANSI behavior. Usually you don't want it. 360250397Sobrien This matters only for variables with external linkage. */ 360350397Sobrien if (! flag_no_common || ! TREE_PUBLIC (decl)) 360450397Sobrien DECL_COMMON (decl) = 1; 360518334Speter 360618334Speter /* Set attributes here so if duplicate decl, will have proper attributes. */ 360790075Sobrien decl_attributes (&decl, attributes, 0); 360818334Speter 360996263Sobrien /* If #pragma weak was used, mark the decl weak now. */ 361096263Sobrien if (current_binding_level == global_binding_level) 361196263Sobrien maybe_apply_pragma_weak (decl); 361296263Sobrien 361390075Sobrien if (TREE_CODE (decl) == FUNCTION_DECL 361490075Sobrien && DECL_DECLARED_INLINE_P (decl) 361590075Sobrien && DECL_UNINLINABLE (decl) 361690075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl))) 361790075Sobrien warning_with_decl (decl, 361890075Sobrien "inline function `%s' given attribute noinline"); 361990075Sobrien 362018334Speter /* Add this decl to the current binding level. 362118334Speter TEM may equal DECL or it may be a previous decl of the same name. */ 362218334Speter tem = pushdecl (decl); 362318334Speter 362418334Speter /* For a local variable, define the RTL now. */ 362518334Speter if (current_binding_level != global_binding_level 362618334Speter /* But not if this is a duplicate decl 362718334Speter and we preserved the rtl from the previous one 362818334Speter (which may or may not happen). */ 362990075Sobrien && !DECL_RTL_SET_P (tem) 363090075Sobrien && !DECL_CONTEXT (tem)) 363118334Speter { 363290075Sobrien if (TREE_TYPE (tem) != error_mark_node 363390075Sobrien && COMPLETE_TYPE_P (TREE_TYPE (tem))) 363418334Speter expand_decl (tem); 363518334Speter else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE 363618334Speter && DECL_INITIAL (tem) != 0) 363718334Speter expand_decl (tem); 363818334Speter } 363918334Speter 364018334Speter return tem; 364118334Speter} 364218334Speter 364318334Speter/* Finish processing of a declaration; 364418334Speter install its initial value. 364518334Speter If the length of an array type is not known before, 364618334Speter it must be determined now, from the initial value, or it is an error. */ 364718334Speter 364818334Spetervoid 364918334Speterfinish_decl (decl, init, asmspec_tree) 365018334Speter tree decl, init; 365118334Speter tree asmspec_tree; 365218334Speter{ 365390075Sobrien tree type = TREE_TYPE (decl); 365418334Speter int was_incomplete = (DECL_SIZE (decl) == 0); 365590075Sobrien const char *asmspec = 0; 365618334Speter 365790075Sobrien /* If a name was specified, get the string. */ 365896263Sobrien if (current_binding_level == global_binding_level) 365996263Sobrien asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree); 366018334Speter if (asmspec_tree) 366118334Speter asmspec = TREE_STRING_POINTER (asmspec_tree); 366218334Speter 366318334Speter /* If `start_decl' didn't like having an initialization, ignore it now. */ 366418334Speter if (init != 0 && DECL_INITIAL (decl) == 0) 366518334Speter init = 0; 366690075Sobrien 366718334Speter /* Don't crash if parm is initialized. */ 366818334Speter if (TREE_CODE (decl) == PARM_DECL) 366918334Speter init = 0; 367018334Speter 367118334Speter if (init) 3672104761Skan store_init_value (decl, init); 367318334Speter 367418334Speter /* Deduce size of array from initialization, if not already known */ 367518334Speter if (TREE_CODE (type) == ARRAY_TYPE 367618334Speter && TYPE_DOMAIN (type) == 0 367718334Speter && TREE_CODE (decl) != TYPE_DECL) 367818334Speter { 367918334Speter int do_default 368018334Speter = (TREE_STATIC (decl) 368118334Speter /* Even if pedantic, an external linkage array 368218334Speter may have incomplete type at first. */ 368318334Speter ? pedantic && !TREE_PUBLIC (decl) 368418334Speter : !DECL_EXTERNAL (decl)); 368518334Speter int failure 368618334Speter = complete_array_type (type, DECL_INITIAL (decl), do_default); 368718334Speter 368818334Speter /* Get the completed type made by complete_array_type. */ 368918334Speter type = TREE_TYPE (decl); 369018334Speter 369118334Speter if (failure == 1) 369218334Speter error_with_decl (decl, "initializer fails to determine size of `%s'"); 369318334Speter 369490075Sobrien else if (failure == 2) 369518334Speter { 369618334Speter if (do_default) 369718334Speter error_with_decl (decl, "array size missing in `%s'"); 369818334Speter /* If a `static' var's size isn't known, 369918334Speter make it extern as well as static, so it does not get 370018334Speter allocated. 370118334Speter If it is not `static', then do not mark extern; 370218334Speter finish_incomplete_decl will give it a default size 370318334Speter and it will get allocated. */ 370418334Speter else if (!pedantic && TREE_STATIC (decl) && ! TREE_PUBLIC (decl)) 370518334Speter DECL_EXTERNAL (decl) = 1; 370618334Speter } 370718334Speter 370818334Speter /* TYPE_MAX_VALUE is always one less than the number of elements 370918334Speter in the array, because we start counting at zero. Therefore, 371018334Speter warn only if the value is less than zero. */ 371190075Sobrien else if (pedantic && TYPE_DOMAIN (type) != 0 371290075Sobrien && tree_int_cst_sgn (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) < 0) 371318334Speter error_with_decl (decl, "zero or negative size array `%s'"); 371418334Speter 371518334Speter layout_decl (decl, 0); 371618334Speter } 371718334Speter 371818334Speter if (TREE_CODE (decl) == VAR_DECL) 371918334Speter { 372090075Sobrien if (DECL_SIZE (decl) == 0 && TREE_TYPE (decl) != error_mark_node 372190075Sobrien && COMPLETE_TYPE_P (TREE_TYPE (decl))) 372218334Speter layout_decl (decl, 0); 372318334Speter 372418334Speter if (DECL_SIZE (decl) == 0 372590075Sobrien /* Don't give an error if we already gave one earlier. */ 372690075Sobrien && TREE_TYPE (decl) != error_mark_node 372718334Speter && (TREE_STATIC (decl) 372818334Speter ? 372918334Speter /* A static variable with an incomplete type 373018334Speter is an error if it is initialized. 373118334Speter Also if it is not file scope. 373218334Speter Otherwise, let it through, but if it is not `extern' 373318334Speter then it may cause an error message later. */ 373450397Sobrien (DECL_INITIAL (decl) != 0 373590075Sobrien || DECL_CONTEXT (decl) != 0) 373618334Speter : 373718334Speter /* An automatic variable with an incomplete type 373818334Speter is an error. */ 373918334Speter !DECL_EXTERNAL (decl))) 374018334Speter { 374118334Speter error_with_decl (decl, "storage size of `%s' isn't known"); 374218334Speter TREE_TYPE (decl) = error_mark_node; 374318334Speter } 374418334Speter 374518334Speter if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl)) 374618334Speter && DECL_SIZE (decl) != 0) 374718334Speter { 374818334Speter if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) 374918334Speter constant_expression_warning (DECL_SIZE (decl)); 375018334Speter else 375118334Speter error_with_decl (decl, "storage size of `%s' isn't constant"); 375218334Speter } 375350397Sobrien 375490075Sobrien if (TREE_USED (type)) 375550397Sobrien TREE_USED (decl) = 1; 375618334Speter } 375718334Speter 375818334Speter /* If this is a function and an assembler name is specified, it isn't 375918334Speter builtin any more. Also reset DECL_RTL so we can give it its new 376018334Speter name. */ 376118334Speter if (TREE_CODE (decl) == FUNCTION_DECL && asmspec) 376290075Sobrien { 376390075Sobrien DECL_BUILT_IN_CLASS (decl) = NOT_BUILT_IN; 376490075Sobrien SET_DECL_RTL (decl, NULL_RTX); 376590075Sobrien SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec)); 376690075Sobrien } 376718334Speter 376818334Speter /* Output the assembler code and/or RTL code for variables and functions, 376918334Speter unless the type is an undefined structure or union. 377018334Speter If not, it will get done when the type is completed. */ 377118334Speter 377218334Speter if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL) 377318334Speter { 377490075Sobrien /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 377590075Sobrien maybe_objc_check_decl (decl); 377690075Sobrien 377790075Sobrien if (!DECL_CONTEXT (decl)) 377818334Speter { 377990075Sobrien if (DECL_INITIAL (decl) == NULL_TREE 378090075Sobrien || DECL_INITIAL (decl) == error_mark_node) 378190075Sobrien /* Don't output anything 378290075Sobrien when a tentative file-scope definition is seen. 378390075Sobrien But at end of compilation, do output code for them. */ 378490075Sobrien DECL_DEFER_OUTPUT (decl) = 1; 378550397Sobrien rest_of_decl_compilation (decl, asmspec, 378650397Sobrien (DECL_CONTEXT (decl) == 0 378790075Sobrien || TREE_ASM_WRITTEN (decl)), 0); 378818334Speter } 378918334Speter else 379018334Speter { 379190075Sobrien /* This is a local variable. If there is an ASMSPEC, the 379290075Sobrien user has requested that we handle it specially. */ 379390075Sobrien if (asmspec) 379490075Sobrien { 379590075Sobrien /* In conjunction with an ASMSPEC, the `register' 379690075Sobrien keyword indicates that we should place the variable 379790075Sobrien in a particular register. */ 379890075Sobrien if (DECL_REGISTER (decl)) 379990075Sobrien DECL_C_HARD_REGISTER (decl) = 1; 380090075Sobrien 380190075Sobrien /* If this is not a static variable, issue a warning. 380290075Sobrien It doesn't make any sense to give an ASMSPEC for an 380390075Sobrien ordinary, non-register local variable. Historically, 380490075Sobrien GCC has accepted -- but ignored -- the ASMSPEC in 380590075Sobrien this case. */ 380690075Sobrien if (TREE_CODE (decl) == VAR_DECL 380790075Sobrien && !DECL_REGISTER (decl) 380890075Sobrien && !TREE_STATIC (decl)) 380990075Sobrien warning_with_decl (decl, 381090075Sobrien "ignoring asm-specifier for non-static local variable `%s'"); 381190075Sobrien else 381290075Sobrien SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec)); 381390075Sobrien } 381490075Sobrien 381590075Sobrien if (TREE_CODE (decl) != FUNCTION_DECL) 381690075Sobrien add_decl_stmt (decl); 381718334Speter } 381890075Sobrien 381918334Speter if (DECL_CONTEXT (decl) != 0) 382018334Speter { 382118334Speter /* Recompute the RTL of a local array now 382218334Speter if it used to be an incomplete type. */ 382318334Speter if (was_incomplete 382418334Speter && ! TREE_STATIC (decl) && ! DECL_EXTERNAL (decl)) 382518334Speter { 382618334Speter /* If we used it already as memory, it must stay in memory. */ 382718334Speter TREE_ADDRESSABLE (decl) = TREE_USED (decl); 382818334Speter /* If it's still incomplete now, no init will save it. */ 382918334Speter if (DECL_SIZE (decl) == 0) 383018334Speter DECL_INITIAL (decl) = 0; 383118334Speter } 383218334Speter } 383318334Speter } 383418334Speter 383518334Speter if (TREE_CODE (decl) == TYPE_DECL) 383618334Speter { 383718334Speter /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 383818334Speter maybe_objc_check_decl (decl); 383990075Sobrien rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == 0, 0); 384018334Speter } 384118334Speter 384218334Speter /* At the end of a declaration, throw away any variable type sizes 384318334Speter of types defined inside that declaration. There is no use 384418334Speter computing them in the following function definition. */ 384518334Speter if (current_binding_level == global_binding_level) 384618334Speter get_pending_sizes (); 384718334Speter} 384818334Speter 384918334Speter/* If DECL has a cleanup, build and return that cleanup here. 385018334Speter This is a callback called by expand_expr. */ 385118334Speter 385218334Spetertree 385318334Spetermaybe_build_cleanup (decl) 385450397Sobrien tree decl ATTRIBUTE_UNUSED; 385518334Speter{ 385618334Speter /* There are no cleanups in C. */ 385718334Speter return NULL_TREE; 385818334Speter} 385918334Speter 386018334Speter/* Given a parsed parameter declaration, 386118334Speter decode it into a PARM_DECL and push that on the current binding level. 386218334Speter Also, for the sake of forward parm decls, 386318334Speter record the given order of parms in `parm_order'. */ 386418334Speter 386518334Spetervoid 386618334Speterpush_parm_decl (parm) 386718334Speter tree parm; 386818334Speter{ 386918334Speter tree decl; 387018334Speter int old_immediate_size_expand = immediate_size_expand; 387118334Speter /* Don't try computing parm sizes now -- wait till fn is called. */ 387218334Speter immediate_size_expand = 0; 387318334Speter 387418334Speter decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)), 387596263Sobrien TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0); 387690075Sobrien decl_attributes (&decl, TREE_VALUE (parm), 0); 387718334Speter 387818334Speter#if 0 387918334Speter if (DECL_NAME (decl)) 388018334Speter { 388118334Speter tree olddecl; 388218334Speter olddecl = lookup_name (DECL_NAME (decl)); 388318334Speter if (pedantic && olddecl != 0 && TREE_CODE (olddecl) == TYPE_DECL) 388490075Sobrien pedwarn_with_decl (decl, 388590075Sobrien "ISO C forbids parameter `%s' shadowing typedef"); 388618334Speter } 388718334Speter#endif 388818334Speter 388918334Speter decl = pushdecl (decl); 389018334Speter 389118334Speter immediate_size_expand = old_immediate_size_expand; 389218334Speter 389318334Speter current_binding_level->parm_order 389418334Speter = tree_cons (NULL_TREE, decl, current_binding_level->parm_order); 389518334Speter 389618334Speter /* Add this decl to the current binding level. */ 389718334Speter finish_decl (decl, NULL_TREE, NULL_TREE); 389818334Speter} 389918334Speter 390018334Speter/* Clear the given order of parms in `parm_order'. 390118334Speter Used at start of parm list, 390218334Speter and also at semicolon terminating forward decls. */ 390318334Speter 390418334Spetervoid 390518334Speterclear_parm_order () 390618334Speter{ 390718334Speter current_binding_level->parm_order = NULL_TREE; 390818334Speter} 390918334Speter 391090075Sobrien/* Build a COMPOUND_LITERAL_EXPR. TYPE is the type given in the compound 391190075Sobrien literal, which may be an incomplete array type completed by the 391290075Sobrien initializer; INIT is a CONSTRUCTOR that initializes the compound 391390075Sobrien literal. */ 391490075Sobrien 391590075Sobrientree 391690075Sobrienbuild_compound_literal (type, init) 391790075Sobrien tree type; 391890075Sobrien tree init; 391990075Sobrien{ 392090075Sobrien /* We do not use start_decl here because we have a type, not a declarator; 392190075Sobrien and do not use finish_decl because the decl should be stored inside 392290075Sobrien the COMPOUND_LITERAL_EXPR rather than added elsewhere as a DECL_STMT. */ 392390075Sobrien tree decl = build_decl (VAR_DECL, NULL_TREE, type); 392490075Sobrien tree complit; 392590075Sobrien tree stmt; 392690075Sobrien DECL_EXTERNAL (decl) = 0; 392790075Sobrien TREE_PUBLIC (decl) = 0; 392890075Sobrien TREE_STATIC (decl) = (current_binding_level == global_binding_level); 392990075Sobrien DECL_CONTEXT (decl) = current_function_decl; 393090075Sobrien TREE_USED (decl) = 1; 393190075Sobrien TREE_TYPE (decl) = type; 3932102790Skan TREE_READONLY (decl) = TREE_READONLY (type); 393390075Sobrien store_init_value (decl, init); 393490075Sobrien 393590075Sobrien if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type)) 393690075Sobrien { 393790075Sobrien int failure = complete_array_type (type, DECL_INITIAL (decl), 1); 393890075Sobrien if (failure) 393990075Sobrien abort (); 394090075Sobrien } 394190075Sobrien 394290075Sobrien type = TREE_TYPE (decl); 394390075Sobrien if (type == error_mark_node || !COMPLETE_TYPE_P (type)) 394490075Sobrien return error_mark_node; 394590075Sobrien 394690075Sobrien stmt = build_stmt (DECL_STMT, decl); 394790075Sobrien complit = build1 (COMPOUND_LITERAL_EXPR, TREE_TYPE (decl), stmt); 394890075Sobrien TREE_SIDE_EFFECTS (complit) = 1; 394990075Sobrien 395090075Sobrien layout_decl (decl, 0); 395190075Sobrien 395290075Sobrien if (TREE_STATIC (decl)) 395390075Sobrien { 395490075Sobrien /* This decl needs a name for the assembler output. We also need 3955102790Skan a unique suffix to be added to the name. */ 3956102790Skan char *name; 3957102790Skan extern int var_labelno; 3958102790Skan 3959102790Skan ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal", var_labelno); 3960102790Skan var_labelno++; 3961102790Skan DECL_NAME (decl) = get_identifier (name); 3962102790Skan DECL_DEFER_OUTPUT (decl) = 1; 3963102790Skan DECL_COMDAT (decl) = 1; 3964102790Skan DECL_ARTIFICIAL (decl) = 1; 3965102790Skan pushdecl (decl); 396690075Sobrien rest_of_decl_compilation (decl, NULL, 1, 0); 396790075Sobrien } 396890075Sobrien 396990075Sobrien return complit; 397090075Sobrien} 397190075Sobrien 397218334Speter/* Make TYPE a complete type based on INITIAL_VALUE. 397318334Speter Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, 397418334Speter 2 if there was no information (in which case assume 1 if DO_DEFAULT). */ 397518334Speter 397618334Speterint 397718334Spetercomplete_array_type (type, initial_value, do_default) 397818334Speter tree type; 397918334Speter tree initial_value; 398018334Speter int do_default; 398118334Speter{ 398290075Sobrien tree maxindex = NULL_TREE; 398318334Speter int value = 0; 398418334Speter 398518334Speter if (initial_value) 398618334Speter { 398718334Speter /* Note MAXINDEX is really the maximum index, 398818334Speter one less than the size. */ 398918334Speter if (TREE_CODE (initial_value) == STRING_CST) 399018334Speter { 399118334Speter int eltsize 399218334Speter = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value))); 399318334Speter maxindex = build_int_2 ((TREE_STRING_LENGTH (initial_value) 399418334Speter / eltsize) - 1, 0); 399518334Speter } 399618334Speter else if (TREE_CODE (initial_value) == CONSTRUCTOR) 399718334Speter { 399818334Speter tree elts = CONSTRUCTOR_ELTS (initial_value); 399990075Sobrien maxindex = build_int_2 (-1, -1); 400018334Speter for (; elts; elts = TREE_CHAIN (elts)) 400118334Speter { 400218334Speter if (TREE_PURPOSE (elts)) 400318334Speter maxindex = TREE_PURPOSE (elts); 400418334Speter else 400590075Sobrien maxindex = fold (build (PLUS_EXPR, integer_type_node, 400690075Sobrien maxindex, integer_one_node)); 400718334Speter } 400818334Speter maxindex = copy_node (maxindex); 400918334Speter } 401018334Speter else 401118334Speter { 401218334Speter /* Make an error message unless that happened already. */ 401318334Speter if (initial_value != error_mark_node) 401418334Speter value = 1; 401518334Speter 401618334Speter /* Prevent further error messages. */ 401718334Speter maxindex = build_int_2 (0, 0); 401818334Speter } 401918334Speter } 402018334Speter 402118334Speter if (!maxindex) 402218334Speter { 402318334Speter if (do_default) 402418334Speter maxindex = build_int_2 (0, 0); 402518334Speter value = 2; 402618334Speter } 402718334Speter 402818334Speter if (maxindex) 402918334Speter { 403018334Speter TYPE_DOMAIN (type) = build_index_type (maxindex); 403118334Speter if (!TREE_TYPE (maxindex)) 403218334Speter TREE_TYPE (maxindex) = TYPE_DOMAIN (type); 403318334Speter } 403418334Speter 403518334Speter /* Lay out the type now that we can get the real answer. */ 403618334Speter 403718334Speter layout_type (type); 403818334Speter 403918334Speter return value; 404018334Speter} 404118334Speter 404218334Speter/* Given declspecs and a declarator, 404318334Speter determine the name and type of the object declared 404418334Speter and construct a ..._DECL node for it. 404518334Speter (In one case we can return a ..._TYPE node instead. 404618334Speter For invalid input we sometimes return 0.) 404718334Speter 404818334Speter DECLSPECS is a chain of tree_list nodes whose value fields 404918334Speter are the storage classes and type specifiers. 405018334Speter 405118334Speter DECL_CONTEXT says which syntactic context this declaration is in: 405218334Speter NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL. 405318334Speter FUNCDEF for a function definition. Like NORMAL but a few different 405418334Speter error messages in each case. Return value may be zero meaning 405518334Speter this definition is too screwy to try to parse. 405618334Speter PARM for a parameter declaration (either within a function prototype 405718334Speter or before a function body). Make a PARM_DECL, or return void_type_node. 405818334Speter TYPENAME if for a typename (in a cast or sizeof). 405918334Speter Don't make a DECL node; just return the ..._TYPE node. 406018334Speter FIELD for a struct or union field; make a FIELD_DECL. 406196263Sobrien BITFIELD for a field with specified width. 406218334Speter INITIALIZED is 1 if the decl has an initializer. 406318334Speter 406418334Speter In the TYPENAME case, DECLARATOR is really an absolute declarator. 406518334Speter It may also be so in the PARM case, for a prototype where the 406618334Speter argument type is specified but not the name. 406718334Speter 406818334Speter This function is where the complicated C meanings of `static' 406918334Speter and `extern' are interpreted. */ 407018334Speter 407118334Speterstatic tree 407296263Sobriengrokdeclarator (declarator, declspecs, decl_context, initialized) 407318334Speter tree declspecs; 407418334Speter tree declarator; 407518334Speter enum decl_context decl_context; 407618334Speter int initialized; 407718334Speter{ 407818334Speter int specbits = 0; 407918334Speter tree spec; 408018334Speter tree type = NULL_TREE; 408118334Speter int longlong = 0; 408218334Speter int constp; 408352284Sobrien int restrictp; 408418334Speter int volatilep; 408552284Sobrien int type_quals = TYPE_UNQUALIFIED; 408618334Speter int inlinep; 408718334Speter int explicit_int = 0; 408818334Speter int explicit_char = 0; 408918334Speter int defaulted_int = 0; 409018334Speter tree typedef_decl = 0; 409196263Sobrien const char *name; 409218334Speter tree typedef_type = 0; 409318334Speter int funcdef_flag = 0; 409418334Speter enum tree_code innermost_code = ERROR_MARK; 409596263Sobrien int bitfield = 0; 409618334Speter int size_varies = 0; 409790075Sobrien tree decl_attr = NULL_TREE; 409890075Sobrien tree array_ptr_quals = NULL_TREE; 409990075Sobrien int array_parm_static = 0; 410090075Sobrien tree returned_attrs = NULL_TREE; 410118334Speter 410296263Sobrien if (decl_context == BITFIELD) 410396263Sobrien bitfield = 1, decl_context = FIELD; 410496263Sobrien 410518334Speter if (decl_context == FUNCDEF) 410618334Speter funcdef_flag = 1, decl_context = NORMAL; 410718334Speter 410818334Speter /* Look inside a declarator for the name being declared 410918334Speter and get it as a string, for an error message. */ 411018334Speter { 411190075Sobrien tree decl = declarator; 411218334Speter name = 0; 411318334Speter 411418334Speter while (decl) 411518334Speter switch (TREE_CODE (decl)) 411618334Speter { 411718334Speter case ARRAY_REF: 411818334Speter case INDIRECT_REF: 411918334Speter case CALL_EXPR: 412018334Speter innermost_code = TREE_CODE (decl); 412118334Speter decl = TREE_OPERAND (decl, 0); 412218334Speter break; 412318334Speter 412490075Sobrien case TREE_LIST: 412590075Sobrien decl = TREE_VALUE (decl); 412690075Sobrien break; 412790075Sobrien 412818334Speter case IDENTIFIER_NODE: 412918334Speter name = IDENTIFIER_POINTER (decl); 413018334Speter decl = 0; 413118334Speter break; 413218334Speter 413318334Speter default: 413418334Speter abort (); 413518334Speter } 413618334Speter if (name == 0) 413718334Speter name = "type name"; 413818334Speter } 413918334Speter 414018334Speter /* A function definition's declarator must have the form of 414118334Speter a function declarator. */ 414218334Speter 414318334Speter if (funcdef_flag && innermost_code != CALL_EXPR) 414418334Speter return 0; 414518334Speter 414618334Speter /* Anything declared one level down from the top level 414718334Speter must be one of the parameters of a function 414818334Speter (because the body is at least two levels down). */ 414918334Speter 415018334Speter /* If this looks like a function definition, make it one, 415118334Speter even if it occurs where parms are expected. 415218334Speter Then store_parm_decls will reject it and not use it as a parm. */ 415318334Speter if (decl_context == NORMAL && !funcdef_flag 415418334Speter && current_binding_level->parm_flag) 415518334Speter decl_context = PARM; 415618334Speter 415718334Speter /* Look through the decl specs and record which ones appear. 415818334Speter Some typespecs are defined as built-in typenames. 415918334Speter Others, the ones that are modifiers of other types, 416018334Speter are represented by bits in SPECBITS: set the bits for 416118334Speter the modifiers that appear. Storage class keywords are also in SPECBITS. 416218334Speter 416318334Speter If there is a typedef name or a type, store the type in TYPE. 416418334Speter This includes builtin typedefs such as `int'. 416518334Speter 416618334Speter Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char' 416718334Speter and did not come from a user typedef. 416818334Speter 416918334Speter Set LONGLONG if `long' is mentioned twice. */ 417018334Speter 417118334Speter for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) 417218334Speter { 417390075Sobrien tree id = TREE_VALUE (spec); 417418334Speter 417590075Sobrien /* If the entire declaration is itself tagged as deprecated then 417690075Sobrien suppress reports of deprecated items. */ 417790075Sobrien if (id && TREE_DEPRECATED (id)) 417890075Sobrien { 417990075Sobrien if (deprecated_state != DEPRECATED_SUPPRESS) 418090075Sobrien warn_deprecated_use (id); 418190075Sobrien } 418290075Sobrien 418318334Speter if (id == ridpointers[(int) RID_INT]) 418418334Speter explicit_int = 1; 418518334Speter if (id == ridpointers[(int) RID_CHAR]) 418618334Speter explicit_char = 1; 418718334Speter 418890075Sobrien if (TREE_CODE (id) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (id)) 418990075Sobrien { 419090075Sobrien enum rid i = C_RID_CODE (id); 419190075Sobrien if ((int) i <= (int) RID_LAST_MODIFIER) 419290075Sobrien { 419390075Sobrien if (i == RID_LONG && (specbits & (1 << (int) i))) 419490075Sobrien { 419590075Sobrien if (longlong) 419690075Sobrien error ("`long long long' is too long for GCC"); 419790075Sobrien else 419890075Sobrien { 419990075Sobrien if (pedantic && !flag_isoc99 && ! in_system_header 420090075Sobrien && warn_long_long) 420190075Sobrien pedwarn ("ISO C89 does not support `long long'"); 420290075Sobrien longlong = 1; 420390075Sobrien } 420490075Sobrien } 420590075Sobrien else if (specbits & (1 << (int) i)) 420690075Sobrien pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); 420790075Sobrien specbits |= 1 << (int) i; 420890075Sobrien goto found; 420990075Sobrien } 421090075Sobrien } 421118334Speter if (type) 421218334Speter error ("two or more data types in declaration of `%s'", name); 421318334Speter /* Actual typedefs come to us as TYPE_DECL nodes. */ 421418334Speter else if (TREE_CODE (id) == TYPE_DECL) 421518334Speter { 421690075Sobrien if (TREE_TYPE (id) == error_mark_node) 421790075Sobrien ; /* Allow the type to default to int to avoid cascading errors. */ 421890075Sobrien else 421990075Sobrien { 422090075Sobrien type = TREE_TYPE (id); 422190075Sobrien decl_attr = DECL_ATTRIBUTES (id); 422290075Sobrien typedef_decl = id; 422390075Sobrien } 422418334Speter } 422518334Speter /* Built-in types come as identifiers. */ 422618334Speter else if (TREE_CODE (id) == IDENTIFIER_NODE) 422718334Speter { 422890075Sobrien tree t = lookup_name (id); 422918334Speter if (TREE_TYPE (t) == error_mark_node) 423018334Speter ; 423118334Speter else if (!t || TREE_CODE (t) != TYPE_DECL) 423218334Speter error ("`%s' fails to be a typedef or built in type", 423318334Speter IDENTIFIER_POINTER (id)); 423418334Speter else 423518334Speter { 423618334Speter type = TREE_TYPE (t); 423718334Speter typedef_decl = t; 423818334Speter } 423918334Speter } 424018334Speter else if (TREE_CODE (id) != ERROR_MARK) 424118334Speter type = id; 424218334Speter 424390075Sobrien found: 424490075Sobrien ; 424518334Speter } 424618334Speter 424718334Speter typedef_type = type; 424818334Speter if (type) 424918334Speter size_varies = C_TYPE_VARIABLE_SIZE (type); 425018334Speter 425118334Speter /* No type at all: default to `int', and set DEFAULTED_INT 425218334Speter because it was not a user-defined typedef. */ 425318334Speter 425418334Speter if (type == 0) 425518334Speter { 425650397Sobrien if ((! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 425750397Sobrien | (1 << (int) RID_SIGNED) 425890075Sobrien | (1 << (int) RID_UNSIGNED) 425990075Sobrien | (1 << (int) RID_COMPLEX)))) 426050397Sobrien /* Don't warn about typedef foo = bar. */ 426150397Sobrien && ! (specbits & (1 << (int) RID_TYPEDEF) && initialized) 426290075Sobrien && ! in_system_header) 426350397Sobrien { 426490075Sobrien /* Issue a warning if this is an ISO C 99 program or if -Wreturn-type 426552284Sobrien and this is a function, or if -Wimplicit; prefer the former 426652284Sobrien warning since it is more explicit. */ 426790075Sobrien if ((warn_implicit_int || warn_return_type || flag_isoc99) 426890075Sobrien && funcdef_flag) 426950397Sobrien warn_about_return_type = 1; 427090075Sobrien else if (warn_implicit_int || flag_isoc99) 427190075Sobrien pedwarn_c99 ("type defaults to `int' in declaration of `%s'", 427290075Sobrien name); 427350397Sobrien } 427450397Sobrien 427518334Speter defaulted_int = 1; 427618334Speter type = integer_type_node; 427718334Speter } 427818334Speter 427918334Speter /* Now process the modifiers that were specified 428018334Speter and check for invalid combinations. */ 428118334Speter 428218334Speter /* Long double is a special combination. */ 428318334Speter 428450397Sobrien if ((specbits & 1 << (int) RID_LONG) && ! longlong 428518334Speter && TYPE_MAIN_VARIANT (type) == double_type_node) 428618334Speter { 428790075Sobrien specbits &= ~(1 << (int) RID_LONG); 428818334Speter type = long_double_type_node; 428918334Speter } 429018334Speter 429118334Speter /* Check all other uses of type modifiers. */ 429218334Speter 429318334Speter if (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 429418334Speter | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED))) 429518334Speter { 429618334Speter int ok = 0; 429718334Speter 429850397Sobrien if ((specbits & 1 << (int) RID_LONG) 429950397Sobrien && (specbits & 1 << (int) RID_SHORT)) 430050397Sobrien error ("both long and short specified for `%s'", name); 430118334Speter else if (((specbits & 1 << (int) RID_LONG) 430218334Speter || (specbits & 1 << (int) RID_SHORT)) 430318334Speter && explicit_char) 430418334Speter error ("long or short specified with char for `%s'", name); 430518334Speter else if (((specbits & 1 << (int) RID_LONG) 430618334Speter || (specbits & 1 << (int) RID_SHORT)) 430718334Speter && TREE_CODE (type) == REAL_TYPE) 430850397Sobrien { 430950397Sobrien static int already = 0; 431050397Sobrien 431150397Sobrien error ("long or short specified with floating type for `%s'", name); 431250397Sobrien if (! already && ! pedantic) 431350397Sobrien { 431450397Sobrien error ("the only valid combination is `long double'"); 431550397Sobrien already = 1; 431650397Sobrien } 431750397Sobrien } 431818334Speter else if ((specbits & 1 << (int) RID_SIGNED) 431918334Speter && (specbits & 1 << (int) RID_UNSIGNED)) 432050397Sobrien error ("both signed and unsigned specified for `%s'", name); 432150397Sobrien else if (TREE_CODE (type) != INTEGER_TYPE) 432250397Sobrien error ("long, short, signed or unsigned invalid for `%s'", name); 432318334Speter else 432418334Speter { 432518334Speter ok = 1; 432618334Speter if (!explicit_int && !defaulted_int && !explicit_char && pedantic) 432718334Speter { 432818334Speter pedwarn ("long, short, signed or unsigned used invalidly for `%s'", 432918334Speter name); 433018334Speter if (flag_pedantic_errors) 433118334Speter ok = 0; 433218334Speter } 433318334Speter } 433418334Speter 433518334Speter /* Discard the type modifiers if they are invalid. */ 433618334Speter if (! ok) 433718334Speter { 433818334Speter specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 433918334Speter | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED)); 434018334Speter longlong = 0; 434118334Speter } 434218334Speter } 434318334Speter 434418334Speter if ((specbits & (1 << (int) RID_COMPLEX)) 434518334Speter && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE) 434618334Speter { 434718334Speter error ("complex invalid for `%s'", name); 434890075Sobrien specbits &= ~(1 << (int) RID_COMPLEX); 434918334Speter } 435018334Speter 435118334Speter /* Decide whether an integer type is signed or not. 435296263Sobrien Optionally treat bitfields as signed by default. */ 435318334Speter if (specbits & 1 << (int) RID_UNSIGNED 435496263Sobrien /* Traditionally, all bitfields are unsigned. */ 435518334Speter || (bitfield && flag_traditional 435618334Speter && (! explicit_flag_signed_bitfields || !flag_signed_bitfields)) 435718334Speter || (bitfield && ! flag_signed_bitfields 435818334Speter && (explicit_int || defaulted_int || explicit_char 435918334Speter /* A typedef for plain `int' without `signed' 436018334Speter can be controlled just like plain `int'. */ 436118334Speter || ! (typedef_decl != 0 436218334Speter && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) 436318334Speter && TREE_CODE (type) != ENUMERAL_TYPE 436418334Speter && !(specbits & 1 << (int) RID_SIGNED))) 436518334Speter { 436618334Speter if (longlong) 436718334Speter type = long_long_unsigned_type_node; 436818334Speter else if (specbits & 1 << (int) RID_LONG) 436918334Speter type = long_unsigned_type_node; 437018334Speter else if (specbits & 1 << (int) RID_SHORT) 437118334Speter type = short_unsigned_type_node; 437218334Speter else if (type == char_type_node) 437318334Speter type = unsigned_char_type_node; 437418334Speter else if (typedef_decl) 437518334Speter type = unsigned_type (type); 437618334Speter else 437718334Speter type = unsigned_type_node; 437818334Speter } 437918334Speter else if ((specbits & 1 << (int) RID_SIGNED) 438018334Speter && type == char_type_node) 438118334Speter type = signed_char_type_node; 438218334Speter else if (longlong) 438318334Speter type = long_long_integer_type_node; 438418334Speter else if (specbits & 1 << (int) RID_LONG) 438518334Speter type = long_integer_type_node; 438618334Speter else if (specbits & 1 << (int) RID_SHORT) 438718334Speter type = short_integer_type_node; 438818334Speter 438918334Speter if (specbits & 1 << (int) RID_COMPLEX) 439018334Speter { 439190075Sobrien if (pedantic && !flag_isoc99) 439290075Sobrien pedwarn ("ISO C89 does not support complex types"); 439318334Speter /* If we just have "complex", it is equivalent to 439418334Speter "complex double", but if any modifiers at all are specified it is 439518334Speter the complex form of TYPE. E.g, "complex short" is 439618334Speter "complex short int". */ 439718334Speter 439818334Speter if (defaulted_int && ! longlong 439918334Speter && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) 440018334Speter | (1 << (int) RID_SIGNED) 440118334Speter | (1 << (int) RID_UNSIGNED)))) 440290075Sobrien { 440390075Sobrien if (pedantic) 440490075Sobrien pedwarn ("ISO C does not support plain `complex' meaning `double complex'"); 440590075Sobrien type = complex_double_type_node; 440690075Sobrien } 440718334Speter else if (type == integer_type_node) 440890075Sobrien { 440990075Sobrien if (pedantic) 441090075Sobrien pedwarn ("ISO C does not support complex integer types"); 441190075Sobrien type = complex_integer_type_node; 441290075Sobrien } 441318334Speter else if (type == float_type_node) 441418334Speter type = complex_float_type_node; 441518334Speter else if (type == double_type_node) 441618334Speter type = complex_double_type_node; 441718334Speter else if (type == long_double_type_node) 441818334Speter type = complex_long_double_type_node; 441918334Speter else 442090075Sobrien { 442190075Sobrien if (pedantic) 442290075Sobrien pedwarn ("ISO C does not support complex integer types"); 442390075Sobrien type = build_complex_type (type); 442490075Sobrien } 442518334Speter } 442618334Speter 442752284Sobrien /* Figure out the type qualifiers for the declaration. There are 442852284Sobrien two ways a declaration can become qualified. One is something 442952284Sobrien like `const int i' where the `const' is explicit. Another is 443052284Sobrien something like `typedef const int CI; CI i' where the type of the 443152284Sobrien declaration contains the `const'. */ 443218334Speter constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (type); 443352284Sobrien restrictp = !! (specbits & 1 << (int) RID_RESTRICT) + TYPE_RESTRICT (type); 443418334Speter volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type); 443518334Speter inlinep = !! (specbits & (1 << (int) RID_INLINE)); 443690075Sobrien if (constp > 1 && ! flag_isoc99) 443718334Speter pedwarn ("duplicate `const'"); 443890075Sobrien if (restrictp > 1 && ! flag_isoc99) 443952284Sobrien pedwarn ("duplicate `restrict'"); 444090075Sobrien if (volatilep > 1 && ! flag_isoc99) 444118334Speter pedwarn ("duplicate `volatile'"); 444252284Sobrien if (! flag_gen_aux_info && (TYPE_QUALS (type))) 444318334Speter type = TYPE_MAIN_VARIANT (type); 444452284Sobrien type_quals = ((constp ? TYPE_QUAL_CONST : 0) 444552284Sobrien | (restrictp ? TYPE_QUAL_RESTRICT : 0) 444652284Sobrien | (volatilep ? TYPE_QUAL_VOLATILE : 0)); 444718334Speter 444818334Speter /* Warn if two storage classes are given. Default to `auto'. */ 444918334Speter 445018334Speter { 445118334Speter int nclasses = 0; 445218334Speter 445318334Speter if (specbits & 1 << (int) RID_AUTO) nclasses++; 445418334Speter if (specbits & 1 << (int) RID_STATIC) nclasses++; 445518334Speter if (specbits & 1 << (int) RID_EXTERN) nclasses++; 445618334Speter if (specbits & 1 << (int) RID_REGISTER) nclasses++; 445718334Speter if (specbits & 1 << (int) RID_TYPEDEF) nclasses++; 445818334Speter 445918334Speter /* Warn about storage classes that are invalid for certain 446018334Speter kinds of declarations (parameters, typenames, etc.). */ 446118334Speter 446218334Speter if (nclasses > 1) 446318334Speter error ("multiple storage classes in declaration of `%s'", name); 446418334Speter else if (funcdef_flag 446518334Speter && (specbits 446618334Speter & ((1 << (int) RID_REGISTER) 446718334Speter | (1 << (int) RID_AUTO) 446818334Speter | (1 << (int) RID_TYPEDEF)))) 446918334Speter { 447018334Speter if (specbits & 1 << (int) RID_AUTO 447118334Speter && (pedantic || current_binding_level == global_binding_level)) 447218334Speter pedwarn ("function definition declared `auto'"); 447318334Speter if (specbits & 1 << (int) RID_REGISTER) 447418334Speter error ("function definition declared `register'"); 447518334Speter if (specbits & 1 << (int) RID_TYPEDEF) 447618334Speter error ("function definition declared `typedef'"); 447790075Sobrien specbits &= ~((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) 447890075Sobrien | (1 << (int) RID_AUTO)); 447918334Speter } 448018334Speter else if (decl_context != NORMAL && nclasses > 0) 448118334Speter { 448218334Speter if (decl_context == PARM && specbits & 1 << (int) RID_REGISTER) 448318334Speter ; 448418334Speter else 448518334Speter { 448690075Sobrien switch (decl_context) 448790075Sobrien { 448890075Sobrien case FIELD: 448990075Sobrien error ("storage class specified for structure field `%s'", 449090075Sobrien name); 449190075Sobrien break; 449290075Sobrien case PARM: 449390075Sobrien error ("storage class specified for parameter `%s'", name); 449490075Sobrien break; 449590075Sobrien default: 449690075Sobrien error ("storage class specified for typename"); 449790075Sobrien break; 449890075Sobrien } 449990075Sobrien specbits &= ~((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) 450090075Sobrien | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC) 450190075Sobrien | (1 << (int) RID_EXTERN)); 450218334Speter } 450318334Speter } 450418334Speter else if (specbits & 1 << (int) RID_EXTERN && initialized && ! funcdef_flag) 450518334Speter { 450618334Speter /* `extern' with initialization is invalid if not at top level. */ 450718334Speter if (current_binding_level == global_binding_level) 450818334Speter warning ("`%s' initialized and declared `extern'", name); 450918334Speter else 451018334Speter error ("`%s' has both `extern' and initializer", name); 451118334Speter } 451218334Speter else if (specbits & 1 << (int) RID_EXTERN && funcdef_flag 451318334Speter && current_binding_level != global_binding_level) 451418334Speter error ("nested function `%s' declared `extern'", name); 451518334Speter else if (current_binding_level == global_binding_level 451618334Speter && specbits & (1 << (int) RID_AUTO)) 451718334Speter error ("top-level declaration of `%s' specifies `auto'", name); 451818334Speter } 451918334Speter 452018334Speter /* Now figure out the structure of the declarator proper. 452118334Speter Descend through it, creating more complex types, until we reach 452218334Speter the declared identifier (or NULL_TREE, in an absolute declarator). */ 452318334Speter 452418334Speter while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE) 452518334Speter { 452618334Speter if (type == error_mark_node) 452718334Speter { 452818334Speter declarator = TREE_OPERAND (declarator, 0); 452918334Speter continue; 453018334Speter } 453118334Speter 453218334Speter /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]), 453318334Speter an INDIRECT_REF (for *...), 453418334Speter a CALL_EXPR (for ...(...)), 453590075Sobrien a TREE_LIST (for nested attributes), 453618334Speter an identifier (for the name being declared) 453718334Speter or a null pointer (for the place in an absolute declarator 453818334Speter where the name was omitted). 453918334Speter For the last two cases, we have just exited the loop. 454018334Speter 454118334Speter At this point, TYPE is the type of elements of an array, 454218334Speter or for a function to return, or for a pointer to point to. 454318334Speter After this sequence of ifs, TYPE is the type of the 454418334Speter array or function or pointer, and DECLARATOR has had its 454518334Speter outermost layer removed. */ 454618334Speter 454790075Sobrien if (array_ptr_quals != NULL_TREE || array_parm_static) 454818334Speter { 454990075Sobrien /* Only the innermost declarator (making a parameter be of 455090075Sobrien array type which is converted to pointer type) 455190075Sobrien may have static or type qualifiers. */ 455290075Sobrien error ("static or type qualifiers in non-parameter array declarator"); 455390075Sobrien array_ptr_quals = NULL_TREE; 455490075Sobrien array_parm_static = 0; 455590075Sobrien } 455690075Sobrien 455790075Sobrien if (TREE_CODE (declarator) == TREE_LIST) 455890075Sobrien { 455990075Sobrien /* We encode a declarator with embedded attributes using 456090075Sobrien a TREE_LIST. */ 456190075Sobrien tree attrs = TREE_PURPOSE (declarator); 456290075Sobrien tree inner_decl; 456390075Sobrien int attr_flags = 0; 456490075Sobrien declarator = TREE_VALUE (declarator); 456590075Sobrien inner_decl = declarator; 456690075Sobrien while (inner_decl != NULL_TREE 456790075Sobrien && TREE_CODE (inner_decl) == TREE_LIST) 456890075Sobrien inner_decl = TREE_VALUE (inner_decl); 456990075Sobrien if (inner_decl == NULL_TREE 457090075Sobrien || TREE_CODE (inner_decl) == IDENTIFIER_NODE) 457190075Sobrien attr_flags |= (int) ATTR_FLAG_DECL_NEXT; 457296263Sobrien else if (TREE_CODE (inner_decl) == CALL_EXPR) 457390075Sobrien attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT; 457496263Sobrien else if (TREE_CODE (inner_decl) == ARRAY_REF) 457590075Sobrien attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT; 457690075Sobrien returned_attrs = decl_attributes (&type, 457790075Sobrien chainon (returned_attrs, attrs), 457890075Sobrien attr_flags); 457990075Sobrien } 458090075Sobrien else if (TREE_CODE (declarator) == ARRAY_REF) 458190075Sobrien { 458290075Sobrien tree itype = NULL_TREE; 458390075Sobrien tree size = TREE_OPERAND (declarator, 1); 458418334Speter /* The index is a signed object `sizetype' bits wide. */ 458518334Speter tree index_type = signed_type (sizetype); 458618334Speter 458790075Sobrien array_ptr_quals = TREE_TYPE (declarator); 458890075Sobrien array_parm_static = TREE_STATIC (declarator); 458990075Sobrien 459018334Speter declarator = TREE_OPERAND (declarator, 0); 459118334Speter 459218334Speter /* Check for some types that there cannot be arrays of. */ 459318334Speter 459490075Sobrien if (VOID_TYPE_P (type)) 459518334Speter { 459618334Speter error ("declaration of `%s' as array of voids", name); 459718334Speter type = error_mark_node; 459818334Speter } 459918334Speter 460018334Speter if (TREE_CODE (type) == FUNCTION_TYPE) 460118334Speter { 460218334Speter error ("declaration of `%s' as array of functions", name); 460318334Speter type = error_mark_node; 460418334Speter } 460518334Speter 460618334Speter if (size == error_mark_node) 460718334Speter type = error_mark_node; 460818334Speter 460918334Speter if (type == error_mark_node) 461018334Speter continue; 461118334Speter 461218334Speter /* If size was specified, set ITYPE to a range-type for that size. 461318334Speter Otherwise, ITYPE remains null. finish_decl may figure it out 461418334Speter from an initial value. */ 461518334Speter 461618334Speter if (size) 461718334Speter { 461818334Speter /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ 461918334Speter STRIP_TYPE_NOPS (size); 462018334Speter 462190075Sobrien if (! INTEGRAL_TYPE_P (TREE_TYPE (size))) 462218334Speter { 462318334Speter error ("size of array `%s' has non-integer type", name); 462418334Speter size = integer_one_node; 462518334Speter } 462618334Speter 462718334Speter if (pedantic && integer_zerop (size)) 462890075Sobrien pedwarn ("ISO C forbids zero-size array `%s'", name); 462918334Speter 463018334Speter if (TREE_CODE (size) == INTEGER_CST) 463118334Speter { 463218334Speter constant_expression_warning (size); 463318334Speter if (tree_int_cst_sgn (size) < 0) 463418334Speter { 463518334Speter error ("size of array `%s' is negative", name); 463618334Speter size = integer_one_node; 463718334Speter } 463818334Speter } 463918334Speter else 464018334Speter { 464118334Speter /* Make sure the array size remains visibly nonconstant 464218334Speter even if it is (eg) a const variable with known value. */ 464318334Speter size_varies = 1; 464418334Speter 4645102790Skan if (!flag_isoc99 && pedantic) 464618334Speter { 464718334Speter if (TREE_CONSTANT (size)) 464890075Sobrien pedwarn ("ISO C89 forbids array `%s' whose size can't be evaluated", 464990075Sobrien name); 465018334Speter else 465190075Sobrien pedwarn ("ISO C89 forbids variable-size array `%s'", 465290075Sobrien name); 465318334Speter } 465418334Speter } 465518334Speter 465690075Sobrien if (integer_zerop (size)) 465750397Sobrien { 465890075Sobrien /* A zero-length array cannot be represented with an 465990075Sobrien unsigned index type, which is what we'll get with 466090075Sobrien build_index_type. Create an open-ended range instead. */ 466190075Sobrien itype = build_range_type (sizetype, size, NULL_TREE); 466250397Sobrien } 466390075Sobrien else 466490075Sobrien { 466590075Sobrien /* Compute the maximum valid index, that is, size - 1. 466690075Sobrien Do the calculation in index_type, so that if it is 466790075Sobrien a variable the computations will be done in the 466890075Sobrien proper mode. */ 466990075Sobrien itype = fold (build (MINUS_EXPR, index_type, 467090075Sobrien convert (index_type, size), 467190075Sobrien convert (index_type, size_one_node))); 467250397Sobrien 467390075Sobrien /* If that overflowed, the array is too big. 467490075Sobrien ??? While a size of INT_MAX+1 technically shouldn't 467590075Sobrien cause an overflow (because we subtract 1), the overflow 467690075Sobrien is recorded during the conversion to index_type, before 467790075Sobrien the subtraction. Handling this case seems like an 467890075Sobrien unnecessary complication. */ 467990075Sobrien if (TREE_OVERFLOW (itype)) 468090075Sobrien { 468190075Sobrien error ("size of array `%s' is too large", name); 468290075Sobrien type = error_mark_node; 468390075Sobrien continue; 468490075Sobrien } 468590075Sobrien 468690075Sobrien if (size_varies) 468790075Sobrien itype = variable_size (itype); 468890075Sobrien itype = build_index_type (itype); 468990075Sobrien } 469018334Speter } 469190075Sobrien else if (decl_context == FIELD) 469290075Sobrien { 469390075Sobrien if (pedantic && !flag_isoc99 && !in_system_header) 469490075Sobrien pedwarn ("ISO C89 does not support flexible array members"); 469518334Speter 469690075Sobrien /* ISO C99 Flexible array members are effectively identical 469790075Sobrien to GCC's zero-length array extension. */ 469890075Sobrien itype = build_range_type (sizetype, size_zero_node, NULL_TREE); 469990075Sobrien } 470018334Speter 470190075Sobrien /* If pedantic, complain about arrays of incomplete types. */ 470290075Sobrien 470390075Sobrien if (pedantic && !COMPLETE_TYPE_P (type)) 470490075Sobrien pedwarn ("array type has incomplete element type"); 470590075Sobrien 470690075Sobrien#if 0 470790075Sobrien /* We shouldn't have a function type here at all! 470890075Sobrien Functions aren't allowed as array elements. */ 470918334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 471018334Speter && (constp || volatilep)) 471190075Sobrien pedwarn ("ISO C forbids const or volatile function types"); 471218334Speter#endif 471318334Speter 471418334Speter /* Build the array type itself, then merge any constancy or 471518334Speter volatility into the target type. We must do it in this order 471618334Speter to ensure that the TYPE_MAIN_VARIANT field of the array type 471718334Speter is set correctly. */ 471818334Speter 471918334Speter type = build_array_type (type, itype); 472052284Sobrien if (type_quals) 472152284Sobrien type = c_build_qualified_type (type, type_quals); 472218334Speter 472318334Speter if (size_varies) 472418334Speter C_TYPE_VARIABLE_SIZE (type) = 1; 472590075Sobrien 472690075Sobrien /* The GCC extension for zero-length arrays differs from 472790075Sobrien ISO flexible array members in that sizeof yields zero. */ 472890075Sobrien if (size && integer_zerop (size)) 472990075Sobrien { 473090075Sobrien layout_type (type); 473190075Sobrien TYPE_SIZE (type) = bitsize_zero_node; 473290075Sobrien TYPE_SIZE_UNIT (type) = size_zero_node; 473390075Sobrien } 473490075Sobrien if (decl_context != PARM 473590075Sobrien && (array_ptr_quals != NULL_TREE || array_parm_static)) 473690075Sobrien { 473790075Sobrien error ("static or type qualifiers in non-parameter array declarator"); 473890075Sobrien array_ptr_quals = NULL_TREE; 473990075Sobrien array_parm_static = 0; 474090075Sobrien } 474118334Speter } 474218334Speter else if (TREE_CODE (declarator) == CALL_EXPR) 474318334Speter { 474418334Speter tree arg_types; 474518334Speter 474618334Speter /* Declaring a function type. 474718334Speter Make sure we have a valid type for the function to return. */ 474818334Speter if (type == error_mark_node) 474918334Speter continue; 475018334Speter 475118334Speter size_varies = 0; 475218334Speter 475318334Speter /* Warn about some types functions can't return. */ 475418334Speter 475518334Speter if (TREE_CODE (type) == FUNCTION_TYPE) 475618334Speter { 475718334Speter error ("`%s' declared as function returning a function", name); 475818334Speter type = integer_type_node; 475918334Speter } 476018334Speter if (TREE_CODE (type) == ARRAY_TYPE) 476118334Speter { 476218334Speter error ("`%s' declared as function returning an array", name); 476318334Speter type = integer_type_node; 476418334Speter } 476518334Speter 476618334Speter#ifndef TRADITIONAL_RETURN_FLOAT 476718334Speter /* Traditionally, declaring return type float means double. */ 476818334Speter 476918334Speter if (flag_traditional && TYPE_MAIN_VARIANT (type) == float_type_node) 477018334Speter type = double_type_node; 477118334Speter#endif /* TRADITIONAL_RETURN_FLOAT */ 477218334Speter 477318334Speter /* Construct the function type and go to the next 477418334Speter inner layer of declarator. */ 477518334Speter 477618334Speter arg_types = grokparms (TREE_OPERAND (declarator, 1), 477718334Speter funcdef_flag 477818334Speter /* Say it's a definition 477918334Speter only for the CALL_EXPR 478018334Speter closest to the identifier. */ 478118334Speter && TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE); 478252284Sobrien /* Type qualifiers before the return type of the function 478352284Sobrien qualify the return type, not the function type. */ 478452284Sobrien if (type_quals) 478590075Sobrien { 478690075Sobrien /* Type qualifiers on a function return type are normally 478790075Sobrien permitted by the standard but have no effect, so give a 478890075Sobrien warning at -W. Qualifiers on a void return type have 478990075Sobrien meaning as a GNU extension, and are banned on function 479090075Sobrien definitions in ISO C. FIXME: strictly we shouldn't 479190075Sobrien pedwarn for qualified void return types except on function 479290075Sobrien definitions, but not doing so could lead to the undesirable 479390075Sobrien state of a "volatile void" function return type not being 479490075Sobrien warned about, and a use of the function being compiled 479590075Sobrien with GNU semantics, with no diagnostics under -pedantic. */ 479690075Sobrien if (VOID_TYPE_P (type) && pedantic && !in_system_header) 479790075Sobrien pedwarn ("ISO C forbids qualified void function return type"); 479890075Sobrien else if (extra_warnings 479990075Sobrien && !(VOID_TYPE_P (type) 480090075Sobrien && type_quals == TYPE_QUAL_VOLATILE)) 480190075Sobrien warning ("type qualifiers ignored on function return type"); 480290075Sobrien 480390075Sobrien type = c_build_qualified_type (type, type_quals); 480490075Sobrien } 480552284Sobrien type_quals = TYPE_UNQUALIFIED; 480618334Speter 480718334Speter type = build_function_type (type, arg_types); 480818334Speter declarator = TREE_OPERAND (declarator, 0); 480918334Speter 481018334Speter /* Set the TYPE_CONTEXTs for each tagged type which is local to 481118334Speter the formal parameter list of this FUNCTION_TYPE to point to 481218334Speter the FUNCTION_TYPE node itself. */ 481318334Speter 481418334Speter { 481590075Sobrien tree link; 481618334Speter 481750397Sobrien for (link = last_function_parm_tags; 481818334Speter link; 481918334Speter link = TREE_CHAIN (link)) 482018334Speter TYPE_CONTEXT (TREE_VALUE (link)) = type; 482118334Speter } 482218334Speter } 482318334Speter else if (TREE_CODE (declarator) == INDIRECT_REF) 482418334Speter { 482518334Speter /* Merge any constancy or volatility into the target type 482618334Speter for the pointer. */ 482718334Speter 482818334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 482952284Sobrien && type_quals) 483090075Sobrien pedwarn ("ISO C forbids qualified function types"); 483152284Sobrien if (type_quals) 483252284Sobrien type = c_build_qualified_type (type, type_quals); 483352284Sobrien type_quals = TYPE_UNQUALIFIED; 483418334Speter size_varies = 0; 483518334Speter 483618334Speter type = build_pointer_type (type); 483718334Speter 483818334Speter /* Process a list of type modifier keywords 483918334Speter (such as const or volatile) that were given inside the `*'. */ 484018334Speter 484118334Speter if (TREE_TYPE (declarator)) 484218334Speter { 484390075Sobrien tree typemodlist; 484418334Speter int erred = 0; 484552284Sobrien 484652284Sobrien constp = 0; 484752284Sobrien volatilep = 0; 484852284Sobrien restrictp = 0; 484918334Speter for (typemodlist = TREE_TYPE (declarator); typemodlist; 485018334Speter typemodlist = TREE_CHAIN (typemodlist)) 485118334Speter { 485252284Sobrien tree qualifier = TREE_VALUE (typemodlist); 485352284Sobrien 485490075Sobrien if (C_IS_RESERVED_WORD (qualifier)) 485518334Speter { 485690075Sobrien if (C_RID_CODE (qualifier) == RID_CONST) 485790075Sobrien constp++; 485890075Sobrien else if (C_RID_CODE (qualifier) == RID_VOLATILE) 485990075Sobrien volatilep++; 486090075Sobrien else if (C_RID_CODE (qualifier) == RID_RESTRICT) 486190075Sobrien restrictp++; 486290075Sobrien else 486390075Sobrien erred++; 486418334Speter } 486590075Sobrien else 486690075Sobrien erred++; 486718334Speter } 486890075Sobrien 486990075Sobrien if (erred) 487090075Sobrien error ("invalid type modifier within pointer declarator"); 487190075Sobrien if (constp > 1 && ! flag_isoc99) 487218334Speter pedwarn ("duplicate `const'"); 487390075Sobrien if (volatilep > 1 && ! flag_isoc99) 487418334Speter pedwarn ("duplicate `volatile'"); 487590075Sobrien if (restrictp > 1 && ! flag_isoc99) 487652284Sobrien pedwarn ("duplicate `restrict'"); 487752284Sobrien 487852284Sobrien type_quals = ((constp ? TYPE_QUAL_CONST : 0) 487952284Sobrien | (restrictp ? TYPE_QUAL_RESTRICT : 0) 488052284Sobrien | (volatilep ? TYPE_QUAL_VOLATILE : 0)); 488118334Speter } 488218334Speter 488318334Speter declarator = TREE_OPERAND (declarator, 0); 488418334Speter } 488518334Speter else 488618334Speter abort (); 488718334Speter 488818334Speter } 488918334Speter 489018334Speter /* Now TYPE has the actual type. */ 489118334Speter 489250397Sobrien /* Did array size calculations overflow? */ 489350397Sobrien 489450397Sobrien if (TREE_CODE (type) == ARRAY_TYPE 489590075Sobrien && COMPLETE_TYPE_P (type) 489650397Sobrien && TREE_OVERFLOW (TYPE_SIZE (type))) 489790075Sobrien { 489890075Sobrien error ("size of array `%s' is too large", name); 489990075Sobrien /* If we proceed with the array type as it is, we'll eventually 490090075Sobrien crash in tree_low_cst(). */ 490190075Sobrien type = error_mark_node; 490290075Sobrien } 490350397Sobrien 490418334Speter /* If this is declaring a typedef name, return a TYPE_DECL. */ 490518334Speter 490618334Speter if (specbits & (1 << (int) RID_TYPEDEF)) 490718334Speter { 490818334Speter tree decl; 490918334Speter /* Note that the grammar rejects storage classes 491018334Speter in typenames, fields or parameters */ 491118334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 491252284Sobrien && type_quals) 491390075Sobrien pedwarn ("ISO C forbids qualified function types"); 491452284Sobrien if (type_quals) 491552284Sobrien type = c_build_qualified_type (type, type_quals); 491618334Speter decl = build_decl (TYPE_DECL, declarator, type); 491718334Speter if ((specbits & (1 << (int) RID_SIGNED)) 491818334Speter || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) 491918334Speter C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1; 492090075Sobrien decl_attributes (&decl, returned_attrs, 0); 492118334Speter return decl; 492218334Speter } 492318334Speter 492418334Speter /* Detect the case of an array type of unspecified size 492518334Speter which came, as such, direct from a typedef name. 492618334Speter We must copy the type, so that each identifier gets 492718334Speter a distinct type, so that each identifier's size can be 492818334Speter controlled separately by its own initializer. */ 492918334Speter 493018334Speter if (type != 0 && typedef_type != 0 493190075Sobrien && TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0 493290075Sobrien && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type)) 493318334Speter { 493418334Speter type = build_array_type (TREE_TYPE (type), 0); 493518334Speter if (size_varies) 493618334Speter C_TYPE_VARIABLE_SIZE (type) = 1; 493718334Speter } 493818334Speter 493918334Speter /* If this is a type name (such as, in a cast or sizeof), 494018334Speter compute the type and return it now. */ 494118334Speter 494218334Speter if (decl_context == TYPENAME) 494318334Speter { 494418334Speter /* Note that the grammar rejects storage classes 494518334Speter in typenames, fields or parameters */ 494618334Speter if (pedantic && TREE_CODE (type) == FUNCTION_TYPE 494752284Sobrien && type_quals) 494890075Sobrien pedwarn ("ISO C forbids const or volatile function types"); 494952284Sobrien if (type_quals) 495052284Sobrien type = c_build_qualified_type (type, type_quals); 495190075Sobrien decl_attributes (&type, returned_attrs, 0); 495218334Speter return type; 495318334Speter } 495418334Speter 495518334Speter /* Aside from typedefs and type names (handle above), 495618334Speter `void' at top level (not within pointer) 495718334Speter is allowed only in public variables. 495818334Speter We don't complain about parms either, but that is because 495918334Speter a better error message can be made later. */ 496018334Speter 496190075Sobrien if (VOID_TYPE_P (type) && decl_context != PARM 496218334Speter && ! ((decl_context != FIELD && TREE_CODE (type) != FUNCTION_TYPE) 496318334Speter && ((specbits & (1 << (int) RID_EXTERN)) 496418334Speter || (current_binding_level == global_binding_level 496518334Speter && !(specbits 496618334Speter & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER))))))) 496718334Speter { 496818334Speter error ("variable or field `%s' declared void", name); 496918334Speter type = integer_type_node; 497018334Speter } 497118334Speter 497218334Speter /* Now create the decl, which may be a VAR_DECL, a PARM_DECL 497318334Speter or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ 497418334Speter 497518334Speter { 497690075Sobrien tree decl; 497718334Speter 497818334Speter if (decl_context == PARM) 497918334Speter { 498090075Sobrien tree type_as_written; 498190075Sobrien tree promoted_type; 498218334Speter 498318334Speter /* A parameter declared as an array of T is really a pointer to T. 498418334Speter One declared as a function is really a pointer to a function. */ 498518334Speter 498618334Speter if (TREE_CODE (type) == ARRAY_TYPE) 498718334Speter { 498818334Speter /* Transfer const-ness of array into that of type pointed to. */ 498918334Speter type = TREE_TYPE (type); 499052284Sobrien if (type_quals) 499152284Sobrien type = c_build_qualified_type (type, type_quals); 499218334Speter type = build_pointer_type (type); 499352284Sobrien type_quals = TYPE_UNQUALIFIED; 499490075Sobrien if (array_ptr_quals) 499590075Sobrien { 499690075Sobrien tree new_ptr_quals, new_ptr_attrs; 499790075Sobrien int erred = 0; 499890075Sobrien split_specs_attrs (array_ptr_quals, &new_ptr_quals, &new_ptr_attrs); 499990075Sobrien /* We don't yet implement attributes in this context. */ 500090075Sobrien if (new_ptr_attrs != NULL_TREE) 500190075Sobrien warning ("attributes in parameter array declarator ignored"); 500290075Sobrien 500390075Sobrien constp = 0; 500490075Sobrien volatilep = 0; 500590075Sobrien restrictp = 0; 500690075Sobrien for (; new_ptr_quals; new_ptr_quals = TREE_CHAIN (new_ptr_quals)) 500790075Sobrien { 500890075Sobrien tree qualifier = TREE_VALUE (new_ptr_quals); 500990075Sobrien 501090075Sobrien if (C_IS_RESERVED_WORD (qualifier)) 501190075Sobrien { 501290075Sobrien if (C_RID_CODE (qualifier) == RID_CONST) 501390075Sobrien constp++; 501490075Sobrien else if (C_RID_CODE (qualifier) == RID_VOLATILE) 501590075Sobrien volatilep++; 501690075Sobrien else if (C_RID_CODE (qualifier) == RID_RESTRICT) 501790075Sobrien restrictp++; 501890075Sobrien else 501990075Sobrien erred++; 502090075Sobrien } 502190075Sobrien else 502290075Sobrien erred++; 502390075Sobrien } 502490075Sobrien 502590075Sobrien if (erred) 502690075Sobrien error ("invalid type modifier within array declarator"); 502790075Sobrien 502890075Sobrien type_quals = ((constp ? TYPE_QUAL_CONST : 0) 502990075Sobrien | (restrictp ? TYPE_QUAL_RESTRICT : 0) 503090075Sobrien | (volatilep ? TYPE_QUAL_VOLATILE : 0)); 503190075Sobrien } 503218334Speter size_varies = 0; 503318334Speter } 503418334Speter else if (TREE_CODE (type) == FUNCTION_TYPE) 503518334Speter { 503652284Sobrien if (pedantic && type_quals) 503790075Sobrien pedwarn ("ISO C forbids qualified function types"); 503852284Sobrien if (type_quals) 503952284Sobrien type = c_build_qualified_type (type, type_quals); 504018334Speter type = build_pointer_type (type); 504152284Sobrien type_quals = TYPE_UNQUALIFIED; 504218334Speter } 504390075Sobrien else if (type_quals) 504490075Sobrien type = c_build_qualified_type (type, type_quals); 504590075Sobrien 504690075Sobrien type_as_written = type; 504718334Speter 504818334Speter decl = build_decl (PARM_DECL, declarator, type); 504918334Speter if (size_varies) 505018334Speter C_DECL_VARIABLE_SIZE (decl) = 1; 505118334Speter 505218334Speter /* Compute the type actually passed in the parmlist, 505318334Speter for the case where there is no prototype. 505418334Speter (For example, shorts and chars are passed as ints.) 505518334Speter When there is a prototype, this is overridden later. */ 505618334Speter 505790075Sobrien if (type == error_mark_node) 505890075Sobrien promoted_type = type; 505990075Sobrien else 506018334Speter { 506190075Sobrien promoted_type = simple_type_promotes_to (type); 506290075Sobrien if (! promoted_type) 506390075Sobrien promoted_type = type; 506418334Speter } 506518334Speter 506690075Sobrien DECL_ARG_TYPE (decl) = promoted_type; 506718334Speter DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written; 506818334Speter } 506918334Speter else if (decl_context == FIELD) 507018334Speter { 507118334Speter /* Structure field. It may not be a function. */ 507296263Sobrien 507318334Speter if (TREE_CODE (type) == FUNCTION_TYPE) 507418334Speter { 507518334Speter error ("field `%s' declared as a function", name); 507618334Speter type = build_pointer_type (type); 507718334Speter } 507890075Sobrien else if (TREE_CODE (type) != ERROR_MARK 507990075Sobrien && !COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (type)) 508018334Speter { 508118334Speter error ("field `%s' has incomplete type", name); 508218334Speter type = error_mark_node; 508318334Speter } 508418334Speter /* Move type qualifiers down to element of an array. */ 508552284Sobrien if (TREE_CODE (type) == ARRAY_TYPE && type_quals) 508618334Speter { 508752284Sobrien type = build_array_type (c_build_qualified_type (TREE_TYPE (type), 508852284Sobrien type_quals), 508918334Speter TYPE_DOMAIN (type)); 509090075Sobrien#if 0 509190075Sobrien /* Leave the field const or volatile as well. */ 509252284Sobrien type_quals = TYPE_UNQUALIFIED; 509318334Speter#endif 509418334Speter } 509518334Speter decl = build_decl (FIELD_DECL, declarator, type); 509690075Sobrien DECL_NONADDRESSABLE_P (decl) = bitfield; 509790075Sobrien 509818334Speter if (size_varies) 509918334Speter C_DECL_VARIABLE_SIZE (decl) = 1; 510018334Speter } 510118334Speter else if (TREE_CODE (type) == FUNCTION_TYPE) 510218334Speter { 510318334Speter /* Every function declaration is "external" 510418334Speter except for those which are inside a function body 510518334Speter in which `auto' is used. 510618334Speter That is a case not specified by ANSI C, 510718334Speter and we use it for forward declarations for nested functions. */ 510818334Speter int extern_ref = (!(specbits & (1 << (int) RID_AUTO)) 510918334Speter || current_binding_level == global_binding_level); 511018334Speter 511118334Speter if (specbits & (1 << (int) RID_AUTO) 511218334Speter && (pedantic || current_binding_level == global_binding_level)) 511318334Speter pedwarn ("invalid storage class for function `%s'", name); 511418334Speter if (specbits & (1 << (int) RID_REGISTER)) 511518334Speter error ("invalid storage class for function `%s'", name); 511618334Speter /* Function declaration not at top level. 511718334Speter Storage classes other than `extern' are not allowed 511818334Speter and `extern' makes no difference. */ 511918334Speter if (current_binding_level != global_binding_level 512018334Speter && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE))) 512118334Speter && pedantic) 512218334Speter pedwarn ("invalid storage class for function `%s'", name); 512318334Speter 512418334Speter decl = build_decl (FUNCTION_DECL, declarator, type); 512590075Sobrien decl = build_decl_attribute_variant (decl, decl_attr); 512618334Speter 512790075Sobrien DECL_LANG_SPECIFIC (decl) = (struct lang_decl *) 512890075Sobrien ggc_alloc_cleared (sizeof (struct lang_decl)); 512990075Sobrien 513052284Sobrien if (pedantic && type_quals && ! DECL_IN_SYSTEM_HEADER (decl)) 513190075Sobrien pedwarn ("ISO C forbids qualified function types"); 513218334Speter 513352284Sobrien /* GNU C interprets a `volatile void' return type to indicate 513452284Sobrien that the function does not return. */ 513552284Sobrien if ((type_quals & TYPE_QUAL_VOLATILE) 513690075Sobrien && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) 513718334Speter warning ("`noreturn' function returns non-void value"); 513818334Speter 513918334Speter if (extern_ref) 514018334Speter DECL_EXTERNAL (decl) = 1; 514118334Speter /* Record absence of global scope for `static' or `auto'. */ 514218334Speter TREE_PUBLIC (decl) 514318334Speter = !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO))); 514418334Speter 514596263Sobrien if (defaulted_int) 514696263Sobrien C_FUNCTION_IMPLICIT_INT (decl) = 1; 514796263Sobrien 514818334Speter /* Record presence of `inline', if it is reasonable. */ 514990075Sobrien if (MAIN_NAME_P (declarator)) 515018334Speter { 515190075Sobrien if (inlinep) 515218334Speter warning ("cannot inline function `main'"); 515390075Sobrien } 515490075Sobrien else if (inlinep) 515590075Sobrien { 515690075Sobrien /* Assume that otherwise the function can be inlined. */ 515790075Sobrien DECL_DECLARED_INLINE_P (decl) = 1; 515818334Speter 515990075Sobrien /* Do not mark bare declarations as DECL_INLINE. Doing so 516090075Sobrien in the presence of multiple declarations can result in 516190075Sobrien the abstract origin pointing between the declarations, 516290075Sobrien which will confuse dwarf2out. */ 516390075Sobrien if (initialized) 516490075Sobrien { 516590075Sobrien DECL_INLINE (decl) = 1; 516690075Sobrien if (specbits & (1 << (int) RID_EXTERN)) 516790075Sobrien current_extern_inline = 1; 516890075Sobrien } 516918334Speter } 517090075Sobrien /* If -finline-functions, assume it can be inlined. This does 517190075Sobrien two things: let the function be deferred until it is actually 517290075Sobrien needed, and let dwarf2 know that the function is inlinable. */ 517390075Sobrien else if (flag_inline_trees == 2 && initialized) 517490075Sobrien { 517590075Sobrien DECL_INLINE (decl) = 1; 517690075Sobrien DECL_DECLARED_INLINE_P (decl) = 0; 517790075Sobrien } 517818334Speter } 517918334Speter else 518018334Speter { 518118334Speter /* It's a variable. */ 518218334Speter /* An uninitialized decl with `extern' is a reference. */ 518318334Speter int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN)); 518418334Speter 518518334Speter /* Move type qualifiers down to element of an array. */ 518652284Sobrien if (TREE_CODE (type) == ARRAY_TYPE && type_quals) 518718334Speter { 518890075Sobrien int saved_align = TYPE_ALIGN(type); 518952284Sobrien type = build_array_type (c_build_qualified_type (TREE_TYPE (type), 519052284Sobrien type_quals), 519118334Speter TYPE_DOMAIN (type)); 519290075Sobrien TYPE_ALIGN (type) = saved_align; 519318334Speter#if 0 /* Leave the variable const or volatile as well. */ 519452284Sobrien type_quals = TYPE_UNQUALIFIED; 519518334Speter#endif 519618334Speter } 519790075Sobrien else if (type_quals) 519890075Sobrien type = c_build_qualified_type (type, type_quals); 519990075Sobrien 520018334Speter decl = build_decl (VAR_DECL, declarator, type); 520118334Speter if (size_varies) 520218334Speter C_DECL_VARIABLE_SIZE (decl) = 1; 520318334Speter 520418334Speter if (inlinep) 520518334Speter pedwarn_with_decl (decl, "variable `%s' declared `inline'"); 520618334Speter 520718334Speter DECL_EXTERNAL (decl) = extern_ref; 520818334Speter /* At top level, the presence of a `static' or `register' storage 520918334Speter class specifier, or the absence of all storage class specifiers 521018334Speter makes this declaration a definition (perhaps tentative). Also, 521118334Speter the absence of both `static' and `register' makes it public. */ 521218334Speter if (current_binding_level == global_binding_level) 521318334Speter { 521418334Speter TREE_PUBLIC (decl) 521518334Speter = !(specbits 521618334Speter & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER))); 521718334Speter TREE_STATIC (decl) = ! DECL_EXTERNAL (decl); 521818334Speter } 521918334Speter /* Not at top level, only `static' makes a static definition. */ 522018334Speter else 522118334Speter { 522218334Speter TREE_STATIC (decl) = (specbits & (1 << (int) RID_STATIC)) != 0; 522318334Speter TREE_PUBLIC (decl) = DECL_EXTERNAL (decl); 522418334Speter } 522518334Speter } 522618334Speter 522718334Speter /* Record `register' declaration for warnings on & 522818334Speter and in case doing stupid register allocation. */ 522918334Speter 523018334Speter if (specbits & (1 << (int) RID_REGISTER)) 523118334Speter DECL_REGISTER (decl) = 1; 523218334Speter 523318334Speter /* Record constancy and volatility. */ 523452284Sobrien c_apply_type_quals_to_decl (type_quals, decl); 523518334Speter 523618334Speter /* If a type has volatile components, it should be stored in memory. 523718334Speter Otherwise, the fact that those components are volatile 523818334Speter will be ignored, and would even crash the compiler. */ 523918334Speter if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl))) 524018334Speter mark_addressable (decl); 524118334Speter 524290075Sobrien decl_attributes (&decl, returned_attrs, 0); 524318334Speter 524418334Speter return decl; 524518334Speter } 524618334Speter} 524718334Speter 524818334Speter/* Decode the parameter-list info for a function type or function definition. 524918334Speter The argument is the value returned by `get_parm_info' (or made in parse.y 525018334Speter if there is an identifier list instead of a parameter decl list). 525118334Speter These two functions are separate because when a function returns 525218334Speter or receives functions then each is called multiple times but the order 525318334Speter of calls is different. The last call to `grokparms' is always the one 525418334Speter that contains the formal parameter names of a function definition. 525518334Speter 525618334Speter Store in `last_function_parms' a chain of the decls of parms. 525718334Speter Also store in `last_function_parm_tags' a chain of the struct, union, 525818334Speter and enum tags declared among the parms. 525918334Speter 526018334Speter Return a list of arg types to use in the FUNCTION_TYPE for this function. 526118334Speter 526218334Speter FUNCDEF_FLAG is nonzero for a function definition, 0 for 526318334Speter a mere declaration. A nonempty identifier-list gets an error message 526418334Speter when FUNCDEF_FLAG is zero. */ 526518334Speter 526618334Speterstatic tree 526718334Spetergrokparms (parms_info, funcdef_flag) 526818334Speter tree parms_info; 526918334Speter int funcdef_flag; 527018334Speter{ 527118334Speter tree first_parm = TREE_CHAIN (parms_info); 527218334Speter 527318334Speter last_function_parms = TREE_PURPOSE (parms_info); 527418334Speter last_function_parm_tags = TREE_VALUE (parms_info); 527518334Speter 527618334Speter if (warn_strict_prototypes && first_parm == 0 && !funcdef_flag 527718334Speter && !in_system_header) 527818334Speter warning ("function declaration isn't a prototype"); 527918334Speter 528018334Speter if (first_parm != 0 528118334Speter && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE) 528218334Speter { 528318334Speter if (! funcdef_flag) 528418334Speter pedwarn ("parameter names (without types) in function declaration"); 528518334Speter 528618334Speter last_function_parms = first_parm; 528718334Speter return 0; 528818334Speter } 528918334Speter else 529018334Speter { 529118334Speter tree parm; 529218334Speter tree typelt; 529318334Speter /* We no longer test FUNCDEF_FLAG. 529418334Speter If the arg types are incomplete in a declaration, 529518334Speter they must include undefined tags. 529618334Speter These tags can never be defined in the scope of the declaration, 529718334Speter so the types can never be completed, 529818334Speter and no call can be compiled successfully. */ 529918334Speter#if 0 530018334Speter /* In a fcn definition, arg types must be complete. */ 530118334Speter if (funcdef_flag) 530218334Speter#endif 530318334Speter for (parm = last_function_parms, typelt = first_parm; 530418334Speter parm; 530518334Speter parm = TREE_CHAIN (parm)) 530618334Speter /* Skip over any enumeration constants declared here. */ 530718334Speter if (TREE_CODE (parm) == PARM_DECL) 530818334Speter { 530918334Speter /* Barf if the parameter itself has an incomplete type. */ 531018334Speter tree type = TREE_VALUE (typelt); 531190075Sobrien if (type == error_mark_node) 531290075Sobrien continue; 531390075Sobrien if (!COMPLETE_TYPE_P (type)) 531418334Speter { 531518334Speter if (funcdef_flag && DECL_NAME (parm) != 0) 531618334Speter error ("parameter `%s' has incomplete type", 531718334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 531818334Speter else 531918334Speter warning ("parameter has incomplete type"); 532018334Speter if (funcdef_flag) 532118334Speter { 532218334Speter TREE_VALUE (typelt) = error_mark_node; 532318334Speter TREE_TYPE (parm) = error_mark_node; 532418334Speter } 532518334Speter } 532690075Sobrien#if 0 532790075Sobrien /* This has been replaced by parm_tags_warning, which 532890075Sobrien uses a more accurate criterion for what to warn 532990075Sobrien about. */ 533018334Speter else 533118334Speter { 533218334Speter /* Now warn if is a pointer to an incomplete type. */ 533318334Speter while (TREE_CODE (type) == POINTER_TYPE 533418334Speter || TREE_CODE (type) == REFERENCE_TYPE) 533518334Speter type = TREE_TYPE (type); 533618334Speter type = TYPE_MAIN_VARIANT (type); 533790075Sobrien if (!COMPLETE_TYPE_P (type)) 533818334Speter { 533918334Speter if (DECL_NAME (parm) != 0) 534018334Speter warning ("parameter `%s' points to incomplete type", 534118334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 534218334Speter else 534318334Speter warning ("parameter points to incomplete type"); 534418334Speter } 534518334Speter } 534618334Speter#endif 534718334Speter typelt = TREE_CHAIN (typelt); 534818334Speter } 534918334Speter 535090075Sobrien return first_parm; 535118334Speter } 535218334Speter} 535318334Speter 535418334Speter/* Return a tree_list node with info on a parameter list just parsed. 535518334Speter The TREE_PURPOSE is a chain of decls of those parms. 535618334Speter The TREE_VALUE is a list of structure, union and enum tags defined. 535718334Speter The TREE_CHAIN is a list of argument types to go in the FUNCTION_TYPE. 535818334Speter This tree_list node is later fed to `grokparms'. 535918334Speter 536018334Speter VOID_AT_END nonzero means append `void' to the end of the type-list. 536118334Speter Zero means the parmlist ended with an ellipsis so don't append `void'. */ 536218334Speter 536318334Spetertree 536418334Speterget_parm_info (void_at_end) 536518334Speter int void_at_end; 536618334Speter{ 536790075Sobrien tree decl, t; 536890075Sobrien tree types = 0; 536918334Speter int erred = 0; 537018334Speter tree tags = gettags (); 537118334Speter tree parms = getdecls (); 537218334Speter tree new_parms = 0; 537318334Speter tree order = current_binding_level->parm_order; 537418334Speter 537590075Sobrien /* Just `void' (and no ellipsis) is special. There are really no parms. 537690075Sobrien But if the `void' is qualified (by `const' or `volatile') or has a 537790075Sobrien storage class specifier (`register'), then the behavior is undefined; 537890075Sobrien by not counting it as the special case of `void' we will cause an 537990075Sobrien error later. Typedefs for `void' are OK (see DR#157). */ 538018334Speter if (void_at_end && parms != 0 538118334Speter && TREE_CHAIN (parms) == 0 538290075Sobrien && VOID_TYPE_P (TREE_TYPE (parms)) 538390075Sobrien && ! TREE_THIS_VOLATILE (parms) 538490075Sobrien && ! TREE_READONLY (parms) 538590075Sobrien && ! DECL_REGISTER (parms) 538618334Speter && DECL_NAME (parms) == 0) 538718334Speter { 538818334Speter parms = NULL_TREE; 538918334Speter storedecls (NULL_TREE); 539090075Sobrien return tree_cons (NULL_TREE, NULL_TREE, 539190075Sobrien tree_cons (NULL_TREE, void_type_node, NULL_TREE)); 539218334Speter } 539318334Speter 539418334Speter /* Extract enumerator values and other non-parms declared with the parms. 539518334Speter Likewise any forward parm decls that didn't have real parm decls. */ 539690075Sobrien for (decl = parms; decl;) 539718334Speter { 539818334Speter tree next = TREE_CHAIN (decl); 539918334Speter 540018334Speter if (TREE_CODE (decl) != PARM_DECL) 540118334Speter { 540218334Speter TREE_CHAIN (decl) = new_parms; 540318334Speter new_parms = decl; 540418334Speter } 540518334Speter else if (TREE_ASM_WRITTEN (decl)) 540618334Speter { 540790075Sobrien error_with_decl (decl, 540890075Sobrien "parameter `%s' has just a forward declaration"); 540918334Speter TREE_CHAIN (decl) = new_parms; 541018334Speter new_parms = decl; 541118334Speter } 541218334Speter decl = next; 541318334Speter } 541418334Speter 541518334Speter /* Put the parm decls back in the order they were in in the parm list. */ 541618334Speter for (t = order; t; t = TREE_CHAIN (t)) 541718334Speter { 541818334Speter if (TREE_CHAIN (t)) 541918334Speter TREE_CHAIN (TREE_VALUE (t)) = TREE_VALUE (TREE_CHAIN (t)); 542018334Speter else 542118334Speter TREE_CHAIN (TREE_VALUE (t)) = 0; 542218334Speter } 542318334Speter 542418334Speter new_parms = chainon (order ? nreverse (TREE_VALUE (order)) : 0, 542518334Speter new_parms); 542618334Speter 542718334Speter /* Store the parmlist in the binding level since the old one 542818334Speter is no longer a valid list. (We have changed the chain pointers.) */ 542918334Speter storedecls (new_parms); 543018334Speter 543118334Speter for (decl = new_parms; decl; decl = TREE_CHAIN (decl)) 543218334Speter /* There may also be declarations for enumerators if an enumeration 543318334Speter type is declared among the parms. Ignore them here. */ 543418334Speter if (TREE_CODE (decl) == PARM_DECL) 543518334Speter { 543618334Speter /* Since there is a prototype, 543718334Speter args are passed in their declared types. */ 543818334Speter tree type = TREE_TYPE (decl); 543918334Speter DECL_ARG_TYPE (decl) = type; 544090075Sobrien if (PROMOTE_PROTOTYPES 544190075Sobrien && INTEGRAL_TYPE_P (type) 544218334Speter && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) 544318334Speter DECL_ARG_TYPE (decl) = integer_type_node; 544418334Speter 544590075Sobrien types = tree_cons (NULL_TREE, TREE_TYPE (decl), types); 544690075Sobrien if (VOID_TYPE_P (TREE_VALUE (types)) && ! erred 544718334Speter && DECL_NAME (decl) == 0) 544818334Speter { 544918334Speter error ("`void' in parameter list must be the entire list"); 545018334Speter erred = 1; 545118334Speter } 545218334Speter } 545318334Speter 545418334Speter if (void_at_end) 545590075Sobrien return tree_cons (new_parms, tags, 545690075Sobrien nreverse (tree_cons (NULL_TREE, void_type_node, types))); 545718334Speter 545890075Sobrien return tree_cons (new_parms, tags, nreverse (types)); 545918334Speter} 546018334Speter 546118334Speter/* At end of parameter list, warn about any struct, union or enum tags 546218334Speter defined within. Do so because these types cannot ever become complete. */ 546318334Speter 546418334Spetervoid 546518334Speterparmlist_tags_warning () 546618334Speter{ 546718334Speter tree elt; 546818334Speter static int already; 546918334Speter 547018334Speter for (elt = current_binding_level->tags; elt; elt = TREE_CHAIN (elt)) 547118334Speter { 547218334Speter enum tree_code code = TREE_CODE (TREE_VALUE (elt)); 547318334Speter /* An anonymous union parm type is meaningful as a GNU extension. 547418334Speter So don't warn for that. */ 547550397Sobrien if (code == UNION_TYPE && TREE_PURPOSE (elt) == 0 && !pedantic) 547618334Speter continue; 547718334Speter if (TREE_PURPOSE (elt) != 0) 547890075Sobrien { 547990075Sobrien if (code == RECORD_TYPE) 548090075Sobrien warning ("`struct %s' declared inside parameter list", 548190075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (elt))); 548290075Sobrien else if (code == UNION_TYPE) 548390075Sobrien warning ("`union %s' declared inside parameter list", 548490075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (elt))); 548590075Sobrien else 548690075Sobrien warning ("`enum %s' declared inside parameter list", 548790075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (elt))); 548890075Sobrien } 548918334Speter else 549090075Sobrien { 549190075Sobrien /* For translation these need to be separate warnings */ 549290075Sobrien if (code == RECORD_TYPE) 549390075Sobrien warning ("anonymous struct declared inside parameter list"); 549490075Sobrien else if (code == UNION_TYPE) 549590075Sobrien warning ("anonymous union declared inside parameter list"); 549690075Sobrien else 549790075Sobrien warning ("anonymous enum declared inside parameter list"); 549890075Sobrien } 549918334Speter if (! already) 550018334Speter { 550190075Sobrien warning ("its scope is only this definition or declaration, which is probably not what you want"); 550218334Speter already = 1; 550318334Speter } 550418334Speter } 550518334Speter} 550618334Speter 550718334Speter/* Get the struct, enum or union (CODE says which) with tag NAME. 550818334Speter Define the tag as a forward-reference if it is not defined. */ 550918334Speter 551018334Spetertree 551118334Speterxref_tag (code, name) 551218334Speter enum tree_code code; 551318334Speter tree name; 551418334Speter{ 551518334Speter /* If a cross reference is requested, look up the type 551618334Speter already defined for this tag and return it. */ 551718334Speter 551890075Sobrien tree ref = lookup_tag (code, name, current_binding_level, 0); 551990075Sobrien /* If this is the right type of tag, return what we found. 552090075Sobrien (This reference will be shadowed by shadow_tag later if appropriate.) 552190075Sobrien If this is the wrong type of tag, do not return it. If it was the 552290075Sobrien wrong type in the same binding level, we will have had an error 552390075Sobrien message already; if in a different binding level and declaring 552490075Sobrien a name, pending_xref_error will give an error message; but if in a 552590075Sobrien different binding level and not declaring a name, this tag should 552690075Sobrien shadow the previous declaration of a different type of tag, and 552790075Sobrien this would not work properly if we return the reference found. 552890075Sobrien (For example, with "struct foo" in an outer scope, "union foo;" 552990075Sobrien must shadow that tag with a new one of union type.) */ 553090075Sobrien if (ref && TREE_CODE (ref) == code) 553118334Speter return ref; 553218334Speter 553318334Speter /* If no such tag is yet defined, create a forward-reference node 553418334Speter and record it as the "definition". 553518334Speter When a real declaration of this type is found, 553618334Speter the forward-reference will be altered into a real type. */ 553718334Speter 553818334Speter ref = make_node (code); 553918334Speter if (code == ENUMERAL_TYPE) 554018334Speter { 554118334Speter /* Give the type a default layout like unsigned int 554218334Speter to avoid crashing if it does not get defined. */ 554318334Speter TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node); 554418334Speter TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node); 554590075Sobrien TYPE_USER_ALIGN (ref) = 0; 554618334Speter TREE_UNSIGNED (ref) = 1; 554718334Speter TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node); 554818334Speter TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node); 554918334Speter TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node); 555018334Speter } 555118334Speter 555218334Speter pushtag (name, ref); 555318334Speter 555418334Speter return ref; 555518334Speter} 555618334Speter 555718334Speter/* Make sure that the tag NAME is defined *in the current binding level* 555818334Speter at least as a forward reference. 555990075Sobrien CODE says which kind of tag NAME ought to be. */ 556018334Speter 556118334Spetertree 556218334Speterstart_struct (code, name) 556318334Speter enum tree_code code; 556418334Speter tree name; 556518334Speter{ 556618334Speter /* If there is already a tag defined at this binding level 556718334Speter (as a forward reference), just return it. */ 556818334Speter 556990075Sobrien tree ref = 0; 557018334Speter 557118334Speter if (name != 0) 557218334Speter ref = lookup_tag (code, name, current_binding_level, 1); 557318334Speter if (ref && TREE_CODE (ref) == code) 557418334Speter { 557518334Speter C_TYPE_BEING_DEFINED (ref) = 1; 557650397Sobrien TYPE_PACKED (ref) = flag_pack_struct; 557718334Speter if (TYPE_FIELDS (ref)) 557890075Sobrien { 557990075Sobrien if (code == UNION_TYPE) 558090075Sobrien error ("redefinition of `union %s'", 558190075Sobrien IDENTIFIER_POINTER (name)); 558290075Sobrien else 558390075Sobrien error ("redefinition of `struct %s'", 558490075Sobrien IDENTIFIER_POINTER (name)); 558590075Sobrien } 558618334Speter 558718334Speter return ref; 558818334Speter } 558918334Speter 559018334Speter /* Otherwise create a forward-reference just so the tag is in scope. */ 559118334Speter 559218334Speter ref = make_node (code); 559318334Speter pushtag (name, ref); 559418334Speter C_TYPE_BEING_DEFINED (ref) = 1; 559550397Sobrien TYPE_PACKED (ref) = flag_pack_struct; 559618334Speter return ref; 559718334Speter} 559818334Speter 559918334Speter/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted) 560018334Speter of a structure component, returning a FIELD_DECL node. 560196263Sobrien WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. 560218334Speter 560318334Speter This is done during the parsing of the struct declaration. 560418334Speter The FIELD_DECL nodes are chained together and the lot of them 560518334Speter are ultimately passed to `build_struct' to make the RECORD_TYPE node. */ 560618334Speter 560718334Spetertree 560818334Spetergrokfield (filename, line, declarator, declspecs, width) 560952284Sobrien const char *filename ATTRIBUTE_UNUSED; 561052284Sobrien int line ATTRIBUTE_UNUSED; 561118334Speter tree declarator, declspecs, width; 561218334Speter{ 561318334Speter tree value; 561418334Speter 561590075Sobrien if (declarator == NULL_TREE && width == NULL_TREE) 561690075Sobrien { 561790075Sobrien /* This is an unnamed decl. We only support unnamed 561890075Sobrien structs/unions, so check for other things and refuse them. */ 5619102790Skan tree type = TREE_VALUE (declspecs); 5620102790Skan 5621102790Skan if (TREE_CODE (type) == TYPE_DECL) 5622102790Skan type = TREE_TYPE (type); 5623102790Skan if (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE) 562490075Sobrien { 562590075Sobrien error ("unnamed fields of type other than struct or union are not allowed"); 562690075Sobrien return NULL_TREE; 562790075Sobrien } 562890075Sobrien } 562918334Speter 563096263Sobrien value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0); 563118334Speter 563218334Speter finish_decl (value, NULL_TREE, NULL_TREE); 563396263Sobrien DECL_INITIAL (value) = width; 563418334Speter 563518334Speter maybe_objc_check_decl (value); 563618334Speter return value; 563718334Speter} 563818334Speter 563918334Speter/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T. 564018334Speter FIELDLIST is a chain of FIELD_DECL nodes for the fields. 564190075Sobrien ATTRIBUTES are attributes to be applied to the structure. */ 564218334Speter 564318334Spetertree 564418334Speterfinish_struct (t, fieldlist, attributes) 564518334Speter tree t; 564618334Speter tree fieldlist; 564718334Speter tree attributes; 564818334Speter{ 564990075Sobrien tree x; 565018334Speter int toplevel = global_binding_level == current_binding_level; 565190075Sobrien int saw_named_field; 565218334Speter 565318334Speter /* If this type was previously laid out as a forward reference, 565418334Speter make sure we lay it out again. */ 565518334Speter 565618334Speter TYPE_SIZE (t) = 0; 565718334Speter 565890075Sobrien decl_attributes (&t, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE); 565918334Speter 566018334Speter /* Nameless union parm types are useful as GCC extension. */ 566118334Speter if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic) 566218334Speter /* Otherwise, warn about any struct or union def. in parmlist. */ 566318334Speter if (in_parm_level_p ()) 566418334Speter { 566518334Speter if (pedantic) 566690075Sobrien pedwarn ("%s defined inside parms", 566790075Sobrien TREE_CODE (t) == UNION_TYPE ? _("union") : _("structure")); 566818334Speter else if (! flag_traditional) 566990075Sobrien warning ("%s defined inside parms", 567090075Sobrien TREE_CODE (t) == UNION_TYPE ? _("union") : _("structure")); 567118334Speter } 567218334Speter 567350397Sobrien if (pedantic) 567450397Sobrien { 567550397Sobrien for (x = fieldlist; x; x = TREE_CHAIN (x)) 567650397Sobrien if (DECL_NAME (x) != 0) 567750397Sobrien break; 567818334Speter 567950397Sobrien if (x == 0) 568090075Sobrien pedwarn ("%s has no %s", 568190075Sobrien TREE_CODE (t) == UNION_TYPE ? _("union") : _("struct"), 568290075Sobrien fieldlist ? _("named members") : _("members")); 568350397Sobrien } 568450397Sobrien 568596263Sobrien /* Install struct as DECL_CONTEXT of each field decl. 568696263Sobrien Also process specified field sizes,m which is found in the DECL_INITIAL. 568796263Sobrien Store 0 there, except for ": 0" fields (so we can find them 568896263Sobrien and delete them, below). */ 568918334Speter 569090075Sobrien saw_named_field = 0; 569118334Speter for (x = fieldlist; x; x = TREE_CHAIN (x)) 569218334Speter { 569318334Speter DECL_CONTEXT (x) = t; 569418334Speter DECL_PACKED (x) |= TYPE_PACKED (t); 569518334Speter 569618334Speter /* If any field is const, the structure type is pseudo-const. */ 569718334Speter if (TREE_READONLY (x)) 569818334Speter C_TYPE_FIELDS_READONLY (t) = 1; 569918334Speter else 570018334Speter { 570118334Speter /* A field that is pseudo-const makes the structure likewise. */ 570218334Speter tree t1 = TREE_TYPE (x); 570318334Speter while (TREE_CODE (t1) == ARRAY_TYPE) 570418334Speter t1 = TREE_TYPE (t1); 570518334Speter if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE) 570618334Speter && C_TYPE_FIELDS_READONLY (t1)) 570718334Speter C_TYPE_FIELDS_READONLY (t) = 1; 570818334Speter } 570918334Speter 571018334Speter /* Any field that is volatile means variables of this type must be 571118334Speter treated in some ways as volatile. */ 571218334Speter if (TREE_THIS_VOLATILE (x)) 571318334Speter C_TYPE_FIELDS_VOLATILE (t) = 1; 571418334Speter 571518334Speter /* Any field of nominal variable size implies structure is too. */ 571618334Speter if (C_DECL_VARIABLE_SIZE (x)) 571718334Speter C_TYPE_VARIABLE_SIZE (t) = 1; 571818334Speter 571918334Speter /* Detect invalid nested redefinition. */ 572018334Speter if (TREE_TYPE (x) == t) 572118334Speter error ("nested redefinition of `%s'", 572218334Speter IDENTIFIER_POINTER (TYPE_NAME (t))); 572318334Speter 572496263Sobrien /* Detect invalid bit-field size. */ 572596263Sobrien if (DECL_INITIAL (x)) 572696263Sobrien STRIP_NOPS (DECL_INITIAL (x)); 572796263Sobrien if (DECL_INITIAL (x)) 572818334Speter { 572996263Sobrien if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST) 573096263Sobrien constant_expression_warning (DECL_INITIAL (x)); 573196263Sobrien else 573296263Sobrien { 573396263Sobrien error_with_decl (x, 573496263Sobrien "bit-field `%s' width not an integer constant"); 573596263Sobrien DECL_INITIAL (x) = NULL; 573696263Sobrien } 573796263Sobrien } 573896263Sobrien 573996263Sobrien /* Detect invalid bit-field type. */ 574096263Sobrien if (DECL_INITIAL (x) 574196263Sobrien && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE 574296263Sobrien && TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE 574396263Sobrien && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE) 574496263Sobrien { 574596263Sobrien error_with_decl (x, "bit-field `%s' has invalid type"); 574696263Sobrien DECL_INITIAL (x) = NULL; 574796263Sobrien } 574896263Sobrien 574996263Sobrien if (DECL_INITIAL (x) && pedantic 575096263Sobrien && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node 575196263Sobrien && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node 575296263Sobrien && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != c_bool_type_node 575396263Sobrien /* Accept an enum that's equivalent to int or unsigned int. */ 575496263Sobrien && !(TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE 575596263Sobrien && (TYPE_PRECISION (TREE_TYPE (x)) 575696263Sobrien == TYPE_PRECISION (integer_type_node)))) 575796263Sobrien pedwarn_with_decl (x, "bit-field `%s' type invalid in ISO C"); 575896263Sobrien 575996263Sobrien /* Detect and ignore out of range field width and process valid 576096263Sobrien field widths. */ 576196263Sobrien if (DECL_INITIAL (x)) 576296263Sobrien { 576396263Sobrien int max_width 576496263Sobrien = (TYPE_MAIN_VARIANT (TREE_TYPE (x)) == c_bool_type_node 576596263Sobrien ? CHAR_TYPE_SIZE : TYPE_PRECISION (TREE_TYPE (x))); 576696263Sobrien 576796263Sobrien if (tree_int_cst_sgn (DECL_INITIAL (x)) < 0) 576896263Sobrien error_with_decl (x, "negative width in bit-field `%s'"); 576996263Sobrien else if (0 < compare_tree_int (DECL_INITIAL (x), max_width)) 577096263Sobrien pedwarn_with_decl (x, "width of `%s' exceeds its type"); 577196263Sobrien else if (integer_zerop (DECL_INITIAL (x)) && DECL_NAME (x) != 0) 577296263Sobrien error_with_decl (x, "zero width for bit-field `%s'"); 577396263Sobrien else 577496263Sobrien { 577596263Sobrien /* The test above has assured us that TREE_INT_CST_HIGH is 0. */ 577696263Sobrien unsigned HOST_WIDE_INT width 577796263Sobrien = tree_low_cst (DECL_INITIAL (x), 1); 577896263Sobrien 577996263Sobrien if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE 578096263Sobrien && (width < min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)), 578196263Sobrien TREE_UNSIGNED (TREE_TYPE (x))) 578296263Sobrien || (width 578396263Sobrien < min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)), 578496263Sobrien TREE_UNSIGNED (TREE_TYPE (x)))))) 578596263Sobrien warning_with_decl (x, 578696263Sobrien "`%s' is narrower than values of its type"); 578796263Sobrien 578896263Sobrien DECL_SIZE (x) = bitsize_int (width); 578996263Sobrien DECL_BIT_FIELD (x) = 1; 579096263Sobrien SET_DECL_C_BIT_FIELD (x); 579196263Sobrien 579296263Sobrien if (width == 0 579396263Sobrien && ! (* targetm.ms_bitfield_layout_p) (t)) 579496263Sobrien { 579596263Sobrien /* field size 0 => force desired amount of alignment. */ 579696263Sobrien#ifdef EMPTY_FIELD_BOUNDARY 579796263Sobrien DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY); 579896263Sobrien#endif 579996263Sobrien#ifdef PCC_BITFIELD_TYPE_MATTERS 580096263Sobrien if (PCC_BITFIELD_TYPE_MATTERS) 580196263Sobrien { 580296263Sobrien DECL_ALIGN (x) = MAX (DECL_ALIGN (x), 580396263Sobrien TYPE_ALIGN (TREE_TYPE (x))); 580496263Sobrien DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x)); 580596263Sobrien } 580696263Sobrien#endif 580796263Sobrien } 580896263Sobrien } 580996263Sobrien } 581096263Sobrien 581196263Sobrien else if (TREE_TYPE (x) != error_mark_node) 581296263Sobrien { 581390075Sobrien unsigned int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT 581490075Sobrien : TYPE_ALIGN (TREE_TYPE (x))); 581518334Speter 581690075Sobrien /* Non-bit-fields are aligned for their type, except packed 581790075Sobrien fields which require only BITS_PER_UNIT alignment. */ 581890075Sobrien DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align); 581990075Sobrien if (! DECL_PACKED (x)) 582090075Sobrien DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x)); 582118334Speter } 582218334Speter 582396263Sobrien DECL_INITIAL (x) = 0; 582496263Sobrien 582590075Sobrien /* Detect flexible array member in an invalid context. */ 582690075Sobrien if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE 582790075Sobrien && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE 582890075Sobrien && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE 582990075Sobrien && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE) 583018334Speter { 583190075Sobrien if (TREE_CODE (t) == UNION_TYPE) 583290075Sobrien error_with_decl (x, "flexible array member in union"); 583390075Sobrien else if (TREE_CHAIN (x) != NULL_TREE) 583490075Sobrien error_with_decl (x, "flexible array member not at end of struct"); 583590075Sobrien else if (! saw_named_field) 583690075Sobrien error_with_decl (x, "flexible array member in otherwise empty struct"); 583718334Speter } 583890075Sobrien if (DECL_NAME (x)) 583990075Sobrien saw_named_field = 1; 584018334Speter } 584118334Speter 584218334Speter /* Delete all duplicate fields from the fieldlist */ 584318334Speter for (x = fieldlist; x && TREE_CHAIN (x);) 584418334Speter /* Anonymous fields aren't duplicates. */ 584518334Speter if (DECL_NAME (TREE_CHAIN (x)) == 0) 584618334Speter x = TREE_CHAIN (x); 584718334Speter else 584818334Speter { 584990075Sobrien tree y = fieldlist; 585090075Sobrien 585118334Speter while (1) 585218334Speter { 585318334Speter if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x))) 585418334Speter break; 585518334Speter if (y == x) 585618334Speter break; 585718334Speter y = TREE_CHAIN (y); 585818334Speter } 585918334Speter if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x))) 586018334Speter { 586118334Speter error_with_decl (TREE_CHAIN (x), "duplicate member `%s'"); 586218334Speter TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x)); 586318334Speter } 586490075Sobrien else 586590075Sobrien x = TREE_CHAIN (x); 586618334Speter } 586718334Speter 586818334Speter /* Now we have the nearly final fieldlist. Record it, 586918334Speter then lay out the structure or union (including the fields). */ 587018334Speter 587118334Speter TYPE_FIELDS (t) = fieldlist; 587218334Speter 587318334Speter layout_type (t); 587418334Speter 587590075Sobrien /* Delete all zero-width bit-fields from the fieldlist */ 587690075Sobrien { 587790075Sobrien tree *fieldlistp = &fieldlist; 587890075Sobrien while (*fieldlistp) 587990075Sobrien if (TREE_CODE (*fieldlistp) == FIELD_DECL && DECL_INITIAL (*fieldlistp)) 588090075Sobrien *fieldlistp = TREE_CHAIN (*fieldlistp); 588190075Sobrien else 588290075Sobrien fieldlistp = &TREE_CHAIN (*fieldlistp); 588390075Sobrien } 588418334Speter 588590075Sobrien /* Now we have the truly final field list. 588690075Sobrien Store it in this type and in the variants. */ 588718334Speter 588818334Speter TYPE_FIELDS (t) = fieldlist; 588918334Speter 589018334Speter for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x)) 589118334Speter { 589218334Speter TYPE_FIELDS (x) = TYPE_FIELDS (t); 589318334Speter TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t); 589418334Speter TYPE_ALIGN (x) = TYPE_ALIGN (t); 589590075Sobrien TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (t); 589618334Speter } 589718334Speter 589818334Speter /* If this was supposed to be a transparent union, but we can't 589918334Speter make it one, warn and turn off the flag. */ 590018334Speter if (TREE_CODE (t) == UNION_TYPE 590118334Speter && TYPE_TRANSPARENT_UNION (t) 590218334Speter && TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t))) 590318334Speter { 590418334Speter TYPE_TRANSPARENT_UNION (t) = 0; 590550397Sobrien warning ("union cannot be made transparent"); 590618334Speter } 590718334Speter 590818334Speter /* If this structure or union completes the type of any previous 590918334Speter variable declaration, lay it out and output its rtl. */ 591018334Speter 591118334Speter if (current_binding_level->n_incomplete != 0) 591218334Speter { 591318334Speter tree decl; 591418334Speter for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl)) 591518334Speter { 591690075Sobrien if (TYPE_MAIN_VARIANT (TREE_TYPE (decl)) == TYPE_MAIN_VARIANT (t) 591718334Speter && TREE_CODE (decl) != TYPE_DECL) 591818334Speter { 591918334Speter layout_decl (decl, 0); 592018334Speter /* This is a no-op in c-lang.c or something real in objc-actions.c. */ 592118334Speter maybe_objc_check_decl (decl); 592290075Sobrien rest_of_decl_compilation (decl, NULL, toplevel, 0); 592318334Speter if (! toplevel) 592418334Speter expand_decl (decl); 592590075Sobrien if (--current_binding_level->n_incomplete == 0) 592690075Sobrien break; 592718334Speter } 592890075Sobrien else if (!COMPLETE_TYPE_P (TREE_TYPE (decl)) 592918334Speter && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) 593018334Speter { 593118334Speter tree element = TREE_TYPE (decl); 593218334Speter while (TREE_CODE (element) == ARRAY_TYPE) 593318334Speter element = TREE_TYPE (element); 593418334Speter if (element == t) 593590075Sobrien { 593690075Sobrien layout_array_type (TREE_TYPE (decl)); 593790075Sobrien if (TREE_CODE (decl) != TYPE_DECL) 593890075Sobrien { 593990075Sobrien layout_decl (decl, 0); 594090075Sobrien maybe_objc_check_decl (decl); 594190075Sobrien rest_of_decl_compilation (decl, NULL, toplevel, 0); 594290075Sobrien if (! toplevel) 594390075Sobrien expand_decl (decl); 594490075Sobrien } 594590075Sobrien if (--current_binding_level->n_incomplete == 0) 594690075Sobrien break; 594790075Sobrien } 594818334Speter } 594918334Speter } 595018334Speter } 595118334Speter 595218334Speter /* Finish debugging output for this type. */ 595318334Speter rest_of_type_compilation (t, toplevel); 595418334Speter 595518334Speter return t; 595618334Speter} 595718334Speter 595818334Speter/* Lay out the type T, and its element type, and so on. */ 595918334Speter 596018334Speterstatic void 596118334Speterlayout_array_type (t) 596218334Speter tree t; 596318334Speter{ 596418334Speter if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) 596518334Speter layout_array_type (TREE_TYPE (t)); 596618334Speter layout_type (t); 596718334Speter} 596818334Speter 596918334Speter/* Begin compiling the definition of an enumeration type. 597018334Speter NAME is its name (or null if anonymous). 597118334Speter Returns the type object, as yet incomplete. 597218334Speter Also records info about it so that build_enumerator 597318334Speter may be used to declare the individual values as they are read. */ 597418334Speter 597518334Spetertree 597618334Speterstart_enum (name) 597718334Speter tree name; 597818334Speter{ 597990075Sobrien tree enumtype = 0; 598018334Speter 598118334Speter /* If this is the real definition for a previous forward reference, 598218334Speter fill in the contents in the same object that used to be the 598318334Speter forward reference. */ 598418334Speter 598518334Speter if (name != 0) 598618334Speter enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1); 598718334Speter 598818334Speter if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE) 598918334Speter { 599018334Speter enumtype = make_node (ENUMERAL_TYPE); 599118334Speter pushtag (name, enumtype); 599218334Speter } 599318334Speter 599418334Speter C_TYPE_BEING_DEFINED (enumtype) = 1; 599518334Speter 599618334Speter if (TYPE_VALUES (enumtype) != 0) 599718334Speter { 599818334Speter /* This enum is a named one that has been declared already. */ 599918334Speter error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name)); 600018334Speter 600118334Speter /* Completely replace its old definition. 600218334Speter The old enumerators remain defined, however. */ 600318334Speter TYPE_VALUES (enumtype) = 0; 600418334Speter } 600518334Speter 600618334Speter enum_next_value = integer_zero_node; 600718334Speter enum_overflow = 0; 600818334Speter 600950397Sobrien if (flag_short_enums) 601050397Sobrien TYPE_PACKED (enumtype) = 1; 601150397Sobrien 601218334Speter return enumtype; 601318334Speter} 601418334Speter 601518334Speter/* After processing and defining all the values of an enumeration type, 601618334Speter install their decls in the enumeration type and finish it off. 601718334Speter ENUMTYPE is the type object, VALUES a list of decl-value pairs, 601818334Speter and ATTRIBUTES are the specified attributes. 601918334Speter Returns ENUMTYPE. */ 602018334Speter 602118334Spetertree 602218334Speterfinish_enum (enumtype, values, attributes) 602318334Speter tree enumtype; 602418334Speter tree values; 602518334Speter tree attributes; 602618334Speter{ 602790075Sobrien tree pair, tem; 602890075Sobrien tree minnode = 0, maxnode = 0, enum_value_type; 602990075Sobrien int precision, unsign; 603090075Sobrien int toplevel = (global_binding_level == current_binding_level); 603118334Speter 603218334Speter if (in_parm_level_p ()) 603318334Speter warning ("enum defined inside parms"); 603418334Speter 603590075Sobrien decl_attributes (&enumtype, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE); 603618334Speter 603718334Speter /* Calculate the maximum value of any enumerator in this type. */ 603818334Speter 603918334Speter if (values == error_mark_node) 604018334Speter minnode = maxnode = integer_zero_node; 604118334Speter else 604290075Sobrien { 604390075Sobrien minnode = maxnode = TREE_VALUE (values); 604490075Sobrien for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair)) 604590075Sobrien { 604690075Sobrien tree value = TREE_VALUE (pair); 604790075Sobrien if (tree_int_cst_lt (maxnode, value)) 604890075Sobrien maxnode = value; 604990075Sobrien if (tree_int_cst_lt (value, minnode)) 605090075Sobrien minnode = value; 605190075Sobrien } 605290075Sobrien } 605318334Speter 605490075Sobrien /* Construct the final type of this enumeration. It is the same 605590075Sobrien as one of the integral types - the narrowest one that fits, except 605690075Sobrien that normally we only go as narrow as int - and signed iff any of 605790075Sobrien the values are negative. */ 605890075Sobrien unsign = (tree_int_cst_sgn (minnode) >= 0); 605990075Sobrien precision = MAX (min_precision (minnode, unsign), 606090075Sobrien min_precision (maxnode, unsign)); 606150397Sobrien if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node)) 606250397Sobrien { 606390075Sobrien tree narrowest = type_for_size (precision, unsign); 606450397Sobrien if (narrowest == 0) 606550397Sobrien { 606650397Sobrien warning ("enumeration values exceed range of largest integer"); 606750397Sobrien narrowest = long_long_integer_type_node; 606850397Sobrien } 606950397Sobrien 607090075Sobrien precision = TYPE_PRECISION (narrowest); 607150397Sobrien } 607218334Speter else 607390075Sobrien precision = TYPE_PRECISION (integer_type_node); 607418334Speter 607590075Sobrien if (precision == TYPE_PRECISION (integer_type_node)) 607690075Sobrien enum_value_type = type_for_size (precision, 0); 607790075Sobrien else 607890075Sobrien enum_value_type = enumtype; 607990075Sobrien 608090075Sobrien TYPE_MIN_VALUE (enumtype) = minnode; 608190075Sobrien TYPE_MAX_VALUE (enumtype) = maxnode; 608290075Sobrien TYPE_PRECISION (enumtype) = precision; 608390075Sobrien TREE_UNSIGNED (enumtype) = unsign; 608418334Speter TYPE_SIZE (enumtype) = 0; 608518334Speter layout_type (enumtype); 608618334Speter 608718334Speter if (values != error_mark_node) 608818334Speter { 608990075Sobrien /* Change the type of the enumerators to be the enum type. We 609090075Sobrien need to do this irrespective of the size of the enum, for 609190075Sobrien proper type checking. Replace the DECL_INITIALs of the 609290075Sobrien enumerators, and the value slots of the list, with copies 609390075Sobrien that have the enum type; they cannot be modified in place 609490075Sobrien because they may be shared (e.g. integer_zero_node) Finally, 609590075Sobrien change the purpose slots to point to the names of the decls. */ 609618334Speter for (pair = values; pair; pair = TREE_CHAIN (pair)) 609718334Speter { 609890075Sobrien tree enu = TREE_PURPOSE (pair); 609990075Sobrien 610090075Sobrien TREE_TYPE (enu) = enumtype; 610190075Sobrien DECL_SIZE (enu) = TYPE_SIZE (enumtype); 610290075Sobrien DECL_SIZE_UNIT (enu) = TYPE_SIZE_UNIT (enumtype); 610390075Sobrien DECL_ALIGN (enu) = TYPE_ALIGN (enumtype); 610490075Sobrien DECL_USER_ALIGN (enu) = TYPE_USER_ALIGN (enumtype); 610590075Sobrien DECL_MODE (enu) = TYPE_MODE (enumtype); 610690075Sobrien 610790075Sobrien /* The ISO C Standard mandates enumerators to have type int, 610890075Sobrien even though the underlying type of an enum type is 610990075Sobrien unspecified. Here we convert any enumerators that fit in 611090075Sobrien an int to type int, to avoid promotions to unsigned types 611190075Sobrien when comparing integers with enumerators that fit in the 611290075Sobrien int range. When -pedantic is given, build_enumerator() 611390075Sobrien would have already taken care of those that don't fit. */ 611490075Sobrien if (int_fits_type_p (DECL_INITIAL (enu), enum_value_type)) 611590075Sobrien DECL_INITIAL (enu) = convert (enum_value_type, DECL_INITIAL (enu)); 611690075Sobrien else 611790075Sobrien DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu)); 611890075Sobrien 611990075Sobrien TREE_PURPOSE (pair) = DECL_NAME (enu); 612090075Sobrien TREE_VALUE (pair) = DECL_INITIAL (enu); 612118334Speter } 612218334Speter 612318334Speter TYPE_VALUES (enumtype) = values; 612418334Speter } 612518334Speter 612618334Speter /* Fix up all variant types of this enum type. */ 612718334Speter for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem)) 612818334Speter { 612990075Sobrien if (tem == enumtype) 613090075Sobrien continue; 613118334Speter TYPE_VALUES (tem) = TYPE_VALUES (enumtype); 613218334Speter TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype); 613318334Speter TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype); 613418334Speter TYPE_SIZE (tem) = TYPE_SIZE (enumtype); 613550397Sobrien TYPE_SIZE_UNIT (tem) = TYPE_SIZE_UNIT (enumtype); 613618334Speter TYPE_MODE (tem) = TYPE_MODE (enumtype); 613718334Speter TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype); 613818334Speter TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype); 613990075Sobrien TYPE_USER_ALIGN (tem) = TYPE_USER_ALIGN (enumtype); 614018334Speter TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype); 614118334Speter } 614218334Speter 614318334Speter /* Finish debugging output for this type. */ 614418334Speter rest_of_type_compilation (enumtype, toplevel); 614518334Speter 614618334Speter return enumtype; 614718334Speter} 614818334Speter 614918334Speter/* Build and install a CONST_DECL for one value of the 615018334Speter current enumeration type (one that was begun with start_enum). 615118334Speter Return a tree-list containing the CONST_DECL and its value. 615218334Speter Assignment of sequential values by default is handled here. */ 615318334Speter 615418334Spetertree 615518334Speterbuild_enumerator (name, value) 615618334Speter tree name, value; 615718334Speter{ 615890075Sobrien tree decl, type; 615918334Speter 616018334Speter /* Validate and default VALUE. */ 616118334Speter 616218334Speter /* Remove no-op casts from the value. */ 616318334Speter if (value) 616418334Speter STRIP_TYPE_NOPS (value); 616518334Speter 616618334Speter if (value != 0) 616718334Speter { 616818334Speter if (TREE_CODE (value) == INTEGER_CST) 616918334Speter { 617018334Speter value = default_conversion (value); 617118334Speter constant_expression_warning (value); 617218334Speter } 617318334Speter else 617418334Speter { 617518334Speter error ("enumerator value for `%s' not integer constant", 617618334Speter IDENTIFIER_POINTER (name)); 617718334Speter value = 0; 617818334Speter } 617918334Speter } 618018334Speter 618118334Speter /* Default based on previous value. */ 618218334Speter /* It should no longer be possible to have NON_LVALUE_EXPR 618318334Speter in the default. */ 618418334Speter if (value == 0) 618518334Speter { 618618334Speter value = enum_next_value; 618718334Speter if (enum_overflow) 618818334Speter error ("overflow in enumeration values"); 618918334Speter } 619018334Speter 619118334Speter if (pedantic && ! int_fits_type_p (value, integer_type_node)) 619218334Speter { 619390075Sobrien pedwarn ("ISO C restricts enumerator values to range of `int'"); 619490075Sobrien value = convert (integer_type_node, value); 619518334Speter } 619618334Speter 619718334Speter /* Set basis for default for next value. */ 619818334Speter enum_next_value = build_binary_op (PLUS_EXPR, value, integer_one_node, 0); 619918334Speter enum_overflow = tree_int_cst_lt (enum_next_value, value); 620018334Speter 620118334Speter /* Now create a declaration for the enum value name. */ 620218334Speter 620318334Speter type = TREE_TYPE (value); 620418334Speter type = type_for_size (MAX (TYPE_PRECISION (type), 620518334Speter TYPE_PRECISION (integer_type_node)), 620618334Speter ((flag_traditional 620718334Speter || TYPE_PRECISION (type) >= TYPE_PRECISION (integer_type_node)) 620818334Speter && TREE_UNSIGNED (type))); 620918334Speter 621018334Speter decl = build_decl (CONST_DECL, name, type); 621190075Sobrien DECL_INITIAL (decl) = convert (type, value); 621218334Speter pushdecl (decl); 621318334Speter 621490075Sobrien return tree_cons (decl, value, NULL_TREE); 621518334Speter} 621690075Sobrien 621718334Speter 621818334Speter/* Create the FUNCTION_DECL for a function definition. 621990075Sobrien DECLSPECS, DECLARATOR and ATTRIBUTES are the parts of 622018334Speter the declaration; they describe the function's name and the type it returns, 622118334Speter but twisted together in a fashion that parallels the syntax of C. 622218334Speter 622318334Speter This function creates a binding context for the function body 622418334Speter as well as setting up the FUNCTION_DECL in current_function_decl. 622518334Speter 622618334Speter Returns 1 on success. If the DECLARATOR is not suitable for a function 622718334Speter (it defines a datum instead), we return 0, which tells 622890075Sobrien yyparse to report a parse error. */ 622918334Speter 623018334Speterint 623190075Sobrienstart_function (declspecs, declarator, attributes) 623290075Sobrien tree declarator, declspecs, attributes; 623318334Speter{ 623418334Speter tree decl1, old_decl; 623518334Speter tree restype; 623618334Speter int old_immediate_size_expand = immediate_size_expand; 623718334Speter 623850397Sobrien current_function_returns_value = 0; /* Assume, until we see it does. */ 623918334Speter current_function_returns_null = 0; 624096263Sobrien current_function_returns_abnormally = 0; 624118334Speter warn_about_return_type = 0; 624218334Speter current_extern_inline = 0; 624318334Speter c_function_varargs = 0; 624418334Speter named_labels = 0; 624518334Speter shadowed_labels = 0; 624618334Speter 624718334Speter /* Don't expand any sizes in the return type of the function. */ 624818334Speter immediate_size_expand = 0; 624918334Speter 625096263Sobrien decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1); 625118334Speter 625218334Speter /* If the declarator is not suitable for a function definition, 625318334Speter cause a syntax error. */ 625418334Speter if (decl1 == 0) 625550397Sobrien { 625650397Sobrien immediate_size_expand = old_immediate_size_expand; 625750397Sobrien return 0; 625850397Sobrien } 625918334Speter 626090075Sobrien decl_attributes (&decl1, attributes, 0); 626118334Speter 626296263Sobrien /* If #pragma weak was used, mark the decl weak now. */ 626396263Sobrien if (current_binding_level == global_binding_level) 626496263Sobrien maybe_apply_pragma_weak (decl1); 626596263Sobrien 626690075Sobrien if (DECL_DECLARED_INLINE_P (decl1) 626790075Sobrien && DECL_UNINLINABLE (decl1) 626890075Sobrien && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1))) 626990075Sobrien warning_with_decl (decl1, 627090075Sobrien "inline function `%s' given attribute noinline"); 627190075Sobrien 627218334Speter announce_function (decl1); 627318334Speter 627490075Sobrien if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl1)))) 627518334Speter { 627690075Sobrien error ("return type is an incomplete type"); 627718334Speter /* Make it return void instead. */ 627818334Speter TREE_TYPE (decl1) 627918334Speter = build_function_type (void_type_node, 628018334Speter TYPE_ARG_TYPES (TREE_TYPE (decl1))); 628118334Speter } 628218334Speter 628318334Speter if (warn_about_return_type) 628490075Sobrien pedwarn_c99 ("return type defaults to `int'"); 628518334Speter 628618334Speter /* Save the parm names or decls from this function's declarator 628718334Speter where store_parm_decls will find them. */ 628818334Speter current_function_parms = last_function_parms; 628918334Speter current_function_parm_tags = last_function_parm_tags; 629018334Speter 629118334Speter /* Make the init_value nonzero so pushdecl knows this is not tentative. 629218334Speter error_mark_node is replaced below (in poplevel) with the BLOCK. */ 629318334Speter DECL_INITIAL (decl1) = error_mark_node; 629418334Speter 629518334Speter /* If this definition isn't a prototype and we had a prototype declaration 629618334Speter before, copy the arg type info from that prototype. 629718334Speter But not if what we had before was a builtin function. */ 629818334Speter old_decl = lookup_name_current_level (DECL_NAME (decl1)); 629918334Speter if (old_decl != 0 && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE 630018334Speter && !DECL_BUILT_IN (old_decl) 630118334Speter && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1))) 630218334Speter == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (old_decl)))) 630318334Speter && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0) 630418334Speter { 630518334Speter TREE_TYPE (decl1) = TREE_TYPE (old_decl); 630618334Speter current_function_prototype_file = DECL_SOURCE_FILE (old_decl); 630718334Speter current_function_prototype_line = DECL_SOURCE_LINE (old_decl); 630818334Speter } 630918334Speter 631018334Speter /* If there is no explicit declaration, look for any out-of-scope implicit 631118334Speter declarations. */ 631218334Speter if (old_decl == 0) 631318334Speter old_decl = IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)); 631418334Speter 631518334Speter /* Optionally warn of old-fashioned def with no previous prototype. */ 631618334Speter if (warn_strict_prototypes 631718334Speter && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0 631890075Sobrien && !(old_decl != 0 631990075Sobrien && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0 632090075Sobrien || (DECL_BUILT_IN (old_decl) 632196557Sobrien && ! C_DECL_ANTICIPATED (old_decl)))) 632296557Sobrien && !(flag_bsd_no_warn_kr_main && 0 == 632396557Sobrien strcmp ("main", IDENTIFIER_POINTER (DECL_NAME (decl1))))) 632418334Speter warning ("function declaration isn't a prototype"); 632518334Speter /* Optionally warn of any global def with no previous prototype. */ 632618334Speter else if (warn_missing_prototypes 632718334Speter && TREE_PUBLIC (decl1) 632890075Sobrien && !(old_decl != 0 632990075Sobrien && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0 633090075Sobrien || (DECL_BUILT_IN (old_decl) 633190075Sobrien && ! C_DECL_ANTICIPATED (old_decl)))) 633290075Sobrien && ! MAIN_NAME_P (DECL_NAME (decl1))) 633318334Speter warning_with_decl (decl1, "no previous prototype for `%s'"); 633418334Speter /* Optionally warn of any def with no previous prototype 633518334Speter if the function has already been used. */ 633618334Speter else if (warn_missing_prototypes 633718334Speter && old_decl != 0 && TREE_USED (old_decl) 633818334Speter && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) == 0) 633918334Speter warning_with_decl (decl1, 634090075Sobrien "`%s' was used with no prototype before its definition"); 634118334Speter /* Optionally warn of any global def with no previous declaration. */ 634218334Speter else if (warn_missing_declarations 634318334Speter && TREE_PUBLIC (decl1) 634418334Speter && old_decl == 0 634590075Sobrien && ! MAIN_NAME_P (DECL_NAME (decl1))) 634618334Speter warning_with_decl (decl1, "no previous declaration for `%s'"); 634718334Speter /* Optionally warn of any def with no previous declaration 634818334Speter if the function has already been used. */ 634918334Speter else if (warn_missing_declarations 635018334Speter && old_decl != 0 && TREE_USED (old_decl) 635118334Speter && old_decl == IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1))) 635218334Speter warning_with_decl (decl1, 635390075Sobrien "`%s' was used with no declaration before its definition"); 635418334Speter 635518334Speter /* This is a definition, not a reference. 635618334Speter So normally clear DECL_EXTERNAL. 635718334Speter However, `extern inline' acts like a declaration 635818334Speter except for defining how to inline. So set DECL_EXTERNAL in that case. */ 635918334Speter DECL_EXTERNAL (decl1) = current_extern_inline; 636018334Speter 636118334Speter /* This function exists in static storage. 636218334Speter (This does not mean `static' in the C sense!) */ 636318334Speter TREE_STATIC (decl1) = 1; 636418334Speter 636518334Speter /* A nested function is not global. */ 636618334Speter if (current_function_decl != 0) 636718334Speter TREE_PUBLIC (decl1) = 0; 636818334Speter 636990075Sobrien /* Warn for unlikely, improbable, or stupid declarations of `main'. */ 637090075Sobrien if (warn_main > 0 && MAIN_NAME_P (DECL_NAME (decl1))) 637150397Sobrien { 637250397Sobrien tree args; 637350397Sobrien int argct = 0; 637450397Sobrien 637550397Sobrien if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1))) 637690075Sobrien != integer_type_node) 637750397Sobrien pedwarn_with_decl (decl1, "return type of `%s' is not `int'"); 637850397Sobrien 637950397Sobrien for (args = TYPE_ARG_TYPES (TREE_TYPE (decl1)); args; 638050397Sobrien args = TREE_CHAIN (args)) 638150397Sobrien { 638250397Sobrien tree type = args ? TREE_VALUE (args) : 0; 638350397Sobrien 638450397Sobrien if (type == void_type_node) 638550397Sobrien break; 638650397Sobrien 638750397Sobrien ++argct; 638850397Sobrien switch (argct) 638950397Sobrien { 639050397Sobrien case 1: 639150397Sobrien if (TYPE_MAIN_VARIANT (type) != integer_type_node) 639250397Sobrien pedwarn_with_decl (decl1, 639350397Sobrien "first argument of `%s' should be `int'"); 639450397Sobrien break; 639550397Sobrien 639650397Sobrien case 2: 639750397Sobrien if (TREE_CODE (type) != POINTER_TYPE 639850397Sobrien || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE 639950397Sobrien || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) 640050397Sobrien != char_type_node)) 640150397Sobrien pedwarn_with_decl (decl1, 640290075Sobrien "second argument of `%s' should be `char **'"); 640350397Sobrien break; 640450397Sobrien 640550397Sobrien case 3: 640650397Sobrien if (TREE_CODE (type) != POINTER_TYPE 640750397Sobrien || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE 640850397Sobrien || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) 640950397Sobrien != char_type_node)) 641050397Sobrien pedwarn_with_decl (decl1, 641190075Sobrien "third argument of `%s' should probably be `char **'"); 641250397Sobrien break; 641350397Sobrien } 641450397Sobrien } 641550397Sobrien 641650397Sobrien /* It is intentional that this message does not mention the third 641790075Sobrien argument because it's only mentioned in an appendix of the 641890075Sobrien standard. */ 641950397Sobrien if (argct > 0 && (argct < 2 || argct > 3)) 642050397Sobrien pedwarn_with_decl (decl1, "`%s' takes only zero or two arguments"); 642150397Sobrien 642250397Sobrien if (! TREE_PUBLIC (decl1)) 642350397Sobrien pedwarn_with_decl (decl1, "`%s' is normally a non-static function"); 642450397Sobrien } 642550397Sobrien 642618334Speter /* Record the decl so that the function name is defined. 642718334Speter If we already have a decl for this name, and it is a FUNCTION_DECL, 642818334Speter use the old decl. */ 642918334Speter 643018334Speter current_function_decl = pushdecl (decl1); 643118334Speter 643218334Speter pushlevel (0); 643318334Speter declare_parm_level (1); 643418334Speter current_binding_level->subblocks_tag_transparent = 1; 643518334Speter 643690075Sobrien make_decl_rtl (current_function_decl, NULL); 643718334Speter 643818334Speter restype = TREE_TYPE (TREE_TYPE (current_function_decl)); 643918334Speter /* Promote the value to int before returning it. */ 644090075Sobrien if (c_promoting_integer_type_p (restype)) 644118334Speter { 644218334Speter /* It retains unsignedness if traditional 644318334Speter or if not really getting wider. */ 644418334Speter if (TREE_UNSIGNED (restype) 644518334Speter && (flag_traditional 644618334Speter || (TYPE_PRECISION (restype) 644718334Speter == TYPE_PRECISION (integer_type_node)))) 644818334Speter restype = unsigned_type_node; 644918334Speter else 645018334Speter restype = integer_type_node; 645118334Speter } 645218334Speter DECL_RESULT (current_function_decl) 645318334Speter = build_decl (RESULT_DECL, NULL_TREE, restype); 645418334Speter 645518334Speter /* If this fcn was already referenced via a block-scope `extern' decl 645618334Speter (or an implicit decl), propagate certain information about the usage. */ 645718334Speter if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl))) 645818334Speter TREE_ADDRESSABLE (current_function_decl) = 1; 645918334Speter 646018334Speter immediate_size_expand = old_immediate_size_expand; 646118334Speter 646290075Sobrien start_fname_decls (); 646390075Sobrien 646418334Speter return 1; 646518334Speter} 646618334Speter 646718334Speter/* Record that this function is going to be a varargs function. 646818334Speter This is called before store_parm_decls, which is too early 646918334Speter to call mark_varargs directly. */ 647018334Speter 647118334Spetervoid 647218334Speterc_mark_varargs () 647318334Speter{ 647418334Speter c_function_varargs = 1; 647518334Speter} 647618334Speter 647718334Speter/* Store the parameter declarations into the current function declaration. 647818334Speter This is called after parsing the parameter declarations, before 647918334Speter digesting the body of the function. 648018334Speter 648118334Speter For an old-style definition, modify the function's type 648218334Speter to specify at least the number of arguments. */ 648318334Speter 648418334Spetervoid 648518334Speterstore_parm_decls () 648618334Speter{ 648790075Sobrien tree fndecl = current_function_decl; 648890075Sobrien tree parm; 648918334Speter 649018334Speter /* This is either a chain of PARM_DECLs (if a prototype was used) 649118334Speter or a list of IDENTIFIER_NODEs (for an old-fashioned C definition). */ 649218334Speter tree specparms = current_function_parms; 649318334Speter 649418334Speter /* This is a list of types declared among parms in a prototype. */ 649518334Speter tree parmtags = current_function_parm_tags; 649618334Speter 649718334Speter /* This is a chain of PARM_DECLs from old-style parm declarations. */ 649890075Sobrien tree parmdecls = getdecls (); 649918334Speter 650018334Speter /* This is a chain of any other decls that came in among the parm 650118334Speter declarations. If a parm is declared with enum {foo, bar} x; 650218334Speter then CONST_DECLs for foo and bar are put here. */ 650318334Speter tree nonparms = 0; 650418334Speter 650590075Sobrien /* The function containing FNDECL, if any. */ 650690075Sobrien tree context = decl_function_context (fndecl); 650790075Sobrien 650818334Speter /* Nonzero if this definition is written with a prototype. */ 650918334Speter int prototype = 0; 651018334Speter 651190075Sobrien int saved_warn_shadow = warn_shadow; 651290075Sobrien 651390075Sobrien /* Don't re-emit shadow warnings. */ 651490075Sobrien warn_shadow = 0; 651590075Sobrien 651618334Speter if (specparms != 0 && TREE_CODE (specparms) != TREE_LIST) 651718334Speter { 651818334Speter /* This case is when the function was defined with an ANSI prototype. 651918334Speter The parms already have decls, so we need not do anything here 652018334Speter except record them as in effect 652118334Speter and complain if any redundant old-style parm decls were written. */ 652218334Speter 652390075Sobrien tree next; 652418334Speter tree others = 0; 652518334Speter 652618334Speter prototype = 1; 652718334Speter 652818334Speter if (parmdecls != 0) 652918334Speter { 653018334Speter tree decl, link; 653118334Speter 653218334Speter error_with_decl (fndecl, 653318334Speter "parm types given both in parmlist and separately"); 653418334Speter /* Get rid of the erroneous decls; don't keep them on 653518334Speter the list of parms, since they might not be PARM_DECLs. */ 653618334Speter for (decl = current_binding_level->names; 653718334Speter decl; decl = TREE_CHAIN (decl)) 653818334Speter if (DECL_NAME (decl)) 653918334Speter IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) = 0; 654018334Speter for (link = current_binding_level->shadowed; 654118334Speter link; link = TREE_CHAIN (link)) 654218334Speter IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); 654318334Speter current_binding_level->names = 0; 654418334Speter current_binding_level->shadowed = 0; 654518334Speter } 654618334Speter 654718334Speter specparms = nreverse (specparms); 654818334Speter for (parm = specparms; parm; parm = next) 654918334Speter { 655018334Speter next = TREE_CHAIN (parm); 655118334Speter if (TREE_CODE (parm) == PARM_DECL) 655218334Speter { 655318334Speter if (DECL_NAME (parm) == 0) 655418334Speter error_with_decl (parm, "parameter name omitted"); 655590075Sobrien else if (TREE_CODE (TREE_TYPE (parm)) != ERROR_MARK 655690075Sobrien && VOID_TYPE_P (TREE_TYPE (parm))) 655718334Speter { 655818334Speter error_with_decl (parm, "parameter `%s' declared void"); 655918334Speter /* Change the type to error_mark_node so this parameter 656018334Speter will be ignored by assign_parms. */ 656118334Speter TREE_TYPE (parm) = error_mark_node; 656218334Speter } 656318334Speter pushdecl (parm); 656418334Speter } 656518334Speter else 656618334Speter { 656718334Speter /* If we find an enum constant or a type tag, 656818334Speter put it aside for the moment. */ 656918334Speter TREE_CHAIN (parm) = 0; 657018334Speter others = chainon (others, parm); 657118334Speter } 657218334Speter } 657318334Speter 657418334Speter /* Get the decls in their original chain order 657518334Speter and record in the function. */ 657618334Speter DECL_ARGUMENTS (fndecl) = getdecls (); 657718334Speter 657818334Speter#if 0 657918334Speter /* If this function takes a variable number of arguments, 658018334Speter add a phony parameter to the end of the parm list, 658118334Speter to represent the position of the first unnamed argument. */ 658218334Speter if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl)))) 658318334Speter != void_type_node) 658418334Speter { 658518334Speter tree dummy = build_decl (PARM_DECL, NULL_TREE, void_type_node); 658618334Speter /* Let's hope the address of the unnamed parm 658718334Speter won't depend on its type. */ 658818334Speter TREE_TYPE (dummy) = integer_type_node; 658918334Speter DECL_ARG_TYPE (dummy) = integer_type_node; 659090075Sobrien DECL_ARGUMENTS (fndecl) = chainon (DECL_ARGUMENTS (fndecl), dummy); 659118334Speter } 659218334Speter#endif 659318334Speter 659418334Speter /* Now pushdecl the enum constants. */ 659518334Speter for (parm = others; parm; parm = next) 659618334Speter { 659718334Speter next = TREE_CHAIN (parm); 659818334Speter if (DECL_NAME (parm) == 0) 659918334Speter ; 660018334Speter else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node) 660118334Speter ; 660218334Speter else if (TREE_CODE (parm) != PARM_DECL) 660318334Speter pushdecl (parm); 660418334Speter } 660518334Speter 660618334Speter storetags (chainon (parmtags, gettags ())); 660718334Speter } 660818334Speter else 660918334Speter { 661018334Speter /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes 661118334Speter each with a parm name as the TREE_VALUE. 661218334Speter 661318334Speter PARMDECLS is a chain of declarations for parameters. 661418334Speter Warning! It can also contain CONST_DECLs which are not parameters 661518334Speter but are names of enumerators of any enum types 661618334Speter declared among the parameters. 661718334Speter 661818334Speter First match each formal parameter name with its declaration. 661918334Speter Associate decls with the names and store the decls 662018334Speter into the TREE_PURPOSE slots. */ 662118334Speter 662290075Sobrien /* We use DECL_WEAK as a flag to show which parameters have been 662390075Sobrien seen already since it is not used on PARM_DECL or CONST_DECL. */ 662418334Speter for (parm = parmdecls; parm; parm = TREE_CHAIN (parm)) 662590075Sobrien DECL_WEAK (parm) = 0; 662618334Speter 662718334Speter for (parm = specparms; parm; parm = TREE_CHAIN (parm)) 662818334Speter { 662990075Sobrien tree tail, found = NULL; 663018334Speter 663118334Speter if (TREE_VALUE (parm) == 0) 663218334Speter { 663390075Sobrien error_with_decl (fndecl, 663490075Sobrien "parameter name missing from parameter list"); 663518334Speter TREE_PURPOSE (parm) = 0; 663618334Speter continue; 663718334Speter } 663818334Speter 663918334Speter /* See if any of the parmdecls specifies this parm by name. 664018334Speter Ignore any enumerator decls. */ 664118334Speter for (tail = parmdecls; tail; tail = TREE_CHAIN (tail)) 664218334Speter if (DECL_NAME (tail) == TREE_VALUE (parm) 664318334Speter && TREE_CODE (tail) == PARM_DECL) 664418334Speter { 664518334Speter found = tail; 664618334Speter break; 664718334Speter } 664818334Speter 664918334Speter /* If declaration already marked, we have a duplicate name. 665090075Sobrien Complain, and don't use this decl twice. */ 665190075Sobrien if (found && DECL_WEAK (found)) 665218334Speter { 665318334Speter error_with_decl (found, "multiple parameters named `%s'"); 665418334Speter found = 0; 665518334Speter } 665618334Speter 665718334Speter /* If the declaration says "void", complain and ignore it. */ 665890075Sobrien if (found && VOID_TYPE_P (TREE_TYPE (found))) 665918334Speter { 666018334Speter error_with_decl (found, "parameter `%s' declared void"); 666118334Speter TREE_TYPE (found) = integer_type_node; 666218334Speter DECL_ARG_TYPE (found) = integer_type_node; 666318334Speter layout_decl (found, 0); 666418334Speter } 666518334Speter 666618334Speter /* Traditionally, a parm declared float is actually a double. */ 666718334Speter if (found && flag_traditional 666818334Speter && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == float_type_node) 666918334Speter { 667018334Speter TREE_TYPE (found) = double_type_node; 667118334Speter DECL_ARG_TYPE (found) = double_type_node; 667218334Speter layout_decl (found, 0); 667318334Speter } 667418334Speter 667518334Speter /* If no declaration found, default to int. */ 667618334Speter if (!found) 667718334Speter { 667818334Speter found = build_decl (PARM_DECL, TREE_VALUE (parm), 667918334Speter integer_type_node); 668018334Speter DECL_ARG_TYPE (found) = TREE_TYPE (found); 668118334Speter DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl); 668218334Speter DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl); 668390075Sobrien if (flag_isoc99) 668490075Sobrien pedwarn_with_decl (found, "type of `%s' defaults to `int'"); 668590075Sobrien else if (extra_warnings) 668618334Speter warning_with_decl (found, "type of `%s' defaults to `int'"); 668718334Speter pushdecl (found); 668818334Speter } 668918334Speter 669018334Speter TREE_PURPOSE (parm) = found; 669118334Speter 669290075Sobrien /* Mark this decl as "already found". */ 669390075Sobrien DECL_WEAK (found) = 1; 669418334Speter } 669518334Speter 669618334Speter /* Put anything which is on the parmdecls chain and which is 669718334Speter not a PARM_DECL onto the list NONPARMS. (The types of 669818334Speter non-parm things which might appear on the list include 669918334Speter enumerators and NULL-named TYPE_DECL nodes.) Complain about 670018334Speter any actual PARM_DECLs not matched with any names. */ 670118334Speter 670218334Speter nonparms = 0; 670390075Sobrien for (parm = parmdecls; parm;) 670418334Speter { 670518334Speter tree next = TREE_CHAIN (parm); 670618334Speter TREE_CHAIN (parm) = 0; 670718334Speter 670818334Speter if (TREE_CODE (parm) != PARM_DECL) 670918334Speter nonparms = chainon (nonparms, parm); 671018334Speter else 671118334Speter { 671218334Speter /* Complain about args with incomplete types. */ 671390075Sobrien if (!COMPLETE_TYPE_P (TREE_TYPE (parm))) 671490075Sobrien { 671590075Sobrien error_with_decl (parm, "parameter `%s' has incomplete type"); 671690075Sobrien TREE_TYPE (parm) = error_mark_node; 671790075Sobrien } 671818334Speter 671990075Sobrien if (! DECL_WEAK (parm)) 672090075Sobrien { 672190075Sobrien error_with_decl (parm, 672290075Sobrien "declaration for parameter `%s' but no such parameter"); 672318334Speter /* Pretend the parameter was not missing. 672418334Speter This gets us to a standard state and minimizes 672518334Speter further error messages. */ 672690075Sobrien specparms 672718334Speter = chainon (specparms, 672818334Speter tree_cons (parm, NULL_TREE, NULL_TREE)); 672918334Speter } 673018334Speter } 673118334Speter 673218334Speter parm = next; 673318334Speter } 673418334Speter 673590075Sobrien /* Chain the declarations together in the order of the list of 673690075Sobrien names. Store that chain in the function decl, replacing the 673790075Sobrien list of names. */ 673818334Speter parm = specparms; 673918334Speter DECL_ARGUMENTS (fndecl) = 0; 674018334Speter { 674190075Sobrien tree last; 674218334Speter for (last = 0; parm; parm = TREE_CHAIN (parm)) 674318334Speter if (TREE_PURPOSE (parm)) 674418334Speter { 674518334Speter if (last == 0) 674618334Speter DECL_ARGUMENTS (fndecl) = TREE_PURPOSE (parm); 674718334Speter else 674818334Speter TREE_CHAIN (last) = TREE_PURPOSE (parm); 674918334Speter last = TREE_PURPOSE (parm); 675018334Speter TREE_CHAIN (last) = 0; 675118334Speter } 675218334Speter } 675318334Speter 675418334Speter /* If there was a previous prototype, 675518334Speter set the DECL_ARG_TYPE of each argument according to 675618334Speter the type previously specified, and report any mismatches. */ 675718334Speter 675818334Speter if (TYPE_ARG_TYPES (TREE_TYPE (fndecl))) 675918334Speter { 676090075Sobrien tree type; 676118334Speter for (parm = DECL_ARGUMENTS (fndecl), 676218334Speter type = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); 676318334Speter parm || (type && (TYPE_MAIN_VARIANT (TREE_VALUE (type)) 676418334Speter != void_type_node)); 676518334Speter parm = TREE_CHAIN (parm), type = TREE_CHAIN (type)) 676618334Speter { 676718334Speter if (parm == 0 || type == 0 676818334Speter || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node) 676918334Speter { 677018334Speter error ("number of arguments doesn't match prototype"); 677118334Speter error_with_file_and_line (current_function_prototype_file, 677218334Speter current_function_prototype_line, 677318334Speter "prototype declaration"); 677418334Speter break; 677518334Speter } 677690075Sobrien /* Type for passing arg must be consistent with that 677790075Sobrien declared for the arg. ISO C says we take the unqualified 677890075Sobrien type for parameters declared with qualified type. */ 677990075Sobrien if (! comptypes (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm)), 678090075Sobrien TYPE_MAIN_VARIANT (TREE_VALUE (type)))) 678118334Speter { 678218334Speter if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) 678318334Speter == TYPE_MAIN_VARIANT (TREE_VALUE (type))) 678418334Speter { 678518334Speter /* Adjust argument to match prototype. E.g. a previous 678618334Speter `int foo(float);' prototype causes 678718334Speter `int foo(x) float x; {...}' to be treated like 678818334Speter `int foo(float x) {...}'. This is particularly 678918334Speter useful for argument types like uid_t. */ 679018334Speter DECL_ARG_TYPE (parm) = TREE_TYPE (parm); 679190075Sobrien 679290075Sobrien if (PROMOTE_PROTOTYPES 679390075Sobrien && INTEGRAL_TYPE_P (TREE_TYPE (parm)) 679418334Speter && TYPE_PRECISION (TREE_TYPE (parm)) 679518334Speter < TYPE_PRECISION (integer_type_node)) 679618334Speter DECL_ARG_TYPE (parm) = integer_type_node; 679790075Sobrien 679818334Speter if (pedantic) 679918334Speter { 680018334Speter pedwarn ("promoted argument `%s' doesn't match prototype", 680118334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 680218334Speter warning_with_file_and_line 680318334Speter (current_function_prototype_file, 680418334Speter current_function_prototype_line, 680518334Speter "prototype declaration"); 680618334Speter } 680718334Speter } 680818334Speter /* If -traditional, allow `int' argument to match 680918334Speter `unsigned' prototype. */ 681018334Speter else if (! (flag_traditional 681118334Speter && TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == integer_type_node 681218334Speter && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node)) 681318334Speter { 681418334Speter error ("argument `%s' doesn't match prototype", 681518334Speter IDENTIFIER_POINTER (DECL_NAME (parm))); 681618334Speter error_with_file_and_line (current_function_prototype_file, 681718334Speter current_function_prototype_line, 681818334Speter "prototype declaration"); 681918334Speter } 682018334Speter } 682118334Speter } 682218334Speter TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0; 682318334Speter } 682418334Speter 682518334Speter /* Otherwise, create a prototype that would match. */ 682618334Speter 682718334Speter else 682818334Speter { 682918334Speter tree actual = 0, last = 0, type; 683018334Speter 683118334Speter for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm)) 683218334Speter { 683390075Sobrien type = tree_cons (NULL_TREE, DECL_ARG_TYPE (parm), NULL_TREE); 683418334Speter if (last) 683518334Speter TREE_CHAIN (last) = type; 683618334Speter else 683718334Speter actual = type; 683818334Speter last = type; 683918334Speter } 684090075Sobrien type = tree_cons (NULL_TREE, void_type_node, NULL_TREE); 684118334Speter if (last) 684218334Speter TREE_CHAIN (last) = type; 684318334Speter else 684418334Speter actual = type; 684518334Speter 684618334Speter /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES 684718334Speter of the type of this function, but we need to avoid having this 684818334Speter affect the types of other similarly-typed functions, so we must 684918334Speter first force the generation of an identical (but separate) type 685018334Speter node for the relevant function type. The new node we create 685118334Speter will be a variant of the main variant of the original function 685218334Speter type. */ 685318334Speter 685418334Speter TREE_TYPE (fndecl) = build_type_copy (TREE_TYPE (fndecl)); 685518334Speter 685618334Speter TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = actual; 685718334Speter } 685818334Speter 685918334Speter /* Now store the final chain of decls for the arguments 686018334Speter as the decl-chain of the current lexical scope. 686118334Speter Put the enumerators in as well, at the front so that 686218334Speter DECL_ARGUMENTS is not modified. */ 686318334Speter 686418334Speter storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); 686518334Speter } 686618334Speter 686718334Speter /* Make sure the binding level for the top of the function body 686818334Speter gets a BLOCK if there are any in the function. 686918334Speter Otherwise, the dbx output is wrong. */ 687018334Speter 687118334Speter keep_next_if_subblocks = 1; 687218334Speter 687318334Speter /* ??? This might be an improvement, 687418334Speter but needs to be thought about some more. */ 687518334Speter#if 0 687618334Speter keep_next_level_flag = 1; 687718334Speter#endif 687818334Speter 687918334Speter /* Write a record describing this function definition to the prototypes 688018334Speter file (if requested). */ 688118334Speter 688218334Speter gen_aux_info_record (fndecl, 1, 0, prototype); 688318334Speter 688418334Speter /* Initialize the RTL code for the function. */ 688518334Speter init_function_start (fndecl, input_filename, lineno); 688618334Speter 688790075Sobrien /* Begin the statement tree for this function. */ 688890075Sobrien begin_stmt_tree (&DECL_SAVED_TREE (current_function_decl)); 688918334Speter 689090075Sobrien /* If this is a nested function, save away the sizes of any 689190075Sobrien variable-size types so that we can expand them when generating 689290075Sobrien RTL. */ 689390075Sobrien if (context) 689418334Speter { 689590075Sobrien tree t; 689618334Speter 689790075Sobrien DECL_LANG_SPECIFIC (fndecl)->pending_sizes 689890075Sobrien = nreverse (get_pending_sizes ()); 689990075Sobrien for (t = DECL_LANG_SPECIFIC (fndecl)->pending_sizes; 690090075Sobrien t; 690190075Sobrien t = TREE_CHAIN (t)) 690290075Sobrien SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = context; 690318334Speter } 690418334Speter 690590075Sobrien /* This function is being processed in whole-function mode. */ 690690075Sobrien cfun->x_whole_function_mode_p = 1; 690718334Speter 690890075Sobrien /* Even though we're inside a function body, we still don't want to 690990075Sobrien call expand_expr to calculate the size of a variable-sized array. 691090075Sobrien We haven't necessarily assigned RTL to all variables yet, so it's 691190075Sobrien not safe to try to expand expressions involving them. */ 691290075Sobrien immediate_size_expand = 0; 691390075Sobrien cfun->x_dont_save_pending_sizes_p = 1; 691418334Speter 691590075Sobrien warn_shadow = saved_warn_shadow; 691618334Speter} 691718334Speter 691818334Speter/* Finish up a function declaration and compile that function 691918334Speter all the way to assembler language output. The free the storage 692018334Speter for the function definition. 692118334Speter 692218334Speter This is called after parsing the body of the function definition. 692318334Speter 692496263Sobrien NESTED is nonzero if the function being finished is nested in another. 692596263Sobrien CAN_DEFER_P is nonzero if the function may be deferred. */ 692618334Speter 692718334Spetervoid 692896263Sobrienfinish_function (nested, can_defer_p) 692918334Speter int nested; 693096263Sobrien int can_defer_p; 693118334Speter{ 693290075Sobrien tree fndecl = current_function_decl; 693318334Speter 693496263Sobrien#if 0 693596263Sobrien /* This caused &foo to be of type ptr-to-const-function which then 693696263Sobrien got a warning when stored in a ptr-to-function variable. */ 693796263Sobrien TREE_READONLY (fndecl) = 1; 693896263Sobrien#endif 693918334Speter 694018334Speter poplevel (1, 0, 1); 694118334Speter BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; 694218334Speter 694318334Speter /* Must mark the RESULT_DECL as being in this function. */ 694418334Speter 694518334Speter DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; 694618334Speter 694718334Speter /* Obey `register' declarations if `setjmp' is called in this fn. */ 694818334Speter if (flag_traditional && current_function_calls_setjmp) 694918334Speter { 695018334Speter setjmp_protect (DECL_INITIAL (fndecl)); 695118334Speter setjmp_protect_args (); 695218334Speter } 695318334Speter 695490075Sobrien if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted) 695518334Speter { 695618334Speter if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl))) 695718334Speter != integer_type_node) 695850397Sobrien { 695952284Sobrien /* If warn_main is 1 (-Wmain) or 2 (-Wall), we have already warned. 696090075Sobrien If warn_main is -1 (-Wno-main) we don't want to be warned. */ 696150397Sobrien if (! warn_main) 696250397Sobrien pedwarn_with_decl (fndecl, "return type of `%s' is not `int'"); 696350397Sobrien } 696418334Speter else 696518334Speter { 696650397Sobrien#ifdef DEFAULT_MAIN_RETURN 696718334Speter /* Make it so that `main' always returns success by default. */ 696818334Speter DEFAULT_MAIN_RETURN; 696990075Sobrien#else 697090075Sobrien if (flag_isoc99) 697190075Sobrien c_expand_return (integer_zero_node); 697250397Sobrien#endif 697318334Speter } 697418334Speter } 697590075Sobrien 697690075Sobrien finish_fname_decls (); 697718334Speter 697890075Sobrien /* Tie off the statement tree for this function. */ 697990075Sobrien finish_stmt_tree (&DECL_SAVED_TREE (fndecl)); 698096263Sobrien 698196263Sobrien /* Complain if there's just no return statement. */ 698296263Sobrien if (warn_return_type 698396263Sobrien && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE 698496263Sobrien && !current_function_returns_value && !current_function_returns_null 698596263Sobrien /* Don't complain if we abort. */ 698696263Sobrien && !current_function_returns_abnormally 698796263Sobrien /* Don't warn for main(). */ 698896263Sobrien && !MAIN_NAME_P (DECL_NAME (fndecl)) 698996263Sobrien /* Or if they didn't actually specify a return type. */ 699096263Sobrien && !C_FUNCTION_IMPLICIT_INT (fndecl) 699196263Sobrien /* Normally, with -Wreturn-type, flow will complain. Unless we're an 699296263Sobrien inline function, as we might never be compiled separately. */ 699396263Sobrien && DECL_INLINE (fndecl)) 699496263Sobrien warning ("no return statement in function returning non-void"); 699596263Sobrien 699690075Sobrien /* Clear out memory we no longer need. */ 699790075Sobrien free_after_parsing (cfun); 699890075Sobrien /* Since we never call rest_of_compilation, we never clear 699990075Sobrien CFUN. Do so explicitly. */ 700090075Sobrien free_after_compilation (cfun); 700190075Sobrien cfun = NULL; 700290075Sobrien 700390075Sobrien if (! nested) 700490075Sobrien { 700590075Sobrien /* Generate RTL for the body of this function. */ 700696263Sobrien c_expand_body (fndecl, nested, can_defer_p); 700796263Sobrien 700890075Sobrien /* Let the error reporting routines know that we're outside a 700990075Sobrien function. For a nested function, this value is used in 701090075Sobrien pop_c_function_context and then reset via pop_function_context. */ 701190075Sobrien current_function_decl = NULL; 701290075Sobrien } 701390075Sobrien} 701490075Sobrien 701590075Sobrien/* Generate the RTL for a deferred function FNDECL. */ 701690075Sobrien 701790075Sobrienvoid 701890075Sobrienc_expand_deferred_function (fndecl) 701990075Sobrien tree fndecl; 702090075Sobrien{ 702190075Sobrien /* DECL_INLINE or DECL_RESULT might got cleared after the inline 702290075Sobrien function was deferred, e.g. in duplicate_decls. */ 702390075Sobrien if (DECL_INLINE (fndecl) && DECL_RESULT (fndecl)) 702490075Sobrien { 702590075Sobrien c_expand_body (fndecl, 0, 0); 702690075Sobrien current_function_decl = NULL; 702790075Sobrien } 702890075Sobrien} 702990075Sobrien 703090075Sobrien/* Generate the RTL for the body of FNDECL. If NESTED_P is non-zero, 703190075Sobrien then we are already in the process of generating RTL for another 703290075Sobrien function. If can_defer_p is zero, we won't attempt to defer the 703390075Sobrien generation of RTL. */ 703490075Sobrien 703590075Sobrienstatic void 703690075Sobrienc_expand_body (fndecl, nested_p, can_defer_p) 703790075Sobrien tree fndecl; 703890075Sobrien int nested_p, can_defer_p; 703990075Sobrien{ 704090075Sobrien int uninlinable = 1; 704190075Sobrien 704290075Sobrien /* There's no reason to do any of the work here if we're only doing 704390075Sobrien semantic analysis; this code just generates RTL. */ 704490075Sobrien if (flag_syntax_only) 704590075Sobrien return; 704690075Sobrien 704790075Sobrien if (flag_inline_trees) 704890075Sobrien { 704990075Sobrien /* First, cache whether the current function is inlinable. Some 705090075Sobrien predicates depend on cfun and current_function_decl to 705190075Sobrien function completely. */ 705290075Sobrien timevar_push (TV_INTEGRATION); 705390075Sobrien uninlinable = ! tree_inlinable_function_p (fndecl); 705490075Sobrien 705590075Sobrien if (! uninlinable && can_defer_p 705690075Sobrien /* Save function tree for inlining. Should return 0 if the 705790075Sobrien language does not support function deferring or the 705890075Sobrien function could not be deferred. */ 705990075Sobrien && defer_fn (fndecl)) 706090075Sobrien { 706190075Sobrien /* Let the back-end know that this function exists. */ 706290075Sobrien (*debug_hooks->deferred_inline_function) (fndecl); 706390075Sobrien timevar_pop (TV_INTEGRATION); 706490075Sobrien return; 706590075Sobrien } 706690075Sobrien 706790075Sobrien /* Then, inline any functions called in it. */ 706890075Sobrien optimize_inline_calls (fndecl); 706990075Sobrien timevar_pop (TV_INTEGRATION); 707090075Sobrien } 707190075Sobrien 707290075Sobrien timevar_push (TV_EXPAND); 707390075Sobrien 707490075Sobrien if (nested_p) 707590075Sobrien { 707690075Sobrien /* Make sure that we will evaluate variable-sized types involved 707790075Sobrien in our function's type. */ 707890075Sobrien expand_pending_sizes (DECL_LANG_SPECIFIC (fndecl)->pending_sizes); 707990075Sobrien /* Squirrel away our current state. */ 708090075Sobrien push_function_context (); 708190075Sobrien } 708290075Sobrien 708390075Sobrien /* Initialize the RTL code for the function. */ 708490075Sobrien current_function_decl = fndecl; 708590075Sobrien input_filename = DECL_SOURCE_FILE (fndecl); 708690075Sobrien init_function_start (fndecl, input_filename, DECL_SOURCE_LINE (fndecl)); 708790075Sobrien 708890075Sobrien /* This function is being processed in whole-function mode. */ 708990075Sobrien cfun->x_whole_function_mode_p = 1; 709090075Sobrien 709190075Sobrien /* Even though we're inside a function body, we still don't want to 709290075Sobrien call expand_expr to calculate the size of a variable-sized array. 709390075Sobrien We haven't necessarily assigned RTL to all variables yet, so it's 709490075Sobrien not safe to try to expand expressions involving them. */ 709590075Sobrien immediate_size_expand = 0; 709690075Sobrien cfun->x_dont_save_pending_sizes_p = 1; 709790075Sobrien 709890075Sobrien /* If this is a varargs function, inform function.c. */ 709990075Sobrien if (c_function_varargs) 710090075Sobrien mark_varargs (); 710190075Sobrien 710290075Sobrien /* Set up parameters and prepare for return, for the function. */ 710390075Sobrien expand_function_start (fndecl, 0); 710490075Sobrien 710590075Sobrien /* If this function is `main', emit a call to `__main' 710690075Sobrien to run global initializers, etc. */ 710790075Sobrien if (DECL_NAME (fndecl) 710890075Sobrien && MAIN_NAME_P (DECL_NAME (fndecl)) 710990075Sobrien && DECL_CONTEXT (fndecl) == NULL_TREE) 711090075Sobrien expand_main_function (); 711190075Sobrien 711290075Sobrien /* Generate the RTL for this function. */ 711390075Sobrien expand_stmt (DECL_SAVED_TREE (fndecl)); 711490075Sobrien if (uninlinable) 711590075Sobrien { 711690075Sobrien /* Allow the body of the function to be garbage collected. */ 711790075Sobrien DECL_SAVED_TREE (fndecl) = NULL_TREE; 711890075Sobrien } 711990075Sobrien 712090075Sobrien /* We hard-wired immediate_size_expand to zero above. 712190075Sobrien expand_function_end will decrement this variable. So, we set the 712290075Sobrien variable to one here, so that after the decrement it will remain 712390075Sobrien zero. */ 712490075Sobrien immediate_size_expand = 1; 712590075Sobrien 712690075Sobrien /* Allow language dialects to perform special processing. */ 712790075Sobrien if (lang_expand_function_end) 712890075Sobrien (*lang_expand_function_end) (); 712990075Sobrien 713018334Speter /* Generate rtl for function exit. */ 713118334Speter expand_function_end (input_filename, lineno, 0); 713218334Speter 713390075Sobrien /* If this is a nested function, protect the local variables in the stack 713490075Sobrien above us from being collected while we're compiling this function. */ 713590075Sobrien if (nested_p) 713690075Sobrien ggc_push_context (); 713718334Speter 713818334Speter /* Run the optimizers and output the assembler code for this function. */ 713918334Speter rest_of_compilation (fndecl); 714018334Speter 714190075Sobrien /* Undo the GC context switch. */ 714290075Sobrien if (nested_p) 714390075Sobrien ggc_pop_context (); 714418334Speter 714518334Speter /* With just -W, complain only if function returns both with 714618334Speter and without a value. */ 714790075Sobrien if (extra_warnings 714890075Sobrien && current_function_returns_value 714990075Sobrien && current_function_returns_null) 715018334Speter warning ("this function may return with or without a value"); 715118334Speter 715218334Speter /* If requested, warn about function definitions where the function will 715318334Speter return a value (usually of some struct or union type) which itself will 715418334Speter take up a lot of stack space. */ 715518334Speter 715618334Speter if (warn_larger_than && !DECL_EXTERNAL (fndecl) && TREE_TYPE (fndecl)) 715718334Speter { 715890075Sobrien tree ret_type = TREE_TYPE (TREE_TYPE (fndecl)); 715918334Speter 716090075Sobrien if (ret_type && TYPE_SIZE_UNIT (ret_type) 716190075Sobrien && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST 716290075Sobrien && 0 < compare_tree_int (TYPE_SIZE_UNIT (ret_type), 716390075Sobrien larger_than_size)) 716418334Speter { 716590075Sobrien unsigned int size_as_int 716690075Sobrien = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (ret_type)); 716718334Speter 716890075Sobrien if (compare_tree_int (TYPE_SIZE_UNIT (ret_type), size_as_int) == 0) 716990075Sobrien warning_with_decl (fndecl, 717090075Sobrien "size of return value of `%s' is %u bytes", 717190075Sobrien size_as_int); 717290075Sobrien else 717390075Sobrien warning_with_decl (fndecl, 717490075Sobrien "size of return value of `%s' is larger than %d bytes", 717590075Sobrien larger_than_size); 717618334Speter } 717718334Speter } 717818334Speter 717990075Sobrien if (DECL_SAVED_INSNS (fndecl) == 0 && ! nested_p 718090075Sobrien && ! flag_inline_trees) 718118334Speter { 718290075Sobrien /* Stop pointing to the local nodes about to be freed. 718390075Sobrien But DECL_INITIAL must remain nonzero so we know this 718490075Sobrien was an actual function definition. 718590075Sobrien For a nested function, this is done in pop_c_function_context. 718690075Sobrien If rest_of_compilation set this to 0, leave it 0. */ 718718334Speter if (DECL_INITIAL (fndecl) != 0) 718818334Speter DECL_INITIAL (fndecl) = error_mark_node; 718990075Sobrien 719018334Speter DECL_ARGUMENTS (fndecl) = 0; 719118334Speter } 719218334Speter 719318334Speter if (DECL_STATIC_CONSTRUCTOR (fndecl)) 719418334Speter { 719590075Sobrien if (targetm.have_ctors_dtors) 719690075Sobrien (* targetm.asm_out.constructor) (XEXP (DECL_RTL (fndecl), 0), 719790075Sobrien DEFAULT_INIT_PRIORITY); 719818334Speter else 719990075Sobrien static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors); 720018334Speter } 720190075Sobrien 720218334Speter if (DECL_STATIC_DESTRUCTOR (fndecl)) 720318334Speter { 720490075Sobrien if (targetm.have_ctors_dtors) 720590075Sobrien (* targetm.asm_out.destructor) (XEXP (DECL_RTL (fndecl), 0), 720690075Sobrien DEFAULT_INIT_PRIORITY); 720718334Speter else 720890075Sobrien static_dtors = tree_cons (NULL_TREE, fndecl, static_dtors); 720918334Speter } 721018334Speter 721190075Sobrien if (nested_p) 721290075Sobrien /* Return to the enclosing function. */ 721390075Sobrien pop_function_context (); 721490075Sobrien timevar_pop (TV_EXPAND); 721590075Sobrien} 721690075Sobrien 721790075Sobrien/* Check the declarations given in a for-loop for satisfying the C99 721890075Sobrien constraints. */ 721990075Sobrienvoid 722090075Sobriencheck_for_loop_decls () 722190075Sobrien{ 722290075Sobrien tree t; 722390075Sobrien 722490075Sobrien if (!flag_isoc99) 722518334Speter { 722690075Sobrien /* If we get here, declarations have been used in a for loop without 722790075Sobrien the C99 for loop scope. This doesn't make much sense, so don't 722890075Sobrien allow it. */ 722990075Sobrien error ("`for' loop initial declaration used outside C99 mode"); 723090075Sobrien return; 723118334Speter } 723290075Sobrien /* C99 subclause 6.8.5 paragraph 3: 723390075Sobrien 723490075Sobrien [#3] The declaration part of a for statement shall only 723590075Sobrien declare identifiers for objects having storage class auto or 723690075Sobrien register. 723790075Sobrien 723890075Sobrien It isn't clear whether, in this sentence, "identifiers" binds to 723990075Sobrien "shall only declare" or to "objects" - that is, whether all identifiers 724090075Sobrien declared must be identifiers for objects, or whether the restriction 724190075Sobrien only applies to those that are. (A question on this in comp.std.c 724290075Sobrien in November 2000 received no answer.) We implement the strictest 724390075Sobrien interpretation, to avoid creating an extension which later causes 724490075Sobrien problems. */ 724590075Sobrien 724690075Sobrien for (t = gettags (); t; t = TREE_CHAIN (t)) 724790075Sobrien { 724890075Sobrien if (TREE_PURPOSE (t) != 0) 724990075Sobrien { 725090075Sobrien enum tree_code code = TREE_CODE (TREE_VALUE (t)); 725190075Sobrien 725290075Sobrien if (code == RECORD_TYPE) 725390075Sobrien error ("`struct %s' declared in `for' loop initial declaration", 725490075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (t))); 725590075Sobrien else if (code == UNION_TYPE) 725690075Sobrien error ("`union %s' declared in `for' loop initial declaration", 725790075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (t))); 725890075Sobrien else 725990075Sobrien error ("`enum %s' declared in `for' loop initial declaration", 726090075Sobrien IDENTIFIER_POINTER (TREE_PURPOSE (t))); 726190075Sobrien } 726290075Sobrien } 726390075Sobrien 726490075Sobrien for (t = getdecls (); t; t = TREE_CHAIN (t)) 726590075Sobrien { 726690075Sobrien if (TREE_CODE (t) != VAR_DECL && DECL_NAME (t)) 726790075Sobrien error_with_decl (t, "declaration of non-variable `%s' in `for' loop initial declaration"); 726890075Sobrien else if (TREE_STATIC (t)) 726990075Sobrien error_with_decl (t, "declaration of static variable `%s' in `for' loop initial declaration"); 727090075Sobrien else if (DECL_EXTERNAL (t)) 727190075Sobrien error_with_decl (t, "declaration of `extern' variable `%s' in `for' loop initial declaration"); 727290075Sobrien } 727318334Speter} 727418334Speter 727518334Speter/* Save and restore the variables in this file and elsewhere 727618334Speter that keep track of the progress of compilation of the current function. 727718334Speter Used for nested functions. */ 727818334Speter 727990075Sobrienstruct c_language_function 728018334Speter{ 728190075Sobrien struct language_function base; 728218334Speter tree named_labels; 728318334Speter tree shadowed_labels; 728418334Speter int returns_value; 728518334Speter int returns_null; 728696263Sobrien int returns_abnormally; 728718334Speter int warn_about_return_type; 728818334Speter int extern_inline; 728918334Speter struct binding_level *binding_level; 729018334Speter}; 729118334Speter 729218334Speter/* Save and reinitialize the variables 729318334Speter used during compilation of a C function. */ 729418334Speter 729518334Spetervoid 729690075Sobrienpush_c_function_context (f) 729790075Sobrien struct function *f; 729818334Speter{ 729990075Sobrien struct c_language_function *p; 730090075Sobrien p = ((struct c_language_function *) 730190075Sobrien xmalloc (sizeof (struct c_language_function))); 730290075Sobrien f->language = (struct language_function *) p; 730318334Speter 730490075Sobrien p->base.x_stmt_tree = c_stmt_tree; 730590075Sobrien p->base.x_scope_stmt_stack = c_scope_stmt_stack; 730618334Speter p->named_labels = named_labels; 730718334Speter p->shadowed_labels = shadowed_labels; 730818334Speter p->returns_value = current_function_returns_value; 730918334Speter p->returns_null = current_function_returns_null; 731096263Sobrien p->returns_abnormally = current_function_returns_abnormally; 731118334Speter p->warn_about_return_type = warn_about_return_type; 731218334Speter p->extern_inline = current_extern_inline; 731318334Speter p->binding_level = current_binding_level; 731418334Speter} 731518334Speter 731618334Speter/* Restore the variables used during compilation of a C function. */ 731718334Speter 731818334Spetervoid 731990075Sobrienpop_c_function_context (f) 732090075Sobrien struct function *f; 732118334Speter{ 732290075Sobrien struct c_language_function *p 732390075Sobrien = (struct c_language_function *) f->language; 732418334Speter tree link; 732518334Speter 732618334Speter /* Bring back all the labels that were shadowed. */ 732718334Speter for (link = shadowed_labels; link; link = TREE_CHAIN (link)) 732818334Speter if (DECL_NAME (TREE_VALUE (link)) != 0) 732918334Speter IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) 733018334Speter = TREE_VALUE (link); 733118334Speter 733290075Sobrien if (DECL_SAVED_INSNS (current_function_decl) == 0 733390075Sobrien && DECL_SAVED_TREE (current_function_decl) == NULL_TREE) 733418334Speter { 733518334Speter /* Stop pointing to the local nodes about to be freed. */ 733618334Speter /* But DECL_INITIAL must remain nonzero so we know this 733718334Speter was an actual function definition. */ 733818334Speter DECL_INITIAL (current_function_decl) = error_mark_node; 733918334Speter DECL_ARGUMENTS (current_function_decl) = 0; 734018334Speter } 734118334Speter 734290075Sobrien c_stmt_tree = p->base.x_stmt_tree; 734390075Sobrien c_scope_stmt_stack = p->base.x_scope_stmt_stack; 734418334Speter named_labels = p->named_labels; 734518334Speter shadowed_labels = p->shadowed_labels; 734618334Speter current_function_returns_value = p->returns_value; 734718334Speter current_function_returns_null = p->returns_null; 734896263Sobrien current_function_returns_abnormally = p->returns_abnormally; 734918334Speter warn_about_return_type = p->warn_about_return_type; 735018334Speter current_extern_inline = p->extern_inline; 735118334Speter current_binding_level = p->binding_level; 735218334Speter 735318334Speter free (p); 735490075Sobrien f->language = 0; 735518334Speter} 735618334Speter 735790075Sobrien/* Mark the language specific parts of F for GC. */ 735818334Speter 735918334Spetervoid 736090075Sobrienmark_c_function_context (f) 736190075Sobrien struct function *f; 736290075Sobrien{ 736390075Sobrien struct c_language_function *p 736490075Sobrien = (struct c_language_function *) f->language; 736590075Sobrien 736690075Sobrien if (p == 0) 736790075Sobrien return; 736890075Sobrien 736990075Sobrien mark_c_language_function (&p->base); 737090075Sobrien ggc_mark_tree (p->shadowed_labels); 737190075Sobrien ggc_mark_tree (p->named_labels); 737290075Sobrien mark_binding_level (&p->binding_level); 737390075Sobrien} 737490075Sobrien 737590075Sobrien/* Copy the DECL_LANG_SPECIFIC data associated with NODE. */ 737690075Sobrien 737790075Sobrienvoid 737890075Sobriencopy_lang_decl (decl) 737990075Sobrien tree decl; 738090075Sobrien{ 738190075Sobrien struct lang_decl *ld; 738290075Sobrien 738390075Sobrien if (!DECL_LANG_SPECIFIC (decl)) 738490075Sobrien return; 738590075Sobrien 738690075Sobrien ld = (struct lang_decl *) ggc_alloc (sizeof (struct lang_decl)); 738790075Sobrien memcpy ((char *) ld, (char *) DECL_LANG_SPECIFIC (decl), 738890075Sobrien sizeof (struct lang_decl)); 738990075Sobrien DECL_LANG_SPECIFIC (decl) = ld; 739090075Sobrien} 739190075Sobrien 739290075Sobrien/* Mark the language specific bits in T for GC. */ 739390075Sobrien 739490075Sobrienvoid 739590075Sobrienlang_mark_tree (t) 739690075Sobrien tree t; 739790075Sobrien{ 739890075Sobrien if (TREE_CODE (t) == IDENTIFIER_NODE) 739990075Sobrien { 740090075Sobrien struct lang_identifier *i = (struct lang_identifier *) t; 740190075Sobrien ggc_mark_tree (i->global_value); 740290075Sobrien ggc_mark_tree (i->local_value); 740390075Sobrien ggc_mark_tree (i->label_value); 740490075Sobrien ggc_mark_tree (i->implicit_decl); 740590075Sobrien ggc_mark_tree (i->error_locus); 740690075Sobrien ggc_mark_tree (i->limbo_value); 740790075Sobrien } 740890075Sobrien else if (TYPE_P (t) && TYPE_LANG_SPECIFIC (t)) 740990075Sobrien ggc_mark (TYPE_LANG_SPECIFIC (t)); 741090075Sobrien else if (DECL_P (t) && DECL_LANG_SPECIFIC (t)) 741190075Sobrien { 741290075Sobrien ggc_mark (DECL_LANG_SPECIFIC (t)); 741390075Sobrien c_mark_lang_decl (&DECL_LANG_SPECIFIC (t)->base); 741490075Sobrien ggc_mark_tree (DECL_LANG_SPECIFIC (t)->pending_sizes); 741590075Sobrien } 741690075Sobrien} 741790075Sobrien 741890075Sobrien/* The functions below are required for functionality of doing 741990075Sobrien function at once processing in the C front end. Currently these 742090075Sobrien functions are not called from anywhere in the C front end, but as 742190075Sobrien these changes continue, that will change. */ 742290075Sobrien 742390075Sobrien/* Returns non-zero if the current statement is a full expression, 742490075Sobrien i.e. temporaries created during that statement should be destroyed 742590075Sobrien at the end of the statement. */ 742690075Sobrien 742790075Sobrienint 742890075Sobrienstmts_are_full_exprs_p () 742990075Sobrien{ 743090075Sobrien return 0; 743190075Sobrien} 743290075Sobrien 743390075Sobrien/* Returns the stmt_tree (if any) to which statements are currently 743490075Sobrien being added. If there is no active statement-tree, NULL is 743590075Sobrien returned. */ 743690075Sobrien 743790075Sobrienstmt_tree 743890075Sobriencurrent_stmt_tree () 743990075Sobrien{ 744090075Sobrien return &c_stmt_tree; 744190075Sobrien} 744290075Sobrien 744390075Sobrien/* Returns the stack of SCOPE_STMTs for the current function. */ 744490075Sobrien 744590075Sobrientree * 744690075Sobriencurrent_scope_stmt_stack () 744790075Sobrien{ 744890075Sobrien return &c_scope_stmt_stack; 744990075Sobrien} 745090075Sobrien 745190075Sobrien/* Nonzero if TYPE is an anonymous union or struct type. Always 0 in 745290075Sobrien C. */ 745390075Sobrien 745490075Sobrienint 745590075Sobrienanon_aggr_type_p (node) 745650397Sobrien tree node ATTRIBUTE_UNUSED; 745718334Speter{ 745890075Sobrien return 0; 745918334Speter} 746090075Sobrien 746190075Sobrien/* Dummy function in place of callback used by C++. */ 746290075Sobrien 746390075Sobrienvoid 746490075Sobrienextract_interface_info () 746590075Sobrien{ 746690075Sobrien} 746790075Sobrien 746890075Sobrien/* Return a new COMPOUND_STMT, after adding it to the current 746990075Sobrien statement tree. */ 747090075Sobrien 747190075Sobrientree 747290075Sobrienc_begin_compound_stmt () 747390075Sobrien{ 747490075Sobrien tree stmt; 747590075Sobrien 747690075Sobrien /* Create the COMPOUND_STMT. */ 747790075Sobrien stmt = add_stmt (build_stmt (COMPOUND_STMT, NULL_TREE)); 747890075Sobrien 747990075Sobrien return stmt; 748090075Sobrien} 748190075Sobrien 748290075Sobrien/* Expand T (a DECL_STMT) if it declares an entity not handled by the 748390075Sobrien common code. */ 748490075Sobrien 748590075Sobrienvoid 748690075Sobrienc_expand_decl_stmt (t) 748790075Sobrien tree t; 748890075Sobrien{ 748990075Sobrien tree decl = DECL_STMT_DECL (t); 749090075Sobrien 749190075Sobrien /* Expand nested functions. */ 749290075Sobrien if (TREE_CODE (decl) == FUNCTION_DECL 749390075Sobrien && DECL_CONTEXT (decl) == current_function_decl 749490075Sobrien && DECL_SAVED_TREE (decl)) 749590075Sobrien c_expand_body (decl, /*nested_p=*/1, /*can_defer_p=*/0); 749690075Sobrien} 749790075Sobrien 749890075Sobrien/* Return the IDENTIFIER_GLOBAL_VALUE of T, for use in common code, since 749990075Sobrien the definition of IDENTIFIER_GLOBAL_VALUE is different for C and C++. */ 750090075Sobrien 750190075Sobrientree 750290075Sobrienidentifier_global_value (t) 750390075Sobrien tree t; 750490075Sobrien{ 750590075Sobrien return IDENTIFIER_GLOBAL_VALUE (t); 750690075Sobrien} 750790075Sobrien 750890075Sobrien/* Record a builtin type for C. If NAME is non-NULL, it is the name used; 750990075Sobrien otherwise the name is found in ridpointers from RID_INDEX. */ 751090075Sobrien 751190075Sobrienvoid 751290075Sobrienrecord_builtin_type (rid_index, name, type) 751390075Sobrien enum rid rid_index; 751490075Sobrien const char *name; 751590075Sobrien tree type; 751690075Sobrien{ 751790075Sobrien tree id; 751890075Sobrien if (name == 0) 751990075Sobrien id = ridpointers[(int) rid_index]; 752090075Sobrien else 752190075Sobrien id = get_identifier (name); 752290075Sobrien pushdecl (build_decl (TYPE_DECL, id, type)); 752390075Sobrien} 752490075Sobrien 752590075Sobrien/* Build the void_list_node (void_type_node having been created). */ 752690075Sobrientree 752790075Sobrienbuild_void_list_node () 752890075Sobrien{ 752990075Sobrien tree t = build_tree_list (NULL_TREE, void_type_node); 753090075Sobrien return t; 753190075Sobrien} 7532