aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/c-lang.c2
-rw-r--r--gcc/c-objc-common.c14
-rw-r--r--gcc/c-tree.h1
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-lang.c103
-rw-r--r--gcc/langhooks-def.h5
-rw-r--r--gcc/langhooks.c19
-rw-r--r--gcc/langhooks.h4
-rw-r--r--gcc/objc/objc-lang.c3
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-2.C6
-rw-r--r--gcc/testsuite/gcc.dg/unused-4.c6
-rw-r--r--gcc/toplev.c25
13 files changed, 151 insertions, 56 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a5b6c3c..758e3a4 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 278a252..f11dce4 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 5207abd..36b5db4 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 503e045..eef5742 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 a7ffd32..50dfde8 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 b7d129a..3c086ca 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 5e90a95..d073ddf 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 4cdb8ab..128e6de 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 299efcd..83e2e5a 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 991ecd9..b119432 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 0000000..9cdd11e
--- /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 0000000..5323600
--- /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 9fa22fc..b62aae3 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);