aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNicola Pero <n.pero@mi.flashnet.it>2002-08-27 23:57:47 +0200
committerNicola Pero <nicola@gcc.gnu.org>2002-08-27 21:57:47 +0000
commitece4ce85d8c9b38cd2d5cec1c75727102208b20d (patch)
tree1efb184e0cd44cf2aac37370cf4d5a447a672355 /gcc
parentac2a2d6f2f7017e24ed27845af4d48bfc3ba1e4f (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/c-common.c10
-rw-r--r--gcc/c-common.h10
-rw-r--r--gcc/c-opts.c5
-rw-r--r--gcc/objc/objc-act.c30
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;