bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: fpurge.c error when building m4 1.4.11


From: Eric Blake
Subject: Re: fpurge.c error when building m4 1.4.11
Date: Mon, 21 Apr 2008 09:19:55 -0700 (PDT)

> > This is due to the gcc 2.7.2.1 preprocessor unable to calculate or
> > compare long longs.
> 
> Yes, your analysis is correct. Last year, Paul Eggert decided that
> we had long enough supported compilers with pre-C99 preprocessors.
> Yes, we want to use UINTMAX_MAX in preprocessor expressions.
> 
> Nevertheless, in memchr2.c it would be possible to write an if (...)
> instead of #if. This will cause warnings on compilers which don't have
> 64-bit integers at all;

How so?  The gnulib stdint.h replacement guarantees that
UINTMAX_MAX is of the largest supportable type; if long long is
not supported, then it is not a 64-bit integer.

Unless you're claiming that the compiler might warn about the
explicit shift by 32 bits on platforms where my patch below now
compiles the shift (in a dead code branch) where it was
previously omitted by the #if, but that's okay with me (ie. I don't
see the point in making the code uglier with <<31<<1 just
for a compiler that only supports 32-bit integers and warns
on explicit shift by 32).

> but it will allow compilation on compilers which
> have 64-bit integers in the expressions but not in the preprocessor.
> Eric, do you agree?

Yes; I'm checking in the following (should we also change
memchr.c to match, since I borrowed from there in writing
memchr2.c)?

>From 218c1d232b2568450b4581f93d544e4d3af59c36 Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Mon, 21 Apr 2008 09:57:07 -0600
Subject: [PATCH] Work around preprocessors that don't handle UINTMAX_MAX.

* lib/memchr2.c (memchr2): Avoid embedded #if.
Reported by Alain Guibert, fix suggested by Bruno Haible.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog     |    8 +++++++-
 lib/memchr2.c |   25 +++++++++++++------------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9153749..9266f7f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-21  Eric Blake  <address@hidden>
+
+       Work around preprocessors that don't handle UINTMAX_MAX.
+       * lib/memchr2.c (memchr2): Avoid embedded #if.
+       Reported by Alain Guibert, fix suggested by Bruno Haible.
+
 2008-04-21  Simon Josefsson  <address@hidden>
 
        * doc/posix-functions/strftime.texi (strftime): Explain better
diff --git a/lib/memchr2.c b/lib/memchr2.c
index d5b0a78..3853343 100644
--- a/lib/memchr2.c
+++ b/lib/memchr2.c
@@ -83,18 +83,19 @@ memchr2 (void const *s, int c1_in, int c2_in, size_t n)
   charmask2 = c2 | (c2 << 8);
   charmask1 |= charmask1 << 16;
   charmask2 |= charmask2 << 16;
-#if 0xffffffffU < UINTMAX_MAX
-  magic_bits |= magic_bits << 32;
-  charmask1 |= charmask1 << 32;
-  charmask2 |= charmask2 << 32;
-  if (8 < sizeof longword1)
-    for (i = 64; i < sizeof longword1 * 8; i *= 2)
-      {
-       magic_bits |= magic_bits << i;
-       charmask1 |= charmask1 << i;
-       charmask2 |= charmask2 << i;
-      }
-#endif
+  if (0xffffffffU < UINTMAX_MAX)
+    {
+      magic_bits |= magic_bits << 32;
+      charmask1 |= charmask1 << 32;
+      charmask2 |= charmask2 << 32;
+      if (8 < sizeof longword1)
+       for (i = 64; i < sizeof longword1 * 8; i *= 2)
+         {
+           magic_bits |= magic_bits << i;
+           charmask1 |= charmask1 << i;
+           charmask2 |= charmask2 << i;
+         }
+    }
   magic_bits = (UINTMAX_MAX >> 1) & (magic_bits | 1);
 
   /* Instead of the traditional loop which tests each character,
-- 
1.5.5


-- 
View this message in context: 
http://www.nabble.com/fpurge.c-error-when-building-m4-1.4.11-tp16705250p16808234.html
Sent from the Gnulib mailing list archive at Nabble.com.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]