From ece4ce85d8c9b38cd2d5cec1c75727102208b20d Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Tue, 27 Aug 2002 23:57:47 +0200 Subject: [PATCH] Added -Wundeclared-selector ObjC command line option From-SVN: r56615 --- gcc/ChangeLog | 11 +++++++++++ gcc/c-common.c | 10 +++++++++- gcc/c-common.h | 10 +++++++++- gcc/c-opts.c | 5 +++++ gcc/objc/objc-act.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec6d938aad80..e1d35dd39dc9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Tue Aug 27 23:03:52 2002 Nicola Pero + + * 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 Catherine Moore Jim Wilson diff --git a/gcc/c-common.c b/gcc/c-common.c index 9e9e409c69a0..875cabcdc558 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 961d67ef07b7..e3e4bb06cbb8 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 1cc2048b633c..bc3ae46a6d7d 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 081936913699..7a1f82b39d06 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; -- 2.47.2