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;
}

        Jakub

Reply via email to