OSDN Git Service

Added -Wundeclared-selector ObjC command line option
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 27 Aug 2002 21:57:47 +0000 (21:57 +0000)
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 27 Aug 2002 21:57:47 +0000 (21:57 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@56615 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/c-opts.c
gcc/objc/objc-act.c

index ec6d938..e1d35dd 100644 (file)
@@ -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>
index 9e9e409..875cabc 100644 (file)
@@ -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.  */
index 961d67e..e3e4bb0 100644 (file)
@@ -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.  */
index 1cc2048..bc3ae46 100644 (file)
@@ -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;
index 0819369..7a1f82b 100644 (file)
@@ -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;