summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--src/system.h9
2 files changed, 13 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 67e6d0069..e73030873 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,12 @@
-2005-07-04 Paul Eggert <eggert@cs.ucla.edu>
+2005-07-05 Paul Eggert <eggert@cs.ucla.edu>
* Version 5.3.1.
+ * src/system.h (DECIMAL_DIGIT_ACCUMULATE): Generate a hard error
+ (not just a warning) if GCC is used and the types don't match.
+
+2005-07-04 Paul Eggert <eggert@cs.ucla.edu>
+
* src/system.h (VERIFY_W_TYPEOF): Remove; no longer needed.
(DECIMAL_DIGIT_ACCUMULATE): Change last arg from T's maximum value
to T itself. All callers changed. Check that T is unsigned, and
diff --git a/src/system.h b/src/system.h
index a22bfb04e..e3a99ab5d 100644
--- a/src/system.h
+++ b/src/system.h
@@ -811,13 +811,18 @@ ptr_align (void const *ptr, size_t alignment)
then don't update Accum and return false to indicate it would
overflow. Otherwise, set Accum to that new value and return true.
Verify at compile-time that Type is Accum's type, and that Type is
- unsigned. Accum must be an object, so that we can take its address.
- Accum and Digit_val may be evaluated multiple times. */
+ unsigned. Accum must be an object, so that we can take its
+ address. Accum and Digit_val may =be evaluated multiple times.
+
+ The "Added check" below is not strictly required, but it causes GCC
+ to return a nonzero exit status instead of merely a warning
+ diagnostic, and that is more useful. */
#define DECIMAL_DIGIT_ACCUMULATE(Accum, Digit_val, Type) \
( \
(void) (&(Accum) == (Type *) NULL), /* The type matches. */ \
verify_expr (! TYPE_SIGNED (Type)), /* The type is unsigned. */ \
+ verify_expr (sizeof (Accum) == sizeof (Type)), /* Added check. */ \
(((Type) -1 / 10 < (Accum) \
|| (Type) ((Accum) * 10 + (Digit_val)) < (Accum)) \
? false : (((Accum) = (Accum) * 10 + (Digit_val)), true)) \