📄 c-decl.c
字号:
/* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING. If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA. *//* Process declarations and symbol lookup for C front end. Also constructs types; the standard scalar types at initialization, and structure, union, array and enum types when they are declared. *//* ??? not all decl nodes are given the most useful possible line numbers. For example, the CONST_DECLs for enum values. */#include "config.h"#include "tree.h"#include "flags.h"#include "output.h"#include "c-tree.h"#include "c-lex.h"#include <stdio.h>/* In grokdeclarator, distinguish syntactic contexts of declarators. */enum decl_context{ NORMAL, /* Ordinary declaration */ FUNCDEF, /* Function definition */ PARM, /* Declaration of parm before function body */ FIELD, /* Declaration inside struct or union */ BITFIELD, /* Likewise but with specified width */ TYPENAME}; /* Typename (inside cast or sizeof) */#ifndef CHAR_TYPE_SIZE#define CHAR_TYPE_SIZE BITS_PER_UNIT#endif#ifndef SHORT_TYPE_SIZE#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))#endif#ifndef INT_TYPE_SIZE#define INT_TYPE_SIZE BITS_PER_WORD#endif#ifndef LONG_TYPE_SIZE#define LONG_TYPE_SIZE BITS_PER_WORD#endif#ifndef LONG_LONG_TYPE_SIZE#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)#endif#ifndef WCHAR_UNSIGNED#define WCHAR_UNSIGNED 0#endif#ifndef FLOAT_TYPE_SIZE#define FLOAT_TYPE_SIZE BITS_PER_WORD#endif#ifndef DOUBLE_TYPE_SIZE#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)#endif#ifndef LONG_DOUBLE_TYPE_SIZE#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)#endif/* We let tm.h override the types used here, to handle trivial differences such as the choice of unsigned int or long unsigned int for size_t. When machines start needing nontrivial differences in the size type, it would be best to do something here to figure out automatically from other information what type to use. */#ifndef SIZE_TYPE#define SIZE_TYPE "long unsigned int"#endif#ifndef PTRDIFF_TYPE#define PTRDIFF_TYPE "long int"#endif#ifndef WCHAR_TYPE#define WCHAR_TYPE "int"#endif/* a node which has tree code ERROR_MARK, and whose type is itself. All erroneous expressions are replaced with this node. All functions that accept nodes as arguments should avoid generating error messages if this node is one of the arguments, since it is undesirable to get multiple error messages from one error in the input. */tree error_mark_node;/* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */tree short_integer_type_node;tree integer_type_node;tree long_integer_type_node;tree long_long_integer_type_node;tree short_unsigned_type_node;tree unsigned_type_node;tree long_unsigned_type_node;tree long_long_unsigned_type_node;tree boolean_type_node;tree boolean_false_node;tree boolean_true_node;tree ptrdiff_type_node;tree unsigned_char_type_node;tree signed_char_type_node;tree char_type_node;tree wchar_type_node;tree signed_wchar_type_node;tree unsigned_wchar_type_node;tree float_type_node;tree double_type_node;tree long_double_type_node;tree complex_integer_type_node;tree complex_float_type_node;tree complex_double_type_node;tree complex_long_double_type_node;tree intQI_type_node;tree intHI_type_node;tree intSI_type_node;tree intDI_type_node;tree unsigned_intQI_type_node;tree unsigned_intHI_type_node;tree unsigned_intSI_type_node;tree unsigned_intDI_type_node;/* a VOID_TYPE node. */tree void_type_node;/* Nodes for types `void *' and `const void *'. */tree ptr_type_node, const_ptr_type_node;/* Nodes for types `char *' and `const char *'. */tree string_type_node, const_string_type_node;/* Type `char[SOMENUMBER]'. Used when an array of char is needed and the size is irrelevant. */tree char_array_type_node;/* Type `int[SOMENUMBER]' or something like it. Used when an array of int needed and the size is irrelevant. */tree int_array_type_node;/* Type `wchar_t[SOMENUMBER]' or something like it. Used when a wide string literal is created. */tree wchar_array_type_node;/* type `int ()' -- used for implicit declaration of functions. */tree default_function_type;/* function types `double (double)' and `double (double, double)', etc. */tree double_ftype_double, double_ftype_double_double;tree int_ftype_int, long_ftype_long;tree float_ftype_float;tree ldouble_ftype_ldouble;/* Function type `void (void *, void *, int)' and similar ones */tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;/* Function type `char *(char *, char *)' and similar ones */tree string_ftype_ptr_ptr, int_ftype_string_string;/* Function type `int (const void *, const void *, size_t)' */tree int_ftype_cptr_cptr_sizet;/* Two expressions that are constants with value zero. The first is of type `int', the second of type `void *'. */tree integer_zero_node;tree null_pointer_node;/* A node for the integer constant 1. */tree integer_one_node;/* Nonzero if we have seen an invalid cross reference to a struct, union, or enum, but not yet printed the message. */tree pending_invalid_xref;/* File and line to appear in the eventual error message. */char *pending_invalid_xref_file;int pending_invalid_xref_line;/* While defining an enum type, this is 1 plus the last enumerator constant value. Note that will do not have to save this or `enum_overflow' around nested function definition since such a definition could only occur in an enum value expression and we don't use these variables in that case. */static tree enum_next_value;/* Nonzero means that there was overflow computing enum_next_value. */static int enum_overflow;/* Parsing a function declarator leaves a list of parameter names or a chain or parameter decls here. */static tree last_function_parms;/* Parsing a function declarator leaves here a chain of structure and enum types declared in the parmlist. */static tree last_function_parm_tags;/* After parsing the declarator that starts a function definition, `start_function' puts here the list of parameter names or chain of decls. `store_parm_decls' finds it here. */static tree current_function_parms;/* Similar, for last_function_parm_tags. */static tree current_function_parm_tags;/* Similar, for the file and line that the prototype came from if this is an old-style definition. */static char *current_function_prototype_file;static int current_function_prototype_line;/* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function that have names. Here so we can clear out their names' definitions at the end of the function. */static tree named_labels;/* A list of LABEL_DECLs from outer contexts that are currently shadowed. */static tree shadowed_labels;/* Nonzero when store_parm_decls is called indicates a varargs function. Value not meaningful after store_parm_decls. */static int c_function_varargs;/* The FUNCTION_DECL for the function currently being compiled, or 0 if between functions. */tree current_function_decl;/* Set to 0 at beginning of a function definition, set to 1 if a return statement that specifies a return value is seen. */int current_function_returns_value;/* Set to 0 at beginning of a function definition, set to 1 if a return statement with no argument is seen. */int current_function_returns_null;/* Set to nonzero by `grokdeclarator' for a function whose return type is defaulted, if warnings for this are desired. */static int warn_about_return_type;/* Nonzero when starting a function declared `extern inline'. */static int current_extern_inline;/* For each binding contour we allocate a binding_level structure * which records the names defined in that contour. * Contours include: * 0) the global one * 1) one for each function definition, * where internal declarations of the parameters appear. * 2) one for each compound statement, * to record its declarations. * * The current meaning of a name can be found by searching the levels from * the current one out to the global one. *//* Note that the information in the `names' component of the global contour is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */struct binding_level { /* A chain of _DECL nodes for all variables, constants, functions, and typedef types. These are in the reverse of the order supplied. */ tree names; /* A list of structure, union and enum definitions, * for looking up tag names. * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name, * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE, * or ENUMERAL_TYPE node. */ tree tags; /* For each level, a list of shadowed outer-level local definitions to be restored when this level is popped. Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and whose TREE_VALUE is its old definition (a kind of ..._DECL node). */ tree shadowed; /* For each level (except not the global one), a chain of BLOCK nodes for all the levels that were entered and exited one level down. */ tree blocks; /* The BLOCK node for this level, if one has been preallocated. If 0, the BLOCK is allocated (if needed) when the level is popped. */ tree this_block; /* The binding level which this one is contained in (inherits from). */ struct binding_level *level_chain; /* Nonzero for the level that holds the parameters of a function. */ char parm_flag; /* Nonzero if this level "doesn't exist" for tags. */ char tag_transparent; /* Nonzero if sublevels of this level "don't exist" for tags. This is set in the parm level of a function definition while reading the function body, so that the outermost block of the function body will be tag-transparent. */ char subblocks_tag_transparent; /* Nonzero means make a BLOCK for this level regardless of all else. */ char keep; /* Nonzero means make a BLOCK if this level has any subblocks. */ char keep_if_subblocks; /* Number of decls in `names' that have incomplete structure or union types. */ int n_incomplete; /* A list of decls giving the (reversed) specified order of parms, not including any forward-decls in the parmlist. This is so we can put the parms in proper order for assign_parms. */ tree parm_order; };#define NULL_BINDING_LEVEL (struct binding_level *) NULL /* The binding level currently in effect. */static struct binding_level *current_binding_level;/* A chain of binding_level structures awaiting reuse. */static struct binding_level *free_binding_level;/* The outermost binding level, for names of file scope. This is created when the compiler is started and exists through the entire run. */static struct binding_level *global_binding_level;/* Binding level structures are initialized by copying this one. */static struct binding_level clear_binding_level = {NULL, NULL, NULL, NULL, NULL, NULL_BINDING_LEVEL, 0, 0, 0, 0, 0, 0, NULL};/* Nonzero means unconditionally make a BLOCK for the next level pushed. */static int keep_next_level_flag;/* Nonzero means make a BLOCK for the next level pushed if it has subblocks. */static int keep_next_if_subblocks; /* The chain of outer levels of label scopes. This uses the same data structure used for binding levels, but it works differently: each link in the chain records saved values of named_labels and shadowed_labels for a label binding level outside the current one. */static struct binding_level *label_level_chain;/* Functions called automatically at the beginning and end of execution. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -