diff options
author | Nicola Pero <n.pero@mi.flashnet.it> | 2002-08-27 23:57:47 +0200 |
---|---|---|
committer | Nicola Pero <nicola@gcc.gnu.org> | 2002-08-27 21:57:47 +0000 |
commit | ece4ce85d8c9b38cd2d5cec1c75727102208b20d (patch) | |
tree | 1efb184e0cd44cf2aac37370cf4d5a447a672355 /gcc | |
parent | ac2a2d6f2f7017e24ed27845af4d48bfc3ba1e4f (diff) | |
download | gcc-ece4ce85d8c9b38cd2d5cec1c75727102208b20d.zip gcc-ece4ce85d8c9b38cd2d5cec1c75727102208b20d.tar.gz gcc-ece4ce85d8c9b38cd2d5cec1c75727102208b20d.tar.bz2 |
Added -Wundeclared-selector ObjC command line option
From-SVN: r56615
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/c-common.c | 10 | ||||
-rw-r--r-- | gcc/c-common.h | 10 | ||||
-rw-r--r-- | gcc/c-opts.c | 5 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 30 |
5 files changed, 64 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec6d938..e1d35dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Tue Aug 27 23:03:52 2002 Nicola Pero <n.pero@mi.flashnet.it> + + * c-common.c (warn_undeclared_selector): New variable. + * c-common.h (warn_undeclared_selector): Idem. + * c-opts.c (c_common_decode_option): Set warn_undeclared_selector + to on when -Wundeclared-selector is found. + (COMMAND_LINE_OPTIONS): Added -Wundeclared-selector. + * objc/objc-act.c (build_selector_expr): If + warn_undeclared_selector is set, check that the selector has + already been defined, and emit a warning if not. + 2002-08-27 Nick Clifton <nickc@redhat.com> Catherine Moore <clm@redhat.com> Jim Wilson <wilson@cygnus.com> diff --git a/gcc/c-common.c b/gcc/c-common.c index 9e9e409..875cabc 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -438,10 +438,18 @@ int print_struct_values; const char *constant_string_class_name; /* Warn if multiple methods are seen for the same selector, but with - different argument types. */ + different argument types. Performs the check on the whole selector + table at the end of compilation. */ int warn_selector; +/* Warn if a @selector() is found, and no method with that selector + has been previously declared. The check is done on each + @selector() as soon as it is found - so it warns about forward + declarations. */ + +int warn_undeclared_selector; + /* Warn if methods required by a protocol are not implemented in the class adopting it. When turned off, methods inherited to that class are also considered implemented. */ diff --git a/gcc/c-common.h b/gcc/c-common.h index 961d67e..e3e4bb0 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -609,10 +609,18 @@ extern int print_struct_values; extern const char *constant_string_class_name; /* Warn if multiple methods are seen for the same selector, but with - different argument types. */ + different argument types. Performs the check on the whole selector + table at the end of compilation. */ extern int warn_selector; +/* Warn if a @selector() is found, and no method with that selector + has been previously declared. The check is done on each + @selector() as soon as it is found - so it warns about forward + declarations. */ + +extern int warn_undeclared_selector; + /* Warn if methods required by a protocol are not implemented in the class adopting it. When turned off, methods inherited to that class are also considered implemented. */ diff --git a/gcc/c-opts.c b/gcc/c-opts.c index 1cc2048..bc3ae46 100644 --- a/gcc/c-opts.c +++ b/gcc/c-opts.c @@ -180,6 +180,7 @@ static void sanitize_cpp_opts PARAMS ((void)); OPT("Wsystem-headers", CL_ALL, OPT_Wsystem_headers) \ OPT("Wtraditional", CL_C, OPT_Wtraditional) \ OPT("Wtrigraphs", CL_ALL, OPT_Wtrigraphs) \ + OPT("Wundeclared-selector", CL_OBJC, OPT_Wundeclared_selector) \ OPT("Wundef", CL_ALL, OPT_Wundef) \ OPT("Wunknown-pragmas", CL_ALL, OPT_Wunknown_pragmas) \ OPT("Wunused-macros", CL_ALL, OPT_Wunused_macros) \ @@ -947,6 +948,10 @@ c_common_decode_option (argc, argv) cpp_opts->warn_trigraphs = on; break; + case OPT_Wundeclared_selector: + warn_undeclared_selector = on; + break; + case OPT_Wundef: cpp_opts->warn_undef = on; break; diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 0819369..7a1f82b 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -5105,6 +5105,9 @@ build_protocol_expr (protoname) return expr; } +/* This function is called by the parser when a @selector() expression + is found, in order to compile it. It is only called by the parser + and only to compile a @selector(). */ tree build_selector_expr (selnamelist) tree selnamelist; @@ -5120,6 +5123,32 @@ build_selector_expr (selnamelist) else abort (); + /* If we are required to check @selector() expressions as they + are found, check that the selector has been declared. */ + if (warn_undeclared_selector) + { + /* Look the selector up in the list of all known class and + instance methods (up to this line) to check that the selector + exists. */ + hash hsh; + + /* First try with instance methods. */ + hsh = hash_lookup (nst_method_hash_list, selname); + + /* If not found, try with class methods. */ + if (!hsh) + { + hsh = hash_lookup (cls_method_hash_list, selname); + } + + /* If still not found, print out a warning. */ + if (!hsh) + { + warning ("undeclared selector `%s'", IDENTIFIER_POINTER (selname)); + } + } + + if (flag_typed_selectors) return build_typed_selector_reference (selname, 0); else @@ -5259,6 +5288,7 @@ lookup_method (mchain, method) { if (METHOD_SEL_NAME (mchain) == key) return mchain; + mchain = TREE_CHAIN (mchain); } return NULL_TREE; |