diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2004-03-23 23:47:53 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-03-23 23:47:53 +0000 |
commit | f75fbaf754292f4e64bef542d23e9e66ae500635 (patch) | |
tree | 9fca15bf978e2eb7c57b3483c5dfb6949062ad3d /gcc/objc | |
parent | 5595a2bd855cc9bdd52db434454cd755a73ca44c (diff) | |
download | gcc-f75fbaf754292f4e64bef542d23e9e66ae500635.zip gcc-f75fbaf754292f4e64bef542d23e9e66ae500635.tar.gz gcc-f75fbaf754292f4e64bef542d23e9e66ae500635.tar.bz2 |
PR 12267, 12391, 12560, 13129, 14114, 14113
* c-tree.h: Forward declare struct c_binding. Declare
c_override_bindings_to_false. Update prototypes.
(struct lang_identifier): Update comments. Change fields to be
struct c_binding *.
(IDENTIFIER_SYMBOL_VALUE, IDENTIFIER_TAG_VALUE)
(IDENTIFIER_LABEL_VALUE, C_DECL_INVISIBLE)
(KEEP_NO, KEEP_YES, KEEP_MAYBE): Delete.
(C_DECL_IN_EXTERNAL_SCOPE, C_DECL_DECLARED_BUILTIN): New.
* c-common.h: Update prototypes.
* c-decl.c (struct c_scope): Update commentary. Remove names,
names_last, parms, parms_last, tags, and shadowed fields. Add
bindings and depth fields.
(scope_freelist): Move to more appropriate location.
(c_print_identifier): Update for changes to struct lang_identifier.
(objc_mark_locals_volatile): Update for new bindings structures.
(global_bindings_p): Honor c_override_global_bindings_to_false.
(pushlevel): Rename to push_scope; take no arguments; use the
scope_freelist; initialize scope->depth and check for overflow.
(poplevel): Rename to pop_scope; totally rewritten for new bindings
structures.
(diagnose_mismatched_decls): Use C_DECL_DECLARED_BUILTIN, not
C_DECL_INVISIBLE, for certain decisions. Adjust some diagnostics.
Improve some commentary. Adjust handling of forward parm decls.
(merge_decls): Set C_DECL_DECLARED_BUILTIN when appropriate.
Preserve C_DECL_IN_EXTERNAL_SCOPE.
(warn_if_shadowing): Correct indentation. Improve diagnostics.
(pushdecl): Remove unnecessary assertion. Short-circuit anonymous
decls. Rewrite for new bindings structures. Improve commentary.
Eliminate the copy_node call.
(implicit_decl_warning): Use the "diag" idiom (as seen in
locate_old_decl) to reduce code duplication; call locate_old_decl
if appropriate. Relocate to remove need for forward declaration.
(implicitly_declare): Adjust for new bindings structures. Kludge
around Objective-C not-really-builtin functions.
(undeclared_variable): Improve diagnostics. If current_function_decl
is nonnull but current_function_scope is null, use current_scope.
Use bind.
(lookup_tag): Adjust for new bindings structures. Kludge around
Objective-C's tag declarations that wind up in the external scope.
(lookup_name): Adjust for new bindings structures. Kludge around
c-common.c's pseudo-typedefs that wind up in the external scope.
(lookup_name_current_level): Rename lookup_name_in_scope; take a
second argument indicating the scope to examine; rewrite for
new bindings structures.
(c_init_decl_processing): Adjust for renamed functions. Do not
initialize current_file_decl, first_builtin_decl, last_builtin_decl.
First scope pushed is the external scope, not the global scope.
(builtin_function): Use bind, not pushdecl. Adjust other bits
for new data structures. Keep track of builtins that should be
made visible automatically.
(start_decl): Adjust diagnostics. Remove unnecessary call to
expand_decl.
(grokparms): Return 0 if arg_types is error_mark_node.
(get_parm_info): Rename "void_at_end" argument to "ellipsis", with
reversed sense. Rewrite for new bindings structures. Do not
leave any decls in the scope, to prevent pop_scope from doing
contradictory things with them.
(finish_struct, finish_enum): Remove redundant diagnostics.
(build_enumerator): Don't cascade diagnostics for error_mark_node.
Mark location where -pedantic changes the meaning of the program.
(store_parm_decls_newstyle, store_parm_decls_oldstyle): Load the
parameter decls into the function's scope structure using bind.
Warn here about function definitions in the wrong style.
Adjust diagnostics.
(store_parm_decls): Correct the determination of whether a
function was defined with a prototype.
(c_write_global_declarations): Operate on all file decls and on
the external scope. Split body of the loop to...
(c_write_global_declarations_1): ... this new function, to avoid
code duplication.
(truly_local_externals, first_builtin_decl, last_builtin_decl)
(make_scope, pop_scope, in_parm_level_p, set_block)
(any_external_decl, record_external_decl, bind_label, getdecls)
(link_hash_hash, link_hash_eq, merge_translation_unit_decls)
(c_reset_state): Delete.
(visible_builtins, c_override_global_bindings_to_false)
(c_binding, I_SYMBOL_BINDING, I_SYMBOL_DECL, I_TAG_BINDING)
(I_TAG_DECL, I_LABEL_BINDING, I_LABEL_DECL, file_scope)
(external_scope, binding_freelist, bind, free_binding_and_advance)
(push_file_scope, pop_file_scope): New.
(pushtag, pushdecl_top_level, lookup_label, declare_label)
(define_label, c_make_fname_decl, finish_decl)
(mark_forward_parm_decls, build_compound_literal)
(grokdeclarator, start_function, check_for_loop_decls)
(identifier_global_value, record_builtin_type): Minor adjustments
for new bindings structures. Improve diagnostics and commentary.
* c-objc-common.c (start_cdtor, finish_cdtor): Adjust calls to
pushlevel/poplevel respectively.
(c_objc_common_finish_file): Don't call merge_translation_unit_decls.
* c-opts.c (c_common_parse_file): Remove spurious ATTRIBUTE_UNUSED.
Warn about YYDEBUG not being defined only if -dy. Remove no-longer-
correct loop over multiple translation units; call fatal_error if
requested to compile more than one file at once. (This disables
IMA temporarily - an up-front error being preferable to a crash.)
* c-parse.in (pushlevel, poplevel rules): Rename push_scope, pop_scope.
(all actions): Adjust calls to pushlevel/poplevel.
(parsing_iso_function_signature): Delete.
(extdef_1): Fold into extdef.
(old_style_parm_decls_1): Fold into old_style_parm_decls. Don't
warn here about function definitions in the wrong style.
(after_tyle_declarator, parm_declarator_starttypename)
(parm_declarator_nostarttypename, notype_declarator): Remove
commented-out productions.
(parmlist_1, parmlist_2): Use make_node, not tree_cons, to create
an empty TREE_LIST node. Adjust calls to get_parm_info.
(parmlist_2 : ELLIPSIS): Tag the arg-info block with error_mark_node
to suppress -Wold-style-definition after this error.
(c_parse_file): Don't clear the binding stack or call
finish_fname_decls here. Correct comment.
* c-typeck.c (same_translation_unit_p): Export.
(common_type): Use c_override_global_bindings_to_false, not
pushlevel/poplevel/declare_parm_level.
* c-lang.c: Override LANG_HOOKS_CLEAR_BINDING_STACK,
LANG_HOOKS_PUSHLEVEL, LANG_HOOKS_POPLEVEL, LANG_HOOKS_SET_BLOCK,
and LANG_HOOKS_GETDECLS with do-nothing stubs.
* objc/objc-lang.c: Likewise.
* objc/objc-act.c: Adjust all calls to pushlevel, poplevel,
get_parm_info.
(OBJC_VOID_AT_END): Delete; replace all uses
with void_list_node.
(generate_forward_declaration_to_string_table): Delete.
* objc/objc-act.h (OCTI_STRG_DECL, UOBJC_STRINGS_decl): Delete.
* coverage.c (create_coverage): Don't pushdecl anything.
* langhooks.c (lhd_clear_binding_stack): Call
lang_hooks.decls.poplevel, not poplevel.
* tree.c (list_length): If ENABLE_TREE_CHECKING, abort on a
circular list rather than going into an infinite loop.
cp:
* cp-lang.c (c_reset_state): Delete.
(push_file_scope, pop_file_scope): New stubs.
* parser.c (c_parse_file): Call sorry() here if called more than once.
testsuite:
* gcc.dg/Wold-style-definition-1.c, gcc.dg/builtins-30.c
* gcc.dg/unused-4.c, gcc.dg/noncompile/label-1.c
* gcc.dg/noncompile/label-lineno-1.c, objc.dg/naming-1.m:
Adjust error regexps.
* gcc.dg/Wshadow-2.c, gcc.dg/noncompile/incomplete-3.c
* gcc.dg/noncompile/undeclared-1.c: New test cases.
* gcc.dg/decl-5.c, gcc.dg/redecl-1.c: Remove XFAIL.
* gcc.dg/local1.c: Add explanatory comment.
From-SVN: r79883
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/objc-act.c | 60 | ||||
-rw-r--r-- | gcc/objc/objc-act.h | 2 | ||||
-rw-r--r-- | gcc/objc/objc-lang.c | 15 |
3 files changed, 34 insertions, 43 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 1d76cc4..89abaf4 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -64,8 +64,6 @@ Boston, MA 02111-1307, USA. */ #include "diagnostic.h" #include "cgraph.h" -#define OBJC_VOID_AT_END build_tree_list (NULL_TREE, void_type_node) - /* This is the default way of generating a method name. */ /* I am not sure it is really correct. Perhaps there's a danger that it will make name conflicts @@ -161,7 +159,6 @@ static void generate_ivar_lists (void); static void generate_dispatch_tables (void); static void generate_shared_structures (void); static tree generate_protocol_list (tree); -static void generate_forward_declaration_to_string_table (void); static void build_protocol_reference (tree); static tree build_keyword_selector (tree); @@ -1238,7 +1235,7 @@ synth_module_prologue (void) = build_function_type (IMP_type, tree_cons (NULL_TREE, id_type, tree_cons (NULL_TREE, selector_type, - OBJC_VOID_AT_END))); + void_list_node))); umsg_decl = builtin_function (TAG_MSGSEND, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); @@ -1248,7 +1245,7 @@ synth_module_prologue (void) = build_function_type (IMP_type, tree_cons (NULL_TREE, super_type, tree_cons (NULL_TREE, selector_type, - OBJC_VOID_AT_END))); + void_list_node))); umsg_super_decl = builtin_function (TAG_MSGSENDSUPER, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); @@ -1259,7 +1256,7 @@ synth_module_prologue (void) temp_type = build_function_type (id_type, tree_cons (NULL_TREE, const_string_type_node, - OBJC_VOID_AT_END)); + void_list_node)); objc_get_class_decl = builtin_function (TAG_GETCLASS, temp_type, 0, NOT_BUILT_IN, @@ -1305,8 +1302,6 @@ synth_module_prologue (void) TREE_USED (UOBJC_SELECTOR_TABLE_decl) = 1; } - generate_forward_declaration_to_string_table (); - /* Forward declare constant_string_id and constant_string_type. */ if (!constant_string_class_name) constant_string_class_name = default_constant_string_class_name; @@ -1877,7 +1872,7 @@ build_module_descriptor (void) get_identifier (TAG_EXECCLASS), build_function_type (void_type_node, tree_cons (NULL_TREE, ptr_type_node, - OBJC_VOID_AT_END))); + void_list_node))); DECL_EXTERNAL (execclass_decl) = 1; DECL_ARTIFICIAL (execclass_decl) = 1; @@ -1892,7 +1887,7 @@ build_module_descriptor (void) start_function (void_list_node_1, build_nt (CALL_EXPR, init_function_name, tree_cons (NULL_TREE, NULL_TREE, - OBJC_VOID_AT_END), + void_list_node), NULL_TREE), NULL_TREE); store_parm_decls (); @@ -1919,22 +1914,6 @@ build_module_descriptor (void) } } -/* extern const char _OBJC_STRINGS[]; */ - -static void -generate_forward_declaration_to_string_table (void) -{ - tree sc_spec, decl_specs, expr_decl; - - sc_spec = tree_cons (NULL_TREE, ridpointers[(int) RID_EXTERN], NULL_TREE); - decl_specs = tree_cons (NULL_TREE, ridpointers[(int) RID_CHAR], sc_spec); - - expr_decl - = build_nt (ARRAY_REF, get_identifier ("_OBJC_STRINGS"), NULL_TREE); - - UOBJC_STRINGS_decl = define_decl (expr_decl, decl_specs); -} - /* Return the DECL of the string IDENT in the SECTION. */ static tree @@ -2699,7 +2678,7 @@ objc_enter_block (void) block = begin_compound_stmt (0); #else block = c_begin_compound_stmt (); - pushlevel (0); + push_scope (); clear_last_expr (); add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0); #endif @@ -2724,7 +2703,7 @@ objc_exit_block (void) finish_compound_stmt (0, block); #else scope_stmt = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); - inner = poplevel (KEEP_MAYBE, 1, 0); + inner = pop_scope (); SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt)) = SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmt)) @@ -3331,7 +3310,7 @@ build_objc_exception_stuff (void) = build_function_type (id_type, tree_cons (NULL_TREE, build_pointer_type (objc_exception_data_template), - OBJC_VOID_AT_END)); + void_list_node)); objc_exception_extract_decl = builtin_function (TAG_EXCEPTIONEXTRACT, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); /* void objc_exception_try_enter(struct _objc_exception_data *); */ @@ -3340,7 +3319,7 @@ build_objc_exception_stuff (void) = build_function_type (void_type_node, tree_cons (NULL_TREE, build_pointer_type (objc_exception_data_template), - OBJC_VOID_AT_END)); + void_list_node)); objc_exception_try_enter_decl = builtin_function (TAG_EXCEPTIONTRYENTER, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); objc_exception_try_exit_decl @@ -3350,7 +3329,7 @@ build_objc_exception_stuff (void) /* void objc_sync_exit(id); */ temp_type = build_function_type (void_type_node, tree_cons (NULL_TREE, id_type, - OBJC_VOID_AT_END)); + void_list_node)); objc_exception_throw_decl = builtin_function (TAG_EXCEPTIONTHROW, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); DECL_ATTRIBUTES (objc_exception_throw_decl) @@ -3363,7 +3342,7 @@ build_objc_exception_stuff (void) temp_type = build_function_type (integer_type_node, tree_cons (NULL_TREE, id_type, tree_cons (NULL_TREE, id_type, - OBJC_VOID_AT_END))); + void_list_node))); objc_exception_match_decl = builtin_function (TAG_EXCEPTIONMATCH, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); @@ -5463,7 +5442,7 @@ get_arg_type_list (tree meth, int context, int superflag) if (METHOD_ADD_ARGS (meth) == objc_ellipsis_node) /* We have a `, ...' immediately following the selector, - finalize the arglist...simulate get_parm_info (0). */ + finalize the arglist...simulate get_parm_info (true). */ ; else if (METHOD_ADD_ARGS (meth)) { @@ -5472,8 +5451,8 @@ get_arg_type_list (tree meth, int context, int superflag) chainon (arglist, add_arg_list); } else - /* finalize the arglist...simulate get_parm_info (1) */ - chainon (arglist, OBJC_VOID_AT_END); + /* finalize the arglist...simulate get_parm_info (false) */ + chainon (arglist, void_list_node); return arglist; } @@ -7539,7 +7518,8 @@ start_method_def (tree method) UOBJC_SUPER_decl = NULL_TREE; /* Must be called BEFORE start_function. */ - pushlevel (0); + push_scope (); + declare_parm_level (); /* Generate prototype declarations for arguments..."new-style". */ synth_self_and_ucmd_args (); @@ -7819,9 +7799,9 @@ continue_method_def (void) if (METHOD_ADD_ARGS (objc_method_context) == objc_ellipsis_node) /* We have a `, ...' immediately following the selector. */ - parmlist = get_parm_info (0); + parmlist = get_parm_info (/*ellipsis=*/true); else - parmlist = get_parm_info (1); /* place a `void_at_end' */ + parmlist = get_parm_info (/*ellipsis=*/false); #ifndef OBJCPLUS /* Set self_decl from the first argument...this global is used by @@ -7829,7 +7809,7 @@ continue_method_def (void) self_decl = TREE_PURPOSE (parmlist); #endif /* !OBJCPLUS */ - poplevel (0, 0, 0); + pop_scope (); really_start_method (objc_method_context, parmlist); store_parm_decls (); } @@ -8801,8 +8781,6 @@ finish_objc (void) objc_implementation_context = NULL_TREE; } - generate_forward_declaration_to_string_table (); - /* Process the static instances here because initialization of objc_symtab depends on them. */ if (objc_static_instances) diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h index abbf656..db7eeca 100644 --- a/gcc/objc/objc-act.h +++ b/gcc/objc/objc-act.h @@ -234,7 +234,6 @@ enum objc_tree_index OCTI_MCLS_DECL, OCTI_SEL_TABLE_DECL, OCTI_MODULES_DECL, - OCTI_STRG_DECL, OCTI_INTF_CTX, OCTI_IMPL_CTX, @@ -360,7 +359,6 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define UOBJC_METACLASS_decl objc_global_trees[OCTI_MCLS_DECL] #define UOBJC_SELECTOR_TABLE_decl objc_global_trees[OCTI_SEL_TABLE_DECL] #define UOBJC_MODULES_decl objc_global_trees[OCTI_MODULES_DECL] -#define UOBJC_STRINGS_decl objc_global_trees[OCTI_STRG_DECL] /* The following are used when compiling a class implementation. implementation_template will normally be an interface, however if diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c index 72c772c..877867a 100644 --- a/gcc/objc/objc-lang.c +++ b/gcc/objc/objc-lang.c @@ -55,6 +55,8 @@ enum c_language_kind c_language = clk_objc; #define LANG_HOOKS_SAFE_FROM_P c_safe_from_p #undef LANG_HOOKS_PARSE_FILE #define LANG_HOOKS_PARSE_FILE c_common_parse_file +#undef LANG_HOOKS_CLEAR_BINDING_STACK +#define LANG_HOOKS_CLEAR_BINDING_STACK lhd_do_nothing #undef LANG_HOOKS_EXPAND_EXPR #define LANG_HOOKS_EXPAND_EXPR c_expand_expr #undef LANG_HOOKS_MARK_ADDRESSABLE @@ -130,6 +132,19 @@ enum c_language_kind c_language = clk_objc; #undef LANG_HOOKS_TYPE_PROMOTES_TO #define LANG_HOOKS_TYPE_PROMOTES_TO c_type_promotes_to +/* The C front end's scoping structure is very different from + that expected by the language-independent code; it is best + to disable all of pushlevel, poplevel, set_block, and getdecls. + This means it must also provide its own write_globals. */ + +#undef LANG_HOOKS_PUSHLEVEL +#define LANG_HOOKS_PUSHLEVEL lhd_do_nothing_i +#undef LANG_HOOKS_POPLEVEL +#define LANG_HOOKS_POPLEVEL lhd_do_nothing_iii_return_null_tree +#undef LANG_HOOKS_SET_BLOCK +#define LANG_HOOKS_SET_BLOCK lhd_do_nothing_t +#undef LANG_HOOKS_GETDECLS +#define LANG_HOOKS_GETDECLS lhd_return_null_tree_v #undef LANG_HOOKS_WRITE_GLOBALS #define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations |