diff options
author | Zack Weinberg <zack@codesourcery.com> | 2003-04-11 04:26:55 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2003-04-11 04:26:55 +0000 |
commit | 339a28b96a306cb323a66e9142ab090d36f42ba8 (patch) | |
tree | 17de84c82d5527a115d97db14a145ae19c48be07 /gcc/c-tree.h | |
parent | b1e0a93ee513ccd9fa7d32947f2f568d379f358e (diff) | |
download | gcc-339a28b96a306cb323a66e9142ab090d36f42ba8.zip gcc-339a28b96a306cb323a66e9142ab090d36f42ba8.tar.gz gcc-339a28b96a306cb323a66e9142ab090d36f42ba8.tar.bz2 |
c-decl.c (struct binding_level): Add shadowed_tags and function_body...
2003-04-10 Zack Weinberg <zack@codesourcery.com>
* c-decl.c (struct binding_level): Add shadowed_tags and
function_body; remove this_block, tag_transparent, and
subblocks_tag_transparent; update comments.
(clear_binding_level, lookup_tag_reverse): Kill.
(make_binding_level): Use ggc_alloc_cleared or memset.
(lookup_tag): Remove struct binding_level* parameter. All
callers changed. Just look at IDENTIFIER_TAG_VALUE, and
current_binding_level->tags if asked for thislevel_only or if
we might have to diagnose "struct foo; union foo;"
(pushlevel): Ignore argument. Do not push another binding
level on the transition from the parameters to the top level
of the function body; just tweak the flags and proceed.
(poplevel): Overhaul. Clear IDENTIFIER_TAG_VALUEs; on exiting
a function body, separate the parameter list from the
top-level local variables.
(set_block): Do nothing.
(pushtag): Set IDENTIFIER_TAG_VALUE and add an entry to
shadowed_tags if necessary.
(warn_if_shadowing): Nuke the special case for local shadowing
parameter.
(pushdecl): Do not create a shadow entry if we are replacing
an older decl in the same binding level.
(pushdecl_function_level): Tweak for new way of indicating
function scope.
(shadow_tag_warned): Use TYPE_NAME, not lookup_tag_reverse.
(start_function): Don't set subblocks_tag_transparent.
(finish_function): Fix up the binding_level stack for totally
empty functions. Otherwise, don't call poplevel.
* c-common.c (shadow_warning): MANDATORY argument is no longer
necessary. Always use plain warning.
* c-common.h: Update to match.
* cfglayout.c (scope_to_insns_initialize): Clear block when we
hit the FUNCTION_DECL.
* function.c: Do not create cyclic tree structure.
2003-04-10 Zack Weinberg <zack@codesourcery.com>
* c-tree.h (struct lang_identifier): Replace global_value,
local_value members with symbol_value, tag_value. Kill
implicit_decl and limbo_value.
(IDENTIFIER_GLOBAL_VALUE, IDENTIFIER_LOCAL_VALUE,
IDENTIFIER_LIMBO_VALUE, IDENTIFIER_IMPLICIT_DECL,
C_MISSING_PROTOTYPE_WARNED): Kill.
(IDENTIFIER_SYMBOL_VALUE, IDENTIFIER_TAG_VALUE,
C_DECL_IMPLICIT, C_DECL_ISNT_PROTOTYPE): New.
(C_DECL_ANTICIPATED): Rename to C_DECL_INVISIBLE.
(implicit_decl_warning, lookup_name_current_level,
record_function_scope_shadow): Don't prototype.
(pushdecl_function_level): Prototype.
* c-decl.c (truly_local_externals): New variable.
(struct binding_level): Adjust commentary.
(get_function_binding_level, clear_limbo_values,
record_function_scope_shadow): Kill.
(lookup_name_current_level, implicit_decl_warning): Are now static.
(any_external_decl, record_external_decl): New static functions.
(clone_underlying type): Split out of pushdecl.
(c_print_identifier): Update to match changes to struct
lang_identifier.
(poplevel): Delete #if 0 block. Make externals invisible
instead of clearing their IDENTIFIER_SYMBOL_VALUEs. Don't
call clear_limbo_values. Refer to IDENTIFIER_SYMBOL_VALUE not
IDENTIFIER_GLOBAL_VALUE or IDENTIFIER_LOCAL_VALUE.
(duplicate-decls): For real parm decl after a forward decl,
set TREE_ASM_WRITTEN here. Allow void foo(...) followed by
foo(...) { } with only a warning. Say whether a previous
declaration was implicit.
(warn_if_shadowing): Now handles all shadowing, not just
local-over-local. Clarify comments.
(pushdecl): Rewritten. There is no longer a distinction
between global and local symbol values; they're all
IDENTIFIER_SYMBOL_VALUE. Call record_external_decl on all
DECL_EXTERNAL decls, and use any_external_decl to check
against previous externals. Kill #if 0 blocks. Don't
tolerate error_mark_node being NULL.
(pushdecl_top_level): Handle only those cases which
Objective C (the only user) needs.
(pushdecl_function_level): New function.
(implicitly_declare): Create ordinary decls with
C_DECL_IMPLICIT set. Recycle old decls, however they got
created.
(lookup_name): It's always IDENTIFIER_SYMBOL_VALUE. Return 0
for C_DECL_INVISIBLE symbols.
(lookup_name_current_level): Likewise. Use chain_member.
(c_make_fname_decl): Don't muck with DECL_CONTEXT.
Use pushdecl_function_level.
(builtin_function): Use C_DECL_INVISIBLE.
(start_function): Don't muck with IDENTIFIER_IMPLICIT_DECL.
Use C_DECL_ISNT_PROTOTYPE and C_DECL_IMPLICIT.
(store_parm_decls): It's IDENTIFIER_SYMBOL_VALUE now.
(identifier_global_value): Same. Must scan
global_binding_level in extremis.
* c-typeck.c (undeclared_variable): New static function, split
from build_external_ref.
(build_external_ref): Use DECL_CONTEXT, not
IDENTIFIER_LOCAL_VALUE, to decide whether a local hides
an instance variable. Restructure for clarity.
* objc/objc-act.c: Use identifier_global_value, not
IDENTIFIER_GLOBAL_VALUE.
cp:
* decl.c: Update all calls to shadow_warning.
testsuite:
* gcc.c-torture/execute/builtin-noret-2.c: New.
* gcc.c-torture/execute/builtin-noret-2.x: New.
XFAIL builtin-noret-2.c at -O1 and above.
* gcc.dg/redecl.c: New.
* gcc.dg/Wshadow-1.c: Update error regexps.
From-SVN: r65460
Diffstat (limited to 'gcc/c-tree.h')
-rw-r--r-- | gcc/c-tree.h | 66 |
1 files changed, 29 insertions, 37 deletions
diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 29352f5..368c970 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -1,6 +1,6 @@ /* Definitions for C parsing and type checking. Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, - 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -37,11 +37,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA struct lang_identifier GTY(()) { struct c_common_identifier common_id; - tree global_value; - tree local_value; + tree symbol_value; + tree tag_value; tree label_value; - tree implicit_decl; - tree limbo_value; }; /* The resulting tree type. */ @@ -70,26 +68,17 @@ struct lang_decl GTY(()) /* Macros for access to language-specific slots in an identifier. */ /* Each of these slots contains a DECL node or null. */ -/* This represents the value which the identifier has in the - file-scope namespace. */ -#define IDENTIFIER_GLOBAL_VALUE(NODE) \ - (((struct lang_identifier *) (NODE))->global_value) -/* This represents the value which the identifier has in the current - scope. */ -#define IDENTIFIER_LOCAL_VALUE(NODE) \ - (((struct lang_identifier *) (NODE))->local_value) -/* This represents the value which the identifier has as a label in - the current label scope. */ +/* The value of the identifier in the namespace of "ordinary identifiers" + (data objects, enum constants, functions, typedefs). */ +#define IDENTIFIER_SYMBOL_VALUE(NODE) \ + (((struct lang_identifier *) (NODE))->symbol_value) +/* The value of the identifier in the namespace of struct, union, + and enum tags. */ +#define IDENTIFIER_TAG_VALUE(NODE) \ + (((struct lang_identifier *) (NODE))->tag_value) +/* The value of the identifier in the namespace of labels. */ #define IDENTIFIER_LABEL_VALUE(NODE) \ (((struct lang_identifier *) (NODE))->label_value) -/* This records the extern decl of this identifier, if it has had one - at any point in this compilation. */ -#define IDENTIFIER_LIMBO_VALUE(NODE) \ - (((struct lang_identifier *) (NODE))->limbo_value) -/* This records the implicit function decl of this identifier, if it - has had one at any point in this compilation. */ -#define IDENTIFIER_IMPLICIT_DECL(NODE) \ - (((struct lang_identifier *) (NODE))->implicit_decl) /* In identifiers, C uses the following fields in a special way: TREE_PUBLIC to record that there was a previous local extern decl. @@ -129,13 +118,6 @@ struct lang_type GTY(()) #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE) #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE) -#if 0 /* Not used. */ -/* Record whether a decl for a function or function pointer has - already been mentioned (in a warning) because it was called - but didn't have a prototype. */ -#define C_MISSING_PROTOTYPE_WARNED(DECL) DECL_LANG_FLAG_2 (DECL) -#endif - /* Store a value in that field. */ #define C_SET_EXP_ORIGINAL_CODE(EXP, CODE) \ (TREE_COMPLEXITY (EXP) = (int) (CODE)) @@ -147,10 +129,22 @@ struct lang_type GTY(()) return type. */ #define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP) -/* Nonzero for a declaration of a built in function if there has been no - occasion that would declare the function in ordinary C. - Using the function draws a pedantic warning in this case. */ -#define C_DECL_ANTICIPATED(EXP) DECL_LANG_FLAG_3 (EXP) +/* For a FUNCTION_DECL, nonzero if it was an implicit declaration. */ +#define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP) + +/* Nonzero for a declaration of an external object which is not + currently in scope. This is either a built-in declaration of + a library function, before a real declaration has been seen, + or a declaration that appeared in an inner scope that has ended. */ +#define C_DECL_INVISIBLE(EXP) DECL_LANG_FLAG_3 (EXP) + +/* Nonzero for a decl which either doesn't exist or isn't a prototype. + N.B. Could be simplified if all built-in decls had complete prototypes + (but this is presently difficult because some of them need FILE*). */ +#define C_DECL_ISNT_PROTOTYPE(EXP) \ + (EXP == 0 \ + || (TYPE_ARG_TYPES (TREE_TYPE (EXP)) == 0 \ + && !DECL_BUILT_IN (EXP))) /* For FUNCTION_TYPE, a hidden list of types of arguments. The same as TYPE_ARG_TYPES for functions with prototypes, but created for functions @@ -207,11 +201,9 @@ extern tree grokfield PARAMS ((const char *, int, tree extern tree groktypename PARAMS ((tree)); extern tree groktypename_in_parm_context PARAMS ((tree)); extern tree implicitly_declare PARAMS ((tree)); -extern void implicit_decl_warning PARAMS ((tree)); extern int in_parm_level_p PARAMS ((void)); extern void keep_next_level PARAMS ((void)); extern tree lookup_name PARAMS ((tree)); -extern tree lookup_name_current_level PARAMS ((tree)); extern void parmlist_tags_warning PARAMS ((void)); extern void pending_xref_error PARAMS ((void)); extern void c_push_function_context PARAMS ((struct function *)); @@ -220,8 +212,8 @@ extern void pop_label_level PARAMS ((void)); extern void push_label_level PARAMS ((void)); extern void push_parm_decl PARAMS ((tree)); extern tree pushdecl_top_level PARAMS ((tree)); +extern tree pushdecl_function_level PARAMS ((tree, tree)); extern void pushtag PARAMS ((tree, tree)); -extern void record_function_scope_shadow PARAMS ((tree)); extern tree set_array_declarator_type PARAMS ((tree, tree, int)); extern tree shadow_label PARAMS ((tree)); extern void shadow_tag PARAMS ((tree)); |