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

Reply via email to