https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71456
Bug ID: 71456
Summary: missing -Wunused-variable on a static global
initialized with another
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
While looking into bug 71402 I noticed that -Wunused-variable doesn't diagnose
unused static namespace scope variables that are dynamically initialized, while
emitting the dynamic initialization for them (see the test case below).
I think this is a problem (defect) for a number of reasons:
1) It doesn't match what the documentation promises:
-Wunused-variable -- Warn whenever a local or static variable is unused aside
from its declaration.
2) The dynamic initialization (even when mostly optimized away at -O) isn't
without cost that users might want to know might be taking place unnecessarily
(in general, whether or not it is necessary depends on the initializer which
may be a function call, but in trivial cases like the one below it could be
eliminated altogether).
3) The behavior differs from that of Clang which does issue a warning in the
case below and also optimizes the variable out. (Clang only diagnoses the
dynamic initialization with potential side-effects with -Wglobal-constructors,
and regardless of whether the static variable is used or not.)
I think the subset of (2) where the dynamic initialization has (or could have)
side-effects could be viewed as an enhancement request for a new warning
pointing out that it takes places even though the variable is unused.
I view the rest of this report (i.e., the mismatch with documentation noted in
(1), and the rest of (2) where the dynamic initializer is known not to have
side-effects and could be diagnosed and omitted) as a bug.
$ cat zzz.c && /home/msebor/build/gcc-trunk-svn/gcc/xgcc -B
/home/msebor/build/gcc-trunk-svn/gcc -S -Wall -Wextra -Wpedantic
-fdump-tree-optimized=/dev/stdout -xc++ zzz.c
static int i;
static int j = i; // -Wunused-variable warning expected
;; Function void __static_initialization_and_destruction_0(int, int)
(_Z41__static_initialization_and_destruction_0ii, funcdef_no=0, decl_uid=2245,
cgraph_uid=0, symbol_order=2)
void __static_initialization_and_destruction_0(int, int) (int __initialize_p,
int __priority)
{
int i.0_1;
<bb 2>:
if (__initialize_p_3(D) == 1)
goto <bb 3>;
else
goto <bb 5>;
<bb 3>:
if (__priority_5(D) == 65535)
goto <bb 4>;
else
goto <bb 5>;
<bb 4>:
i.0_1 = i;
j = i.0_1;
<bb 5>:
return;
}
;; Function (static initializers for zzz.c) (_GLOBAL__sub_I_zzz.c,
funcdef_no=1, decl_uid=2249, cgraph_uid=1, symbol_order=3)
(static initializers for zzz.c) ()
{
<bb 2>:
__static_initialization_and_destruction_0 (1, 65535);
return;
}