Ralf Wildenhues <[EMAIL PROTECTED]> writes:

> This is pgcc 6.0-8 64-bit target on x86-64 Linux, but as indicated
> above, the issue is present in 5.2-1 as well.

Thanks for checking that.  Can you please run the following
program on that platform and send us the output?  If it outputs
"preprocessor thinks BITSET_WORD_BITS = 64", then we have an
obvious fix to regex_internal.h.  Thanks.

#include <limits.h>

/* Maximum value of a bitset word.  It must be useful in preprocessor
   contexts, and must be consistent with bitset_word.  */
#define BITSET_WORD_MAX ULONG_MAX

/* Number of bits in a bitset word.  Avoid greater-than-32-bit
   integers and unconditional shifts by more than 31 bits, as they're
   not portable.  */
#if BITSET_WORD_MAX == 0xffffffff
# define BITSET_WORD_BITS 32
#elif BITSET_WORD_MAX >> 31 >> 5 == 1
# define BITSET_WORD_BITS 36
#elif BITSET_WORD_MAX >> 31 >> 16 == 1
# define BITSET_WORD_BITS 48
#elif BITSET_WORD_MAX >> 31 >> 28 == 1
# define BITSET_WORD_BITS 60
#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1
# define BITSET_WORD_BITS 64
#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1
# define BITSET_WORD_BITS 72
#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1
# define BITSET_WORD_BITS 128
#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1
# define BITSET_WORD_BITS 256
#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1
# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */
# if BITSET_WORD_BITS <= SBC_MAX
#  error "Invalid SBC_MAX"
# endif
#elif BITSET_WORD_MAX == (0xffffffff + 2) * 0xffffffff
/* Work around a bug in PGC GNU/Linux x86-64 5.2-1 and 6.0-8 (and
   probably other versions), where the preprocessor mishandles large
   unsigned values and thinks they are signed.  */
# define BITSET_WORD_BITS 64
#else
# error "Add case for new bitset_word size"
#endif


#include <stdio.h>

int main(void)
{
  printf("ULONG_MAX = %lu\nsizeof(ulong) = %lu\n", ULONG_MAX,
         (unsigned long) sizeof(unsigned long));
  printf("%lu\n", BITSET_WORD_MAX >> 31 >> 31 >> 1);
  printf("BITSET_WORD_BITS = %d\n", BITSET_WORD_BITS);
#if BITSET_WORD_BITS == 32
  printf("preprocessor thinks BITSET_WORD_BITS = 32\n");
#elif BITSET_WORD_BITS == 64
  printf("preprocessor thinks BITSET_WORD_BITS = 64\n");
#else
  printf("preprocessor has some other value for BITSET_WORD_BITS\n");
#endif
  return 0;
}


_______________________________________________
bug-gnulib mailing list
bug-gnulib@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-gnulib

Reply via email to