[Bug c/51983] New: Wrong line number in an uninitialized variable warning
Greta.Yorsh at arm dot com
gcc-bugzilla@gcc.gnu.org
Tue Jan 24 19:52:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51983
Bug #: 51983
Summary: Wrong line number in an uninitialized variable warning
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: Greta.Yorsh@arm.com
CC: ramana@gcc.gnu.org
For uninitialized variables of type _Complex, arm and x86 compilers report
different line numbers in warning messages:
* if only the real part of a complex variable is uninitialized, arm compiler
reports the line number where the variable is declared.
* if only the imaginary part of a complex variable is uninitialized, arm
compiler reports the line number where the variable is used.
* if only one of the parts of a complex variable is uninitialized, x86 compiler
reports the line where the other part is initialized.
* if both parts of a complex variable are uninitialized, both arm and x86
compilers (correctly) report the line where the variable is used.
This behaviour causes a failure in gcc.dg/uninit-13.c test on arm target.
Note that in this test, dg-warning directive expects the warning message about
uninitialized variable to report the line in which the imaginary part of the
complex variable is initialized, and not the line where the uninitialized
variable is used. That is, the test passes on x86 target, even thought the line
number in the message is not what one would (perhaps naively) expect, based on
the behaviour of the compiler for other types of uninitialized variables.
I don't know if the problem is in the frontend, middle-end, target, or
testsuite.
----------------------------------------
$ cat -n /work/tmp/unin1.c
1 typedef _Complex float C;
2 C foo(int *p)
3 {
4 C f;
5 int a = *p;
6 *p = 42 * a;
7 __imag__ f = 0;
8 return f;
9 }
$ arm-none-eabi-gcc -O -Wuninitialized -S -o tmp.s /work/tmp/unin1.c
/work/tmp/unin1.c: In function 'foo':
/work/tmp/unin1.c:4:5: warning: '__real__ f' is used uninitialized in this
function [-Wuninitialized]
$ gcc -O -Wuninitialized -S -o tmp.s /work/tmp/unin1.c
/work/tmp/unin1.c: In function ‘foo’:
/work/tmp/unin1.c:7: warning: ‘__real__ f’ is used uninitialized in this
function
----------------------------------------
$ cat -n /work/tmp/unin2.c
1 typedef _Complex float C;
2 C foo(int *p)
3 {
4 C f;
5 int a = *p;
6 *p = 42 * a;
7 __real__ f = 0;
8 return f;
9 }
$ arm-none-eabi-gcc -O -Wuninitialized -S -o tmp.s /work/tmp/unin2.c
/work/tmp/unin2.c: In function 'foo':
/work/tmp/unin2.c:8:3: warning: '__imag__ f' is used uninitialized in this
function [-Wuninitialized]
$ gcc -O -Wuninitialized -S -o tmp.s /work/tmp/unin2.c
/work/tmp/unin2.c: In function ‘foo’:
/work/tmp/unin2.c:7: warning: ‘__imag__ f’ is used uninitialized in this
function
----------------------------------------
$ cat -n /work/tmp/unin3.c
1 typedef _Complex float C;
2 C foo(int *p)
3 {
4 C f;
5 int a = *p;
6 *p = 42 * a;
7
8 return f;
9 }
$ arm-none-eabi-gcc -O -Wuninitialized -S -o tmp.s /work/tmp/unin3.c
/work/tmp/unin3.c: In function 'foo':
/work/tmp/unin3.c:8:3: warning: 'f' is used uninitialized in this function
[-Wuninitialized]
$ gcc -O -Wuninitialized -S -o tmp.s /work/tmp/unin3.c
/work/tmp/unin3.c: In function ‘foo’:
/work/tmp/unin3.c:8: warning: ‘f’ is used uninitialized in this function
More information about the Gcc-bugs
mailing list