diff options
author | Stan Shebs <shebs@apple.com> | 2001-03-28 02:49:19 +0000 |
---|---|---|
committer | Stan Shebs <shebs@gcc.gnu.org> | 2001-03-28 02:49:19 +0000 |
commit | e804281eadc6e2adf7da500be1cee62b6f572438 (patch) | |
tree | 90f57e3b213570146b46f96de3241492f9d1f113 /gcc/objc | |
parent | 787d2fb712fa7871c40a87b44b86adae14ae3f7a (diff) | |
download | gcc-e804281eadc6e2adf7da500be1cee62b6f572438.zip gcc-e804281eadc6e2adf7da500be1cee62b6f572438.tar.gz gcc-e804281eadc6e2adf7da500be1cee62b6f572438.tar.bz2 |
objc-act.c (objc_init): Use dump_base_name.
* objc/objc-act.c (objc_init): Use dump_base_name.
(gen_declaration): Clear the buffer arg.
(gen_declaration_1): New function, body of gen_declaration.
(adorn_decl): Call gen_declaration_1 instead of gen_declaration.
(gen_method_decl): Ditto, plus always clear buffer arg.
(error_with_ivar): Simplify.
(warn_with_method): Ditto.
(build_message_expr): Don't clear buffers.
(dump_interface): Ditto.
(objc_debug): Ditto.
(build_keyword_selector): Clear the buffer by only zeroing
the first element.
(objc_implementation_context): Declare.
(start_class): Warn about missing @end.
(finish_objc): Ditto.
From-SVN: r40895
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/objc-act.c | 91 |
1 files changed, 60 insertions, 31 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index c4d03dc..51f940e 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -142,6 +142,9 @@ char *util_firstobj; #define OBJC_ENCODE_INLINE_DEFS 0 #define OBJC_ENCODE_DONT_INLINE_DEFS 1 +/* Needed to help fix missing @end situations. */ +extern tree objc_implementation_context; + /*** Private Interface (procedures) ***/ /* Used by compile_file. */ @@ -272,6 +275,7 @@ static void warn_with_method PARAMS ((const char *, int, tree)); static void error_with_ivar PARAMS ((const char *, tree, tree)); static char *gen_method_decl PARAMS ((tree, char *)); static char *gen_declaration PARAMS ((tree, char *)); +static void gen_declaration_1 PARAMS ((tree, char *)); static char *gen_declarator PARAMS ((tree, char *, const char *)); static int is_complex_decl PARAMS ((tree)); @@ -727,7 +731,7 @@ objc_init () /* If gen_declaration desired, open the output file. */ if (flag_gen_declaration) { - register char * const dumpname = concat (dumpname, ".decl", NULL); + register char * const dumpname = concat (dump_base_name, ".decl", NULL); gen_declaration_file = fopen (dumpname, "w"); if (gen_declaration_file == 0) fatal_io_error ("can't open %s", dumpname); @@ -1146,7 +1150,7 @@ get_object_reference (protocols) type = TREE_TYPE (type_decl); if (TYPE_MAIN_VARIANT (type) != id_type) warning ("Unexpected type for `id' (%s)", - gen_declaration (type, errbuf)); + gen_declaration (type, errbuf)); } else { @@ -3616,13 +3620,11 @@ error_with_ivar (message, decl, rawdecl) report_error_function (DECL_SOURCE_FILE (decl)); - strcpy (errbuf, message); - strcat (errbuf, " `"); - gen_declaration (rawdecl, errbuf + strlen (errbuf)); - strcat (errbuf, "'"); error_with_file_and_line (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl), - errbuf); + "%s `%s'", + message, gen_declaration (rawdecl, errbuf)); + } #define USERTYPE(t) \ @@ -4717,6 +4719,7 @@ build_keyword_selector (selector) tree key_chain, key_name; char *buf; + /* Scan the selector to see how much space we'll need. */ for (key_chain = selector; key_chain; key_chain = TREE_CHAIN (key_chain)) { if (TREE_CODE (selector) == KEYWORD_DECL) @@ -4733,8 +4736,9 @@ build_keyword_selector (selector) len++; } - buf = (char *)alloca (len + 1); - memset (buf, 0, len + 1); + buf = (char *) alloca (len + 1); + /* Start the buffer out as an empty string. */ + buf[0] = '\0'; for (key_chain = selector; key_chain; key_chain = TREE_CHAIN (key_chain)) { @@ -4970,7 +4974,6 @@ build_message_expr (mess) /* Allow any type that matches objc_class_type. */ && ! comptypes (rtype, objc_class_type)) { - memset (errbuf, 0, BUFSIZE); warning ("invalid receiver type `%s'", gen_declaration (rtype, errbuf)); } @@ -6135,6 +6138,14 @@ start_class (code, class_name, super_name, protocol_list) { tree class, decl; + if (objc_implementation_context) + { + warning ("`@end' missing in implementation context"); + finish_class (objc_implementation_context); + objc_ivar_chain = NULL_TREE; + objc_implementation_context = NULL_TREE; + } + class = make_node (code); TYPE_BINFO (class) = make_tree_vec (5); @@ -7047,13 +7058,11 @@ warn_with_method (message, mtype, method) report_error_function (DECL_SOURCE_FILE (method)); /* Add a readable method name to the warning. */ - sprintf (errbuf, "%s `%c", message, mtype); - gen_method_decl (method, errbuf + strlen (errbuf)); - strcat (errbuf, "'"); - warning_with_file_and_line (DECL_SOURCE_FILE (method), DECL_SOURCE_LINE (method), - errbuf); + "%s `%c%s'", + message, mtype, + gen_method_decl (method, errbuf)); } /* Return 1 if METHOD is consistent with PROTO. */ @@ -7477,7 +7486,7 @@ adorn_decl (decl, str) strcat (str, "("); while (chain) { - gen_declaration (chain, str); + gen_declaration_1 (chain, str); chain = TREE_CHAIN (chain); if (chain) strcat (str, ", "); @@ -7492,7 +7501,7 @@ adorn_decl (decl, str) strcat (str, "("); while (chain && TREE_VALUE (chain) != void_type_node) { - gen_declaration (TREE_VALUE (chain), str); + gen_declaration_1 (TREE_VALUE (chain), str); chain = TREE_CHAIN (chain); if (chain && TREE_VALUE (chain) != void_type_node) strcat (str, ", "); @@ -7885,11 +7894,27 @@ gen_declspecs (declspecs, buf, raw) } } +/* Given a tree node, produce a printable description of it in the given + buffer, overwriting the buffer. */ + static char * gen_declaration (atype_or_adecl, buf) tree atype_or_adecl; char *buf; { + buf[0] = '\0'; + gen_declaration_1 (atype_or_adecl, buf); + return buf; +} + +/* Given a tree node, append a printable description to the end of the + given buffer. */ + +static void +gen_declaration_1 (atype_or_adecl, buf) + tree atype_or_adecl; + char *buf; +{ char declbuf[256]; if (TREE_CODE (atype_or_adecl) == TREE_LIST) @@ -7969,12 +7994,13 @@ gen_declaration (atype_or_adecl, buf) strcat (buf, gen_declarator (declarator, declbuf, "")); } } - - return buf; } #define RAW_TYPESPEC(meth) (TREE_VALUE (TREE_PURPOSE (TREE_TYPE (meth)))) +/* Given a method tree, put a printable description into the given + buffer (overwriting) and return a pointer to the buffer. */ + static char * gen_method_decl (method, buf) tree method; @@ -7982,10 +8008,11 @@ gen_method_decl (method, buf) { tree chain; + buf[0] = '\0'; if (RAW_TYPESPEC (method) != objc_object_reference) { - strcpy (buf, "("); - gen_declaration (TREE_TYPE (method), buf); + strcat (buf, "("); + gen_declaration_1 (TREE_TYPE (method), buf); strcat (buf, ")"); } @@ -8002,7 +8029,7 @@ gen_method_decl (method, buf) if (RAW_TYPESPEC (chain) != objc_object_reference) { strcat (buf, "("); - gen_declaration (TREE_TYPE (chain), buf); + gen_declaration_1 (TREE_TYPE (chain), buf); strcat (buf, ")"); } @@ -8023,7 +8050,7 @@ gen_method_decl (method, buf) while (chain) { strcat (buf, ", "); - gen_declaration (chain, buf); + gen_declaration_1 (chain, buf); chain = TREE_CHAIN (chain); } } @@ -8064,7 +8091,6 @@ dump_interface (fp, chain) fprintf (fp, "{\n"); do { - memset (buf, 0, 256); fprintf (fp, "\t%s;\n", gen_declaration (ivar_decls, buf)); ivar_decls = TREE_CHAIN (ivar_decls); } @@ -8074,14 +8100,12 @@ dump_interface (fp, chain) while (nst_methods) { - memset (buf, 0, 256); fprintf (fp, "- %s;\n", gen_method_decl (nst_methods, buf)); nst_methods = TREE_CHAIN (nst_methods); } while (cls_methods) { - memset (buf, 0, 256); fprintf (fp, "+ %s;\n", gen_method_decl (cls_methods, buf)); cls_methods = TREE_CHAIN (cls_methods); } @@ -8196,6 +8220,15 @@ finish_objc () int save_warn_missing_braces = warn_missing_braces; warn_missing_braces = 0; + /* A missing @end may not be detected by the parser. */ + if (objc_implementation_context) + { + warning ("`@end' missing in implementation context"); + finish_class (implementation_context); + objc_ivar_chain = NULL_TREE; + objc_implementation_context = NULL_TREE; + } + generate_forward_declaration_to_string_table (); #ifdef OBJC_PROLOGUE @@ -8480,9 +8513,7 @@ objc_debug (fp) if (TREE_CODE (loop) == FUNCTION_DECL && DECL_INITIAL (loop)) { /* We have a function definition: generate prototype. */ - memset (errbuf, 0, BUFSIZE); - gen_declaration (loop, errbuf); - fprintf (fp, "%s;\n", errbuf); + fprintf (fp, "%s;\n", gen_declaration (loop, errbuf)); } loop = TREE_CHAIN (loop); } @@ -8500,7 +8531,6 @@ objc_debug (fp) fprintf (fp, "\n\nnst_method_hash_list[%d]:\n", i); do { - memset (buf, 0, 256); fprintf (fp, "-%s;\n", gen_method_decl (hashlist->key, buf)); hashlist = hashlist->next; } @@ -8515,7 +8545,6 @@ objc_debug (fp) fprintf (fp, "\n\ncls_method_hash_list[%d]:\n", i); do { - memset (buf, 0, 256); fprintf (fp, "-%s;\n", gen_method_decl (hashlist->key, buf)); hashlist = hashlist->next; } |