The following programm prints out "1", it should print "4" (like it does with gcc-3.3.6:
// Start of test.c #include <stdlib.h> #include <stdio.h> struct test { unsigned long counter; }; unsigned long inc(struct test *tp) { tp->counter += 3; return 1; } int main() { struct test *p; p = (struct test*) malloc(sizeof(struct test)); p->counter = 0; p->counter += inc(p); printf("%ld\n", p->counter); free(p); return 0; } // End of test.c The following programm is not affected and prints out "4": // Start of test2.c #include <stdlib.h> #include <stdio.h> unsigned long inc(unsigned long *c) { *c += 3; return 1; } int main() { unsigned long counter; counter = 0; counter += inc(&counter); printf("%ld\n", counter); return 0; } // End of test2.c // Start output of "gcc -v -save-temps -Wall test.c" Using built-in specs. Target: i686-pc-linux-gnu Configured with: /home/portage/portage/sys-devel/gcc-4.1.2/work/gcc-4.1.2/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.1.2 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-libunwind-exceptions --disable-multilib --enable-libmudflap --disable-libssp --enable-java-awt=gtk --with-arch=i686 --enable-languages=c,c++,java,treelang,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion=Gentoo 4.1.2 p1.1 Thread model: posix gcc version 4.1.2 (Gentoo 4.1.2 p1.1) /usr/libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1 -E -quiet -v test.c -march=i686 -Wall -fpch-preprocess -o test.i ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include /usr/include End of search list. /usr/libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1 -fpreprocessed test.i -quiet -dumpbase test.c -march=i686 -auxbase test -Wall -version -o test.s GNU C version 4.1.2 (Gentoo 4.1.2 p1.1) (i686-pc-linux-gnu) compiled by GNU C version 4.1.2 (Gentoo 4.1.2 p1.1). GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: db0ff7bf11ec8c21ed7c44c88f5253be /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/bin/as -V -Qy -o test.o test.s GNU assembler version 2.18 (i686-pc-linux-gnu) using BFD version (GNU Binutils) 2.18 /usr/libexec/gcc/i686-pc-linux-gnu/4.1.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2 -L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2 -L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/lib -L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../.. test.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crtn.o // End output of "gcc -v -save-temps -Wall test.c" -- Summary: p->count += inc(p); // value of p->count is wrong, if inc(p) not only returns an int but also increases p- >counter Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: micirio at gmx dot net http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37947