Source file (no preprocessing required): (note, I made it C-compatible so I could see if the bug is present in the C compiler as well, the answer being no, for reasons that will become obvious immediately) -------------------------------------------------------------------------------- struct st{ int n; }; struct st f(struct st x) { struct st z; z=x; z.n++; return z; } int main() { struct st c; c.n=1234; f(c); return 0; } -------------------------------------------------------------------------------- Terminal session: -------------------------------------------------------------------------------- br...@bbi5291-laptop:~/programs/Other$ g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i686-pc-linux-gnu/4.5.0/lto-wrapper Target: i686-pc-linux-gnu Configured with: ./configure Thread model: posix gcc version 4.5.0 (GCC) br...@bbi5291-laptop:~/programs/Other$ g++ -g bug.c br...@bbi5291-laptop:~/programs/Other$ gdb a.out GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu"... (gdb) break 8 Breakpoint 1 at 0x80483d2: file bug.c, line 8. (gdb) run Starting program: /home/brian/programs/Other/a.out
Breakpoint 1, f (x={n = 1234}) at bug.c:8 8 z.n++; Current language: auto; currently c++ (gdb) print z.n $1 = 2424820 (gdb) q The program is running. Exit anyway? (y or n) y br...@bbi5291-laptop:~/programs/Other$ g++ -g -fno-elide-constructors bug.c br...@bbi5291-laptop:~/programs/Other$ gdb a.out GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu"... (gdb) break 8 Breakpoint 1 at 0x80483e0: file bug.c, line 8. (gdb) run Starting program: /home/brian/programs/Other/a.out Breakpoint 1, f (x={n = 1234}) at bug.c:8 8 z.n++; Current language: auto; currently c++ (gdb) print z.n $1 = 1234 (gdb) q The program is running. Exit anyway? (y or n) y br...@bbi5291-laptop:~/programs/Other$ -------------------------------------------------------------------------------- It is evident to me from these test runs that a bug in the return value optimization is causing the wrong address for the variable z (since this is presumably elided altogether when the optimization is used) to be reported in the debug information. I first noticed this bug in g++ 4.4.1, and installed g++ 4.5.0 and found that it was there too; it does not occur in g++ 4.3.4 or earlier. -- Summary: Return value optimization produces inaccurate debug info Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: bbi5291 at gmail dot com GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44731