[Bug tree-optimization/63446] New: dangling reference results in confusing diagnostic from -Wuninitialized
M8R-ynb11d at mailinator dot com
gcc-bugzilla@gcc.gnu.org
Thu Oct 2 22:59:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63446
Bug ID: 63446
Summary: dangling reference results in confusing diagnostic
from -Wuninitialized
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: M8R-ynb11d at mailinator dot com
struct foo {
int &ref;
foo(int &i) : ref(i) {}
};
foo make_foo()
{
int x = 42;
return foo(x);
}
int func()
{
foo f = make_foo();
return f.ref;
}
This code is obviously broken due to the dangling reference, so I'm glad gcc
gives a warning (clang is silent) but the warning is a bit confusing:
$ g++ -O2 -Wall -c wuninit.cpp
wuninit.cpp: In function ‘int func()’:
wuninit.cpp:15:14: warning: ‘x’ is used uninitialized in this function
[-Wuninitialized]
return f.ref;
^
I get that the diagnostic is generated after inlining has moved x into func(),
but it's still rather confusing as the person that wrote func() might have no
knowledge of the internals of make_foo(), and this would be a real head
scratcher for them. Additionally, it mentions x being used uninitialized, but
x is initialized. (I understand that the initialization becomes dead code and
is removed, but that's not immediately obvious.)
In an ideal world gcc would warn about the last line of make_foo() instead of
func(), and it would mention a dangling reference instead of an uninitialized
use.
More information about the Gcc-bugs
mailing list