Package: gcc
Version: 4:4.2.1-5

Debian GNU/Linux lenny/sid
amd64

> gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
--enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr
--disable-werror --enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.2.1 (Debian 4.2.1-4)


Output from attached program, if compiled with optimization level -O2:
>From 0 to 2:
 0 - In: -1, -1 (0xffffffffffffffff), Out: -1
 1 - In: 0, 0 (0xffffffffffffffff), Out: 0
 2 - In: 1, 1 (0xffffffffffffffff), Out: 1
>From 1 to 3:
 1 - In: 0, 0 ((nil)), Out: 0
 2 - In: 1, 1 (0x1), Out: 1
 3 - In: 2, 2 (0x2), Out: 2

 Should be
>From 0 to 2:
 0 - In: -1, -1 (0xffffffffffffffff), Out: -1
 1 - In: 0, 0 ((nil)), Out: 0
 2 - In: 1, 1 (0x1), Out: 1
>From 1 to 3:
 1 - In: 0, 0 ((nil)), Out: 0
 2 - In: 1, 1 (0x1), Out: 1
 3 - In: 2, 2 (0x2), Out: 2


 This problem hit me when glib GINT_TO_POINTER() returned wrong values.


 - ML
#include <assert.h>
#include <stdlib.h>

int main()
{
  int i = 0;

  printf("From 0 to 2:\n");
  for (i = 0; i < 3; i++) {
    int iin = i - 1;
    signed long lin = iin;
    void *pin = (void *) lin;
    signed long iout = (signed long) pin;
      
    printf(" %d - In: %d, %d (%p), Out: %d\n", i, iin, lin, pin, iout);
  }

  printf("From 1 to 3:\n");
  for (i = 1; i < 4; i++) {
    int iin = i - 1;
    signed long lin = iin;
    void *pin = (void *) lin;
    signed long iout = (signed long) pin;
      
    printf(" %d - In: %d, %d (%p), Out: %d\n", i, iin, lin, pin, iout);
  }

  return EXIT_SUCCESS;
}

Reply via email to