Commit ece4ce85 by Nicola Pero Committed by Nicola Pero

Added -Wundeclared-selector ObjC command line option

From-SVN: r56615
parent ac2a2d6f
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> 2002-08-27 Nick Clifton <nickc@redhat.com>
Catherine Moore <clm@redhat.com> Catherine Moore <clm@redhat.com>
Jim Wilson <wilson@cygnus.com> Jim Wilson <wilson@cygnus.com>
......
...@@ -438,10 +438,18 @@ int print_struct_values; ...@@ -438,10 +438,18 @@ int print_struct_values;
const char *constant_string_class_name; const char *constant_string_class_name;
/* Warn if multiple methods are seen for the same selector, but with /* 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; 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 /* Warn if methods required by a protocol are not implemented in the
class adopting it. When turned off, methods inherited to that class adopting it. When turned off, methods inherited to that
class are also considered implemented. */ class are also considered implemented. */
......
...@@ -609,10 +609,18 @@ extern int print_struct_values; ...@@ -609,10 +609,18 @@ extern int print_struct_values;
extern const char *constant_string_class_name; extern const char *constant_string_class_name;
/* Warn if multiple methods are seen for the same selector, but with /* 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; 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 /* Warn if methods required by a protocol are not implemented in the
class adopting it. When turned off, methods inherited to that class adopting it. When turned off, methods inherited to that
class are also considered implemented. */ class are also considered implemented. */
......
...@@ -180,6 +180,7 @@ static void sanitize_cpp_opts PARAMS ((void)); ...@@ -180,6 +180,7 @@ static void sanitize_cpp_opts PARAMS ((void));
OPT("Wsystem-headers", CL_ALL, OPT_Wsystem_headers) \ OPT("Wsystem-headers", CL_ALL, OPT_Wsystem_headers) \
OPT("Wtraditional", CL_C, OPT_Wtraditional) \ OPT("Wtraditional", CL_C, OPT_Wtraditional) \
OPT("Wtrigraphs", CL_ALL, OPT_Wtrigraphs) \ OPT("Wtrigraphs", CL_ALL, OPT_Wtrigraphs) \
OPT("Wundeclared-selector", CL_OBJC, OPT_Wundeclared_selector) \
OPT("Wundef", CL_ALL, OPT_Wundef) \ OPT("Wundef", CL_ALL, OPT_Wundef) \
OPT("Wunknown-pragmas", CL_ALL, OPT_Wunknown_pragmas) \ OPT("Wunknown-pragmas", CL_ALL, OPT_Wunknown_pragmas) \
OPT("Wunused-macros", CL_ALL, OPT_Wunused_macros) \ OPT("Wunused-macros", CL_ALL, OPT_Wunused_macros) \
...@@ -947,6 +948,10 @@ c_common_decode_option (argc, argv) ...@@ -947,6 +948,10 @@ c_common_decode_option (argc, argv)
cpp_opts->warn_trigraphs = on; cpp_opts->warn_trigraphs = on;
break; break;
case OPT_Wundeclared_selector:
warn_undeclared_selector = on;
break;
case OPT_Wundef: case OPT_Wundef:
cpp_opts->warn_undef = on; cpp_opts->warn_undef = on;
break; break;
......
...@@ -5105,6 +5105,9 @@ build_protocol_expr (protoname) ...@@ -5105,6 +5105,9 @@ build_protocol_expr (protoname)
return expr; 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 tree
build_selector_expr (selnamelist) build_selector_expr (selnamelist)
tree selnamelist; tree selnamelist;
...@@ -5120,6 +5123,32 @@ build_selector_expr (selnamelist) ...@@ -5120,6 +5123,32 @@ build_selector_expr (selnamelist)
else else
abort (); 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) if (flag_typed_selectors)
return build_typed_selector_reference (selname, 0); return build_typed_selector_reference (selname, 0);
else else
...@@ -5259,6 +5288,7 @@ lookup_method (mchain, method) ...@@ -5259,6 +5288,7 @@ lookup_method (mchain, method)
{ {
if (METHOD_SEL_NAME (mchain) == key) if (METHOD_SEL_NAME (mchain) == key)
return mchain; return mchain;
mchain = TREE_CHAIN (mchain); mchain = TREE_CHAIN (mchain);
} }
return NULL_TREE; return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment