On Fri, Feb 12, 2010 at 10:41 AM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > It seems pointers are sign extended to wider integers, is that intentional? > It certainly contradicts the comment in convert_to_integer: > switch (TREE_CODE (intype)) > { > case POINTER_TYPE: > case REFERENCE_TYPE: > if (integer_zerop (expr)) > return build_int_cst (type, 0); > > /* Convert to an unsigned integer of the correct width first, and from > there widen/truncate to the required type. Some targets support the > coexistence of multiple valid pointer sizes, so fetch the one we need > from the type. */ > expr = fold_build1 (CONVERT_EXPR, > lang_hooks.types.type_for_size > (TYPE_PRECISION (intype), 0), > expr); > return fold_convert (type, expr); > but the comment is newer than the sign extension. > > void > foo (long long l) > { > if ((l >> (sizeof (void *) * __CHAR_BIT__ - 1)) == 1) > __builtin_puts ("pointers zero extend to wider integers"); > else if ((l >> (sizeof (void *) * __CHAR_BIT__ - 1)) == -1) > __builtin_puts ("pointers sign extend to wider integers"); > } > > int > main (void) > { > int i; > if (sizeof (&i) < sizeof (long long)) > foo ((long long) &i); > return 0; > }
Your program prints zero-extends for ICC. Probably the behavior is undefined and we get a warning anyway: t.c: In function ‘main’: t.c:15: warning: cast from pointer to integer of different size The middle-end requires an intermediate conversion to a same-precision integer type to not fall into the trap deciding what sign a pointer has. Richard. > Jakub >