diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2003-03-17 21:16:07 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2003-03-17 21:16:07 +0000 |
commit | 6970c06a4e8f9ff3524043bf64b51c6870693bc7 (patch) | |
tree | 31b103a6bcb45591e0e91a4f7c7f9fe1d63b1dfb /gcc/c-decl.c | |
parent | 0fef2ffc6fb58f17d68b9d50d0eec76315ec09ba (diff) | |
download | gcc-6970c06a4e8f9ff3524043bf64b51c6870693bc7.zip gcc-6970c06a4e8f9ff3524043bf64b51c6870693bc7.tar.gz gcc-6970c06a4e8f9ff3524043bf64b51c6870693bc7.tar.bz2 |
c-tree.h (struct lang_identifier): Remove error_locus field.
* c-tree.h (struct lang_identifier): Remove error_locus field.
(IDENTIFIER_ERROR_LOCUS): Kill.
(record_function_scope_shadow): New prototype.
* c-typeck.c (build_external_ref): Don't complain if
decl is error_mark_node. When not at file scope, bind the
decl's local value to error_mark_node to suppress further
warnings, instead of setting IDENTIFIER_ERROR_LOCUS.
* c-decl.c (get_function_binding_level): New static function.
(record_function_scope_shadow): New exported function.
(c_make_fname_decl): Use get_function_binding_level.
From-SVN: r64504
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 2aa0ee7..a4b435e 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -268,7 +268,8 @@ tree static_ctors, static_dtors; /* Forward declarations. */ -static struct binding_level * make_binding_level PARAMS ((void)); +static struct binding_level *make_binding_level PARAMS ((void)); +static struct binding_level *get_function_binding_level PARAMS ((void)); static void pop_binding_level PARAMS ((struct binding_level **)); static void clear_limbo_values PARAMS ((tree)); static int duplicate_decls PARAMS ((tree, tree, int)); @@ -309,7 +310,6 @@ c_print_identifier (file, node, indent) print_node (file, "local", IDENTIFIER_LOCAL_VALUE (node), indent + 4); print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4); - print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4); print_node (file, "limbo value", IDENTIFIER_LIMBO_VALUE (node), indent + 4); if (C_IS_RESERVED_WORD (node)) { @@ -360,6 +360,17 @@ make_binding_level () return (struct binding_level *) ggc_alloc (sizeof (struct binding_level)); } +/* Return the outermost binding level for the current function. */ +static struct binding_level * +get_function_binding_level () +{ + struct binding_level *b = current_binding_level; + + while (b->level_chain->parm_flag == 0) + b = b->level_chain; + return b; +} + /* Remove a binding level from a list and add it to the level chain. */ static void @@ -2016,6 +2027,17 @@ pushdecl (x) return x; } +/* Record that the local value of NAME is shadowed at function scope. + This is used by build_external_ref in c-typeck.c. */ +void +record_function_scope_shadow (name) + tree name; +{ + struct binding_level *b = get_function_binding_level (); + b->shadowed = tree_cons (name, IDENTIFIER_LOCAL_VALUE (name), + b->shadowed); +} + /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */ tree @@ -2557,11 +2579,8 @@ c_make_fname_decl (id, type_dep) if (current_function_decl) { /* Add the decls to the outermost block. */ - struct binding_level *b = current_binding_level; - struct binding_level *old = b; - while (b->level_chain->parm_flag == 0) - b = b->level_chain; - current_binding_level = b; + struct binding_level *old = current_binding_level; + current_binding_level = get_function_binding_level (); pushdecl (decl); current_binding_level = old; } |