diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-04-03 22:39:51 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-04-03 22:39:51 +0000 |
commit | 8d58a5a7900f5543f186d868d265d75be0f09cdc (patch) | |
tree | fd1d1d700f54be42454fcc88e95011014edff3f4 | |
parent | d1f6c8f2a0903dd9e0f7e63a40afb5073829dca3 (diff) | |
download | gcc-8d58a5a7900f5543f186d868d265d75be0f09cdc.tar.gz |
PR opt/4330
* langhooks.h (lang_hooks.decls.warn_unused_global): New.
* toplev.c (check_global_declarations): Use it.
* langhooks-def.h (lhd_warn_unused_global_decl): Declare.
(LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
(LANG_HOOKS_DECLS): Add it.
* langhooks.c (lhd_warn_unused_global_decl): New.
* c-decl.c (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
* c-objc-common.c (c_warn_unused_global_decl): New.
* c-tree.h (c_warn_unused_global_decl): Declare.
* objc/objc-lang.c (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
* cp-lang.c (cxx_warn_unused_global_decl): New.
(LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
* g++.dg/warn/Wunused-2.C: New.
* gcc.dg/unused-4.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51818 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/c-lang.c | 2 | ||||
-rw-r--r-- | gcc/c-objc-common.c | 14 | ||||
-rw-r--r-- | gcc/c-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-lang.c | 103 | ||||
-rw-r--r-- | gcc/langhooks-def.h | 5 | ||||
-rw-r--r-- | gcc/langhooks.c | 19 | ||||
-rw-r--r-- | gcc/langhooks.h | 4 | ||||
-rw-r--r-- | gcc/objc/objc-lang.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-2.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/unused-4.c | 6 | ||||
-rw-r--r-- | gcc/toplev.c | 25 |
13 files changed, 151 insertions, 56 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a5b6c3c73ee..758e3a44c9c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2002-04-03 Richard Henderson <rth@redhat.com> + + PR opt/4330 + * langhooks.h (lang_hooks.decls.warn_unused_global): New. + * toplev.c (check_global_declarations): Use it. + * langhooks-def.h (lhd_warn_unused_global_decl): Declare. + (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New. + (LANG_HOOKS_DECLS): Add it. + * langhooks.c (lhd_warn_unused_global_decl): New. + * c-decl.c (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New. + * c-objc-common.c (c_warn_unused_global_decl): New. + * c-tree.h (c_warn_unused_global_decl): Declare. + * objc/objc-lang.c (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New. + 2002-04-03 Neil Booth <neil@daikokuya.demon.co.uk> * langhooks-def.h (lhd_set_decl_assembler_name, diff --git a/gcc/c-lang.c b/gcc/c-lang.c index 278a252bffd..f11dce4a892 100644 --- a/gcc/c-lang.c +++ b/gcc/c-lang.c @@ -66,6 +66,8 @@ static void c_post_options PARAMS ((void)); #define LANG_HOOKS_UNSAFE_FOR_REEVAL c_common_unsafe_for_reeval #undef LANG_HOOKS_STATICP #define LANG_HOOKS_STATICP c_staticp +#undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL +#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL c_warn_unused_global_decl #undef LANG_HOOKS_PRINT_IDENTIFIER #define LANG_HOOKS_PRINT_IDENTIFIER c_print_identifier #undef LANG_HOOKS_SET_YYDEBUG diff --git a/gcc/c-objc-common.c b/gcc/c-objc-common.c index 5207abda080..36b5db4340b 100644 --- a/gcc/c-objc-common.c +++ b/gcc/c-objc-common.c @@ -209,6 +209,20 @@ c_cannot_inline_tree_fn (fnp) return 0; } +/* Called from check_global_declarations. */ + +bool +c_warn_unused_global_decl (decl) + tree decl; +{ + if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) + return false; + if (DECL_IN_SYSTEM_HEADER (decl)) + return false; + + return true; +} + /* Initialization common to C and Objective-C front ends. */ const char * c_objc_common_init (filename) diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 503e0451912..eef57425d9d 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -237,6 +237,7 @@ extern const char *c_objc_common_init PARAMS ((const char *)); extern int c_missing_noreturn_ok_p PARAMS ((tree)); extern void c_objc_common_finish_file PARAMS ((void)); extern int defer_fn PARAMS ((tree)); +extern bool c_warn_unused_global_decl PARAMS ((tree)); #define c_build_type_variant(TYPE, CONST_P, VOLATILE_P) \ c_build_qualified_type ((TYPE), \ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a7ffd32d621..50dfde814f1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2002-04-03 Richard Henderson <rth@redhat.com> + + * cp-lang.c (cxx_warn_unused_global_decl): New. + (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New. + 2002-04-03 Neil Booth <neil@daikokuya.demon.co.uk> * cp-lang.c (LANG_HOOKS_SET_DECL_ASSEMBLER_NAME): Redefine. diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index b7d129a7c21..3c086ca81a8 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -30,6 +30,7 @@ Boston, MA 02111-1307, USA. */ static HOST_WIDE_INT cxx_get_alias_set PARAMS ((tree)); static bool ok_to_generate_alias_set_for_type PARAMS ((tree)); +static bool cxx_warn_unused_global_decl PARAMS ((tree)); #undef LANG_HOOKS_NAME #define LANG_HOOKS_NAME "GNU C++" @@ -87,6 +88,8 @@ static bool ok_to_generate_alias_set_for_type PARAMS ((tree)); #define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function #undef LANG_HOOKS_SET_YYDEBUG #define LANG_HOOKS_SET_YYDEBUG cxx_set_yydebug +#undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL +#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl #undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \ @@ -133,6 +136,47 @@ static bool ok_to_generate_alias_set_for_type PARAMS ((tree)); /* Each front end provides its own hooks, for toplev.c. */ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; +/* Tree code classes. */ + +#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, + +const char tree_code_type[] = { +#include "tree.def" + 'x', +#include "c-common.def" + 'x', +#include "cp-tree.def" +}; +#undef DEFTREECODE + +/* Table indexed by tree code giving number of expression + operands beyond the fixed part of the node structure. + Not used for types or decls. */ + +#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, + +const unsigned char tree_code_length[] = { +#include "tree.def" + 0, +#include "c-common.def" + 0, +#include "cp-tree.def" +}; +#undef DEFTREECODE + +/* Names of tree components. + Used for printing out the tree and error messages. */ +#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, + +const char *const tree_code_name[] = { +#include "tree.def" + "@@dummy", +#include "c-common.def" + "@@dummy", +#include "cp-tree.def" +}; +#undef DEFTREECODE + /* Check if a C++ type is safe for aliasing. Return TRUE if T safe for aliasing FALSE otherwise. */ @@ -185,47 +229,6 @@ ok_to_generate_alias_set_for_type (t) return true; } -/* Tree code classes. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, - -const char tree_code_type[] = { -#include "tree.def" - 'x', -#include "c-common.def" - 'x', -#include "cp-tree.def" -}; -#undef DEFTREECODE - -/* Table indexed by tree code giving number of expression - operands beyond the fixed part of the node structure. - Not used for types or decls. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, - -const unsigned char tree_code_length[] = { -#include "tree.def" - 0, -#include "c-common.def" - 0, -#include "cp-tree.def" -}; -#undef DEFTREECODE - -/* Names of tree components. - Used for printing out the tree and error messages. */ -#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, - -const char *const tree_code_name[] = { -#include "tree.def" - "@@dummy", -#include "c-common.def" - "@@dummy", -#include "cp-tree.def" -}; -#undef DEFTREECODE - /* Special routine to get the alias set for C++. */ static HOST_WIDE_INT @@ -238,3 +241,21 @@ cxx_get_alias_set (t) return c_common_get_alias_set (t); } + +/* Called from check_global_declarations. */ + +static bool +cxx_warn_unused_global_decl (decl) + tree decl; +{ + if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) + return false; + if (DECL_IN_SYSTEM_HEADER (decl)) + return false; + + /* Const variables take the place of #defines in C++. */ + if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)) + return false; + + return true; +} diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index 5e90a9544ee..d073ddf56ca 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -56,6 +56,7 @@ extern rtx lhd_expand_expr PARAMS ((tree, rtx, enum machine_mode, int)); extern void lhd_print_error_function PARAMS ((struct diagnostic_context *, const char *)); extern void lhd_set_decl_assembler_name PARAMS ((tree)); +extern bool lhd_warn_unused_global_decl PARAMS ((tree)); /* Declarations of default tree inlining hooks. */ tree lhd_tree_inlining_walk_subtrees PARAMS ((tree *, int *, @@ -176,6 +177,7 @@ int lhd_tree_dump_type_quals PARAMS ((tree)); #define LANG_HOOKS_SET_BLOCK set_block #define LANG_HOOKS_PUSHDECL pushdecl #define LANG_HOOKS_GETDECLS getdecls +#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL lhd_warn_unused_global_decl #define LANG_HOOKS_DECLS { \ LANG_HOOKS_PUSHLEVEL, \ @@ -184,7 +186,8 @@ int lhd_tree_dump_type_quals PARAMS ((tree)); LANG_HOOKS_INSERT_BLOCK, \ LANG_HOOKS_SET_BLOCK, \ LANG_HOOKS_PUSHDECL, \ - LANG_HOOKS_GETDECLS \ + LANG_HOOKS_GETDECLS, \ + LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL \ } /* The whole thing. The structure is defined in langhooks.h. */ diff --git a/gcc/langhooks.c b/gcc/langhooks.c index 4cdb8abee78..128e6de9188 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -113,6 +113,25 @@ lhd_staticp (exp) return 0; } +/* Called from check_global_declarations. */ + +bool +lhd_warn_unused_global_decl (decl) + tree decl; +{ + /* This is what used to exist in check_global_declarations. Probably + not many of these actually apply to non-C languages. */ + + if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl)) + return false; + if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)) + return false; + if (DECL_IN_SYSTEM_HEADER (decl)) + return false; + + return true; +} + /* Called when -dy is given on the command line. */ void diff --git a/gcc/langhooks.h b/gcc/langhooks.h index 299efcd8a92..83e2e5abdb9 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -133,6 +133,10 @@ struct lang_hooks_for_decls /* Returns the chain of decls so far in the current scope level. */ tree (*getdecls) PARAMS ((void)); + + /* Returns true when we should warn for an unused global DECL. + We will already have checked that it has static binding. */ + bool (*warn_unused_global) PARAMS ((tree)); }; /* Language-specific hooks. See langhooks-def.h for defaults. */ diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c index 991ecd90060..b1194324f79 100644 --- a/gcc/objc/objc-lang.c +++ b/gcc/objc/objc-lang.c @@ -68,6 +68,9 @@ static void objc_post_options PARAMS ((void)); #define LANG_HOOKS_DECL_PRINTABLE_NAME objc_printable_name #undef LANG_HOOKS_SET_YYDEBUG #define LANG_HOOKS_SET_YYDEBUG c_set_yydebug +#undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL +#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL c_warn_unused_global_decl + /* Inlining hooks same as the C front end. */ #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ diff --git a/gcc/testsuite/g++.dg/warn/Wunused-2.C b/gcc/testsuite/g++.dg/warn/Wunused-2.C new file mode 100644 index 00000000000..9cdd11e84a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-2.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "-Wunused -O3" } + +static const int i = 0; +static void f() { } /* { dg-warning "defined but not used" } */ +static inline void g() { } diff --git a/gcc/testsuite/gcc.dg/unused-4.c b/gcc/testsuite/gcc.dg/unused-4.c new file mode 100644 index 00000000000..53236008007 --- /dev/null +++ b/gcc/testsuite/gcc.dg/unused-4.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-Wunused -O3" } */ + +static const int i = 0; /* { dg-warning "defined but not used" } */ +static void f() { } /* { dg-warning "defined but not used" } */ +static inline void g() { } diff --git a/gcc/toplev.c b/gcc/toplev.c index 9fa22fc9cdf..b62aae35e1f 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1945,22 +1945,19 @@ check_global_declarations (vec, len) assemble_external (decl); } - /* Warn about static fns or vars defined but not used, - but not about inline functions or static consts - since defining those in header files is normal practice. */ - if (((warn_unused_function - && TREE_CODE (decl) == FUNCTION_DECL && ! DECL_INLINE (decl)) - || (warn_unused_variable - && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl))) - && ! DECL_IN_SYSTEM_HEADER (decl) + /* Warn about static fns or vars defined but not used. */ + if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL) + || (warn_unused_variable && TREE_CODE (decl) == VAR_DECL)) + && ! TREE_USED (decl) + /* The TREE_USED bit for file-scope decls is kept in the identifier, + to handle multiple external decls in different scopes. */ + && ! TREE_USED (DECL_NAME (decl)) && ! DECL_EXTERNAL (decl) && ! TREE_PUBLIC (decl) - && ! TREE_USED (decl) - && (TREE_CODE (decl) == FUNCTION_DECL || ! DECL_REGISTER (decl)) - /* The TREE_USED bit for file-scope decls - is kept in the identifier, to handle multiple - external decls in different scopes. */ - && ! TREE_USED (DECL_NAME (decl))) + /* Global register variables must be declared to reserve them. */ + && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl)) + /* Otherwise, ask the language. */ + && (*lang_hooks.decls.warn_unused_global) (decl)) warning_with_decl (decl, "`%s' defined but not used"); timevar_push (TV_SYMOUT); |