PR28901 -Wunused-variable ignores unused const initialised variables in C
authorMark Wielaard <mjw@redhat.com>
Mon, 14 Sep 2015 09:49:47 +0000 (09:49 +0000)
committerMark Wielaard <mark@gcc.gnu.org>
Mon, 14 Sep 2015 09:49:47 +0000 (09:49 +0000)
12 years ago it was decided that -Wunused-variable shouldn't warn about
static const variables because some code used const static char rcsid[]
strings which were never used but wanted in the code anyway. But as the
bug points out this hides some real bugs. These days the usage of rcsids
is not very popular anymore. So this patch changes the default to warn
about unused static const variables in C with -Wunused-variable. And it
adds a new option -Wno-unused-const-variable to turn this warning off.
For C++ this new warning is off by default, since const variables can be
used as #defines in C++. New testcases for the new defaults in C and C++
are included testing the new warning and suppressing it with an unused
attribute or using -Wno-unused-const-variable.

gcc/ChangeLog

       PR c/28901
       * toplev.c (check_global_declaration): Check and use
       warn_unused_const_variable.
       * doc/invoke.texi (Warning Options): Add -Wunused-const-variable.
       (-Wunused-variable): Remove non-constant. For C implies
       -Wunused-const-variable.
       (-Wunused-const-variable): New.

gcc/c-family/ChangeLog

       PR c/28901
       * c.opt (Wunused-variable): Option from common.opt.
       (Wunused-const-variable): New option.

gcc/cp/ChangeLog

       PR c/28901
       * cp-objcp-common.c (cxx_warn_unused_global_decl): Remove hard-coded
       VAR_P TREE_READONLY override.

gcc/testsuite/ChangeLog

       PR c/28901
       * g++.dg/warn/unused-variable-1.C: New test.
       * g++.dg/warn/unused-variable-2.C: Likewise.
       * gcc.dg/unused-4.c: Adjust warning for static const.
       * gcc.dg/unused-variable-1.c: New test.
       * gcc.dg/unused-variable-2.c: Likewise.

From-SVN: r227742

13 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/cp/ChangeLog
gcc/cp/cp-objcp-common.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/unused-variable-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/unused-variable-2.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/unused-4.c
gcc/testsuite/gcc.dg/unused-variable-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/unused-variable-2.c [new file with mode: 0644]
gcc/toplev.c

index 9059ffa23e88806f9c063fb8e332cab580050831..0aa46d0515068fdd4b5626e8bc3ec626ce0787ab 100644 (file)
@@ -1,3 +1,13 @@
+2015-09-11  Mark Wielaard  <mjw@redhat.com>
+
+       PR c/28901
+       * toplev.c (check_global_declaration): Check and use
+       warn_unused_const_variable.
+       * doc/invoke.texi (Warning Options): Add -Wunused-const-variable.
+       (-Wunused-variable): Remove non-constant. For C implies
+       -Wunused-const-variable.
+       (-Wunused-const-variable): New.
+
 2015-09-14  Richard Biener  <rguenther@suse.de>
 
        * doc/match-and-simplify.texi: Update for changed syntax
index 3acc84f433b3b03201464e93260958e741d6af25..0163b1593dd629a347938cd2e78e7934e0b444e4 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-11  Mark Wielaard  <mjw@redhat.com>
+
+       PR c/28901
+       * c.opt (Wunused-variable): Option from common.opt.
+       (Wunused-const-variable): New option.
+
 2015-09-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/53184
index d519d7a000bf0c9aa15e436ff4c177fe74a2412c..47ba0704da8d5256d741d5677d1d845308b4a708 100644 (file)
@@ -912,6 +912,14 @@ Wunused-result
 C ObjC C++ ObjC++ Var(warn_unused_result) Init(1) Warning
 Warn if a caller of a function, marked with attribute warn_unused_result, does not use its return value
 
+Wunused-variable
+C ObjC C++ ObjC++ LangEnabledBy(C ObjC C++ ObjC++,Wunused)
+; documented in common.opt
+
+Wunused-const-variable
+C ObjC C++ ObjC++ Var(warn_unused_const_variable) Warning LangEnabledBy(C ObjC,Wunused-variable)
+Warn when a const variable is unused
+
 Wvariadic-macros
 C ObjC C++ ObjC++ CPP(warn_variadic_macros) CppReason(CPP_W_VARIADIC_MACROS) Var(cpp_warn_variadic_macros) Init(0) Warning LangEnabledBy(C ObjC C++ ObjC++,Wpedantic || Wtraditional)
 Warn about using variadic macros
index a9952fcae755d2bc4da1f01e4029dfb78f790aeb..4101a2e123efc4aead8c3c9ff80231f6f9fcec07 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-11  Mark Wielaard  <mjw@redhat.com>
+
+       PR c/28901
+       * cp-objcp-common.c (cxx_warn_unused_global_decl): Remove hard-coded
+       VAR_P TREE_READONLY override.
+
 2015-09-10  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/67318
index 2cab89c1552df783d0291eaac30262a879c3c5b4..808defdb986fa99a01b9baa305044105c5d7ceac 100644 (file)
@@ -62,10 +62,6 @@ cxx_warn_unused_global_decl (const_tree decl)
   if (DECL_IN_SYSTEM_HEADER (decl))
     return false;
 
-  /* Const variables take the place of #defines in C++.  */
-  if (VAR_P (decl) && TREE_READONLY (decl))
-    return false;
-
   return true;
 }
 
index 518d68933c9f343667e14733c327c3705e9708f1..7b5e44e088109d34689e2a24eaa48e490d5a2456 100644 (file)
@@ -290,6 +290,7 @@ Objective-C and Objective-C++ Dialects}.
 -Wunsuffixed-float-constants  -Wunused  -Wunused-function @gol
 -Wunused-label  -Wunused-local-typedefs -Wunused-parameter @gol
 -Wno-unused-result -Wunused-value @gol -Wunused-variable @gol
+-Wunused-const-variable @gol
 -Wunused-but-set-parameter -Wunused-but-set-variable @gol
 -Wuseless-cast -Wvariadic-macros -Wvector-operation-performance @gol
 -Wvla -Wvolatile-register-var  -Wwrite-strings @gol
@@ -4143,9 +4144,20 @@ its return value. The default is @option{-Wunused-result}.
 @item -Wunused-variable
 @opindex Wunused-variable
 @opindex Wno-unused-variable
-Warn whenever a local variable or non-constant static variable is unused
-aside from its declaration.
-This warning is enabled by @option{-Wall}.
+Warn whenever a local or static variable is unused aside from its
+declaration. This option implies @option{-Wunused-const-variable} for C,
+but not for C++. This warning is enabled by @option{-Wall}.
+
+To suppress this warning use the @code{unused} attribute
+(@pxref{Variable Attributes}).
+
+@item -Wunused-const-variable
+@opindex Wunused-const-variable
+@opindex Wno-unused-const-variable
+Warn whenever a constant static variable is unused aside from its declaration.
+This warning is enabled by @option{-Wunused-variable} for C, but not for C++.
+In C++ this is normally not an error since const variables take the place of
+@code{#define}s in C++.
 
 To suppress this warning use the @code{unused} attribute
 (@pxref{Variable Attributes}).
index 65dde8ccc7bea5b16aabc4a552e0fa5a58481056..a285ee22b903d4ec1444f41099718af507ed13d9 100644 (file)
@@ -1,3 +1,12 @@
+2015-09-11  Mark Wielaard  <mjw@redhat.com>
+
+       PR c/28901
+       * g++.dg/warn/unused-variable-1.C: New test.
+       * g++.dg/warn/unused-variable-2.C: Likewise.
+       * gcc.dg/unused-4.c: Adjust warning for static const.
+       * gcc.dg/unused-variable-1.c: New test.
+       * gcc.dg/unused-variable-2.c: Likewise.
+
 2015-09-13  David Edelsohn  <dje.gcc@gmail.com>
 
        * gfortran.dg/private_type_3.f90: Require visibility.
diff --git a/gcc/testsuite/g++.dg/warn/unused-variable-1.C b/gcc/testsuite/g++.dg/warn/unused-variable-1.C
new file mode 100644 (file)
index 0000000..cf531c0
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Wunused-variable" } */
+
+static int a = 0;        /* { dg-warning "defined but not used" } */
+static const int b = 0;          /* Unlike C, this doesn't cause a warning in C++. */
+static int c __attribute__ ((unused)) = 0;
+static const char rcsid[] = "version-string"; /* Likewise. */
diff --git a/gcc/testsuite/g++.dg/warn/unused-variable-2.C b/gcc/testsuite/g++.dg/warn/unused-variable-2.C
new file mode 100644 (file)
index 0000000..b608fbc
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Wunused-variable -Wunused-const-variable" } */
+
+static int a = 0;      /* { dg-warning "defined but not used" } */
+static const int b = 0;        /* { dg-warning "defined but not used" } */
+static int c __attribute__ ((unused)) = 0;
+static const char rcsid[] __attribute__ ((unused)) = "version-string";
index 99e845f45a3c1bb1d2ff434edfe9b97f447e331c..53236008007ad9338d1dbc5b34a329966a440844 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-Wunused -O3" } */
 
-static const int i = 0;
+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/testsuite/gcc.dg/unused-variable-1.c b/gcc/testsuite/gcc.dg/unused-variable-1.c
new file mode 100644 (file)
index 0000000..cb86c3b
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Wunused-variable" } */
+
+static int a = 0;        /* { dg-warning "defined but not used" } */
+static const int b = 0;          /* { dg-warning "defined but not used" } */
+static int c __attribute__ ((unused)) = 0;
+static const char rcsid[] __attribute__ ((unused)) = "version-string";
diff --git a/gcc/testsuite/gcc.dg/unused-variable-2.c b/gcc/testsuite/gcc.dg/unused-variable-2.c
new file mode 100644 (file)
index 0000000..0496466
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Wunused-variable -Wno-unused-const-variable" } */
+
+static int a = 0;        /* { dg-warning "defined but not used" } */
+static const int b = 0;
+static int c __attribute__ ((unused)) = 0;
+static const char rcsid[] = "version-string";
index 926224a4c204aae982bdc615f6a74e524ed2d2b7..95e4c522e4a5558f20ffe23cd722bbf99b9639cb 100644 (file)
@@ -497,10 +497,9 @@ check_global_declaration (tree decl)
 
   /* Warn about static fns or vars defined but not used.  */
   if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
-       /* We don't warn about "static const" variables because the
-         "rcs_id" idiom uses that construction.  */
-       || (warn_unused_variable
-          && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
+       || (((warn_unused_variable && ! TREE_READONLY (decl))
+           || (warn_unused_const_variable && TREE_READONLY (decl)))
+          && TREE_CODE (decl) == VAR_DECL))
       && ! DECL_IN_SYSTEM_HEADER (decl)
       && ! snode->referred_to_p (/*include_self=*/false)
       /* This TREE_USED check is needed in addition to referred_to_p
@@ -527,7 +526,9 @@ check_global_declaration (tree decl)
     warning_at (DECL_SOURCE_LOCATION (decl),
                (TREE_CODE (decl) == FUNCTION_DECL)
                ? OPT_Wunused_function
-               : OPT_Wunused_variable,
+               : (TREE_READONLY (decl)
+                  ? OPT_Wunused_const_variable
+                  : OPT_Wunused_variable),
                "%qD defined but not used", decl);
 }