Commit 0f876f22 by Mark Wielaard Committed by Mark Wielaard

PR28901 -Wunused-variable ignores unused const initialised variables in C

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
parent cc099b03
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
......
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
......
......@@ -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
......
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
......
......@@ -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;
}
......
......@@ -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}).
......
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.
......
/* { 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. */
/* { 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";
/* { 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() { }
/* { 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";
/* { 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";
......@@ -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);
}
......
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