This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/18016] New: -Winit-self misses member variables initialized after : in ctor
- From: "ejb at ql dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Oct 2004 16:45:05 -0000
- Subject: [Bug c++/18016] New: -Winit-self misses member variables initialized after : in ctor
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
First, my gcc version information:
% gcc -v
Reading specs from /usr/lib/gcc/i486-linux/3.4.2/specs
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr
--libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4
--enable-shared --with-system-zlib --enable-nls --without-included-gettext
--program-suffix=-3.4 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt
--enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm
--enable-java-awt=gtk --disable-werror i486-linux
Thread model: posix
gcc version 3.4.2 (Debian 3.4.2-2)
This is the gcc-3.4 package in debian, FYI, but this bug is not likely to be
debian-specific.
I'm excited to see the -Winit-self warning, but it fails to catch a common
problem, as illustrated by this code fragment (which I will include inline and
also as an attachment for convenience). This code has two cases of variables
initialized with themselves: one trivial int b = b case, and one more subtle A()
: a(a) case. g++ warns for one but not the other. Use this command:
g++-3.4 -c -Winit-self -Wuninitialized -O1 a.cc
on this file:
class A
{
public:
A() : a(a) // <-- should generate a warning
{
}
int getA()
{
int b = b; // <-- generates warning as it should
return this->a + b;
}
private:
int a;
};
int main()
{
A a;
return a.getA();
}
generates this output:
a.cc: In function `int main()':
a.cc:9: warning: 'b' might be used uninitialized in this function
It fails to warn for A::a being initialized with itself in the constructor.
One might also consider it to be a problem that A::getA's being inlined causes
the warning message to mention main() rather than getA() -- this problem is not
present if getA is not inlined. Anyway, the line number is okay, so this seems
pretty unimportant though still worthy of mention.
It would also be nice if -Winit-self would automatically add -Wuninitialized
instead of just not doing anything unless -Wuninitialized was also specified.
I'll mention that in a separate bug report.
--
Summary: -Winit-self misses member variables initialized after :
in ctor
Product: gcc
Version: 3.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: ejb at ql dot org
CC: ejb at ql dot org,gcc-bugs at gcc dot gnu dot org
GCC build triplet: i486-linux
GCC host triplet: i486-linux
GCC target triplet: i486-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18016