Diff for /embedaddon/libiconv/srclib/intprops.h between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/05/29 09:29:43 version 1.1.1.3, 2021/03/17 13:38:46
Line 1 Line 1
 /* intprops.h -- properties of integer types  /* intprops.h -- properties of integer types
   
   Copyright (C) 2001-2005, 2009-2011 Free Software Foundation, Inc.   Copyright (C) 2001-2019 Free Software Foundation, Inc.
   
   This program is free software: you can redistribute it and/or modify   This program is free software: you can redistribute it and/or modify it
   it under the terms of the GNU General Public License as published by   under the terms of the GNU General Public License as published
   the Free Software Foundation; either version 3 of the License, or   by the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.     (at your option) any later version.
   
    This program is distributed in the hope that it will be useful,     This program is distributed in the hope that it will be useful,
Line 13 Line 13
    GNU General Public License for more details.     GNU General Public License for more details.
   
    You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
   
 /* Written by Paul Eggert.  */  /* Written by Paul Eggert.  */
   
Line 22 Line 22
   
 #include <limits.h>  #include <limits.h>
   
/* Return an integer value, converted to the same type as the integer/* Return a value with the common real type of E and V and the value of V.
   expression E after integer type promotion.  V is the unconverted value.  */   Do not evaluate E.  */
#define _GL_INT_CONVERT(e, v) (0 * (e) + (v))#define _GL_INT_CONVERT(e, v) ((1 ? 0 : (e)) + (v))
   
 /* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see  /* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
   <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>.  */   <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00406.html>.  */
#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v))#define _GL_INT_NEGATE_CONVERT(e, v) ((1 ? 0 : (e)) - (v))
   
 /* The extra casts in the following macros work around compiler bugs,  /* The extra casts in the following macros work around compiler bugs,
    e.g., in Cray C 5.0.3.0.  */     e.g., in Cray C 5.0.3.0.  */
Line 37 Line 37
    an integer.  */     an integer.  */
 #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)  #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
   
/* True if negative values of the signed integer type T use two's/* True if the real type T is signed.  */
   complement, ones' complement, or signed magnitude representation, 
   respectively.  Much GNU code assumes two's complement, but some 
   people like to be portable to all possible C hosts.  */ 
#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) 
#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) 
#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) 
 
/* True if the signed integer expression E uses two's complement.  */ 
#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1) 
 
/* True if the arithmetic type T is signed.  */ 
 #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))  #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
   
/* Return 1 if the integer expression E, after integer promotion, has/* Return 1 if the real expression E, after promotion, has a
   a signed type.  */   signed or floating type.  Do not evaluate E.  */
#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)#define EXPR_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
   
   
/* Minimum and maximum values for integer types and expressions.  These/* Minimum and maximum values for integer types and expressions.  */
   macros have undefined behavior if T is signed and has padding bits. 
   If this is a problem for you, please let us know how to fix it for 
   your host.  */ 
   
   /* The width in bits of the integer type or expression T.
      Do not evaluate T.
      Padding bits are not supported; this is checked at compile-time below.  */
   #define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
   
 /* The maximum and minimum values for the integer type T.  */  /* The maximum and minimum values for the integer type T.  */
#define TYPE_MINIMUM(t)                                                 \#define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
  ((t) (! TYPE_SIGNED (t)                                               \ 
        ? (t) 0                                                         \ 
        : TYPE_SIGNED_MAGNITUDE (t)                                     \ 
        ? ~ (t) 0                                                       \ 
        : ~ TYPE_MAXIMUM (t))) 
 #define TYPE_MAXIMUM(t)                                                 \  #define TYPE_MAXIMUM(t)                                                 \
   ((t) (! TYPE_SIGNED (t)                                               \    ((t) (! TYPE_SIGNED (t)                                               \
         ? (t) -1                                                        \          ? (t) -1                                                        \
        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))        : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
   
 /* The maximum and minimum values for the type of the expression E,  /* The maximum and minimum values for the type of the expression E,
   after integer promotion.  E should not have side effects.  */   after integer promotion.  E is not evaluated.  */
 #define _GL_INT_MINIMUM(e)                                              \  #define _GL_INT_MINIMUM(e)                                              \
  (_GL_INT_SIGNED (e)                                                   \  (EXPR_SIGNED (e)                                                      \
   ? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e)         \   ? ~ _GL_SIGNED_INT_MAXIMUM (e)                                       \
    : _GL_INT_CONVERT (e, 0))     : _GL_INT_CONVERT (e, 0))
 #define _GL_INT_MAXIMUM(e)                                              \  #define _GL_INT_MAXIMUM(e)                                              \
  (_GL_INT_SIGNED (e)                                                   \  (EXPR_SIGNED (e)                                                      \
    ? _GL_SIGNED_INT_MAXIMUM (e)                                         \     ? _GL_SIGNED_INT_MAXIMUM (e)                                         \
    : _GL_INT_NEGATE_CONVERT (e, 1))     : _GL_INT_NEGATE_CONVERT (e, 1))
 #define _GL_SIGNED_INT_MAXIMUM(e)                                       \  #define _GL_SIGNED_INT_MAXIMUM(e)                                       \
  (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1)  (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH ((e) + 0) - 2)) - 1) * 2 + 1)
   
   /* Work around OpenVMS incompatibility with C99.  */
   #if !defined LLONG_MAX && defined __INT64_MAX
   # define LLONG_MAX __INT64_MAX
   # define LLONG_MIN __INT64_MIN
   #endif
   
/* Return 1 if the __typeof__ keyword works.  This could be done by/* This include file assumes that signed types are two's complement without
    padding bits; the above macros have undefined behavior otherwise.
    If this is a problem for you, please let us know how to fix it for your host.
    This assumption is tested by the intprops-tests module.  */
 
 /* Does the __typeof__ keyword work?  This could be done by
    'configure', but for now it's easier to do it by hand.  */     'configure', but for now it's easier to do it by hand.  */
#if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C#if (2 <= __GNUC__ \
      || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \
      || (0x5110 <= __SUNPRO_C && !__STDC__))
 # define _GL_HAVE___TYPEOF__ 1  # define _GL_HAVE___TYPEOF__ 1
 #else  #else
 # define _GL_HAVE___TYPEOF__ 0  # define _GL_HAVE___TYPEOF__ 0
Line 117 Line 115
    signed, this macro may overestimate the true bound by one byte when     signed, this macro may overestimate the true bound by one byte when
    applied to unsigned types of size 2, 4, 16, ... bytes.  */     applied to unsigned types of size 2, 4, 16, ... bytes.  */
 #define INT_STRLEN_BOUND(t)                                     \  #define INT_STRLEN_BOUND(t)                                     \
  (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT                 \  (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - _GL_SIGNED_TYPE_OR_EXPR (t)) \
                          - _GL_SIGNED_TYPE_OR_EXPR (t))        \ 
    + _GL_SIGNED_TYPE_OR_EXPR (t))     + _GL_SIGNED_TYPE_OR_EXPR (t))
   
 /* Bound on buffer size needed to represent an integer type or expression T,  /* Bound on buffer size needed to represent an integer type or expression T,
Line 184 Line 181
 /* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.  /* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
    See above for restrictions.  Avoid && and || as they tickle     See above for restrictions.  Avoid && and || as they tickle
    bugs in Sun C 5.11 2010/08/13 and other compilers; see     bugs in Sun C 5.11 2010/08/13 and other compilers; see
   <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>.  */   <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00401.html>.  */
 #define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max)     \  #define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max)     \
   ((b) < 0                                              \    ((b) < 0                                              \
    ? ((a) < 0                                           \     ? ((a) < 0                                           \
Line 223 Line 220
    ? (a) < (min) >> (b)                                 \     ? (a) < (min) >> (b)                                 \
    : (max) >> (b) < (a))     : (max) >> (b) < (a))
   
   /* True if __builtin_add_overflow (A, B, P) works when P is non-null.  */
   #if 5 <= __GNUC__ && !defined __ICC
   # define _GL_HAS_BUILTIN_OVERFLOW 1
   #else
   # define _GL_HAS_BUILTIN_OVERFLOW 0
   #endif
   
   /* True if __builtin_add_overflow_p (A, B, C) works.  */
   #define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
   
 /* The _GL*_OVERFLOW macros have the same restrictions as the  /* The _GL*_OVERFLOW macros have the same restrictions as the
    *_RANGE_OVERFLOW macros, except that they do not assume that operands     *_RANGE_OVERFLOW macros, except that they do not assume that operands
    (e.g., A and B) have the same type as MIN and MAX.  Instead, they assume     (e.g., A and B) have the same type as MIN and MAX.  Instead, they assume
    that the result (e.g., A + B) has that type.  */     that the result (e.g., A + B) has that type.  */
#define _GL_ADD_OVERFLOW(a, b, min, max)                                \#if _GL_HAS_BUILTIN_OVERFLOW_P
  ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max)                  \# define _GL_ADD_OVERFLOW(a, b, min, max)                               \
   : (a) < 0 ? (b) <= (a) + (b)                                         \   __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)
   : (b) < 0 ? (a) <= (a) + (b)                                         \# define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                          \
   : (a) + (b) < (b))   __builtin_sub_overflow_p (a, b, (__typeof__ ((a) - (b))) 0)
#define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                           \# define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                          \
  ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max)             \   __builtin_mul_overflow_p (a, b, (__typeof__ ((a) * (b))) 0)
   : (a) < 0 ? 1                                                        \#else
   : (b) < 0 ? (a) - (b) <= (a)                                         \# define _GL_ADD_OVERFLOW(a, b, min, max)                                \
   : (a) < (b))   ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max)                  \
#define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                           \    : (a) < 0 ? (b) <= (a) + (b)                                         \
  (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a))))       \    : (b) < 0 ? (a) <= (a) + (b)                                         \
   || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))    : (a) + (b) < (b))
 define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                           \
    ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max)             \
     : (a) < 0 ? 1                                                        \
     : (b) < 0 ? (a) - (b) <= (a)                                         \
     : (a) < (b))
 define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                           \
    (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a))))       \
     || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
 #endif
 #define _GL_DIVIDE_OVERFLOW(a, b, min, max)                             \  #define _GL_DIVIDE_OVERFLOW(a, b, min, max)                             \
   ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \    ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
    : (a) < 0 ? (b) <= (a) + (b) - 1                                     \     : (a) < 0 ? (b) <= (a) + (b) - 1                                     \
Line 262 Line 277
     : (a) % - (b))                                                      \      : (a) % - (b))                                                      \
    == 0)     == 0)
   
   /* Check for integer overflow, and report low order bits of answer.
   
 /* Integer overflow checks.  
   
    The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators     The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
    might not yield numerically correct answers due to arithmetic overflow.     might not yield numerically correct answers due to arithmetic overflow.
   They work correctly on all known practical hosts, and do not rely   The INT_<op>_WRAPV macros also store the low-order bits of the answer.
    These macros work correctly on all known practical hosts, and do not rely
    on undefined behavior due to signed arithmetic overflow.     on undefined behavior due to signed arithmetic overflow.
   
   Example usage:   Example usage, assuming A and B are long int:
   
     long int i = ...;     if (INT_MULTIPLY_OVERFLOW (a, b))
     long int j = ...;       printf ("result would overflow\n");
     if (INT_MULTIPLY_OVERFLOW (i, j)) 
       printf ("multiply would overflow"); 
      else       else
       printf ("product is %ld", i * j);       printf ("result is %ld (no overflow)\n", a * b);
   
      Example usage with WRAPV flavor:
   
        long int result;
        bool overflow = INT_MULTIPLY_WRAPV (a, b, &result);
        printf ("result is %ld (%s)\n", result,
                overflow ? "after overflow" : "no overflow");
   
      Restrictions on these macros:
   
    These macros do not check for all possible numerical problems or     These macros do not check for all possible numerical problems or
    undefined or unspecified behavior: they do not check for division     undefined or unspecified behavior: they do not check for division
    by zero, for bad shift counts, or for shifting negative numbers.     by zero, for bad shift counts, or for shifting negative numbers.
Line 286 Line 308
    These macros may evaluate their arguments zero or multiple times, so the     These macros may evaluate their arguments zero or multiple times, so the
    arguments should not have side effects.     arguments should not have side effects.
   
      The WRAPV macros are not constant expressions.  They support only
      +, binary -, and *.  The result type must be signed.
   
    These macros are tuned for their last argument being a constant.     These macros are tuned for their last argument being a constant.
   
    Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,     Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
Line 295 Line 320
   _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)    _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
 #define INT_SUBTRACT_OVERFLOW(a, b) \  #define INT_SUBTRACT_OVERFLOW(a, b) \
   _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)    _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
#define INT_NEGATE_OVERFLOW(a) \#if _GL_HAS_BUILTIN_OVERFLOW_P
  INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))# define INT_NEGATE_OVERFLOW(a) INT_SUBTRACT_OVERFLOW (0, a)
 #else
 # define INT_NEGATE_OVERFLOW(a) \
    INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
 #endif
 #define INT_MULTIPLY_OVERFLOW(a, b) \  #define INT_MULTIPLY_OVERFLOW(a, b) \
   _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)    _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
 #define INT_DIVIDE_OVERFLOW(a, b) \  #define INT_DIVIDE_OVERFLOW(a, b) \
Line 313 Line 342
    Arguments should be free of side effects.  */     Arguments should be free of side effects.  */
 #define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow)        \  #define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow)        \
   op_result_overflow (a, b,                                     \    op_result_overflow (a, b,                                     \
                      _GL_INT_MINIMUM (0 * (b) + (a)),          \                      _GL_INT_MINIMUM (_GL_INT_CONVERT (a, b)), \
                      _GL_INT_MAXIMUM (0 * (b) + (a)))                      _GL_INT_MAXIMUM (_GL_INT_CONVERT (a, b)))
 
 /* Store the low-order bits of A + B, A - B, A * B, respectively, into *R.
    Return 1 if the result overflows.  See above for restrictions.  */
 #define INT_ADD_WRAPV(a, b, r) \
   _GL_INT_OP_WRAPV (a, b, r, +, __builtin_add_overflow, INT_ADD_OVERFLOW)
 #define INT_SUBTRACT_WRAPV(a, b, r) \
   _GL_INT_OP_WRAPV (a, b, r, -, __builtin_sub_overflow, INT_SUBTRACT_OVERFLOW)
 #define INT_MULTIPLY_WRAPV(a, b, r) \
   _GL_INT_OP_WRAPV (a, b, r, *, __builtin_mul_overflow, INT_MULTIPLY_OVERFLOW)
 
 /* Nonzero if this compiler has GCC bug 68193 or Clang bug 25390.  See:
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68193
    https://llvm.org/bugs/show_bug.cgi?id=25390
    For now, assume all versions of GCC-like compilers generate bogus
    warnings for _Generic.  This matters only for older compilers that
    lack __builtin_add_overflow.  */
 #if __GNUC__
 # define _GL__GENERIC_BOGUS 1
 #else
 # define _GL__GENERIC_BOGUS 0
 #endif
 
 /* Store the low-order bits of A <op> B into *R, where OP specifies
    the operation.  BUILTIN is the builtin operation, and OVERFLOW the
    overflow predicate.  Return 1 if the result overflows.  See above
    for restrictions.  */
 #if _GL_HAS_BUILTIN_OVERFLOW
 # define _GL_INT_OP_WRAPV(a, b, r, op, builtin, overflow) builtin (a, b, r)
 #elif 201112 <= __STDC_VERSION__ && !_GL__GENERIC_BOGUS
 # define _GL_INT_OP_WRAPV(a, b, r, op, builtin, overflow) \
    (_Generic \
     (*(r), \
      signed char: \
        _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
                         signed char, SCHAR_MIN, SCHAR_MAX), \
      short int: \
        _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
                         short int, SHRT_MIN, SHRT_MAX), \
      int: \
        _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
                         int, INT_MIN, INT_MAX), \
      long int: \
        _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
                         long int, LONG_MIN, LONG_MAX), \
      long long int: \
        _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
                         long long int, LLONG_MIN, LLONG_MAX)))
 #else
 # define _GL_INT_OP_WRAPV(a, b, r, op, builtin, overflow) \
    (sizeof *(r) == sizeof (signed char) \
     ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
                        signed char, SCHAR_MIN, SCHAR_MAX) \
     : sizeof *(r) == sizeof (short int) \
     ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
                        short int, SHRT_MIN, SHRT_MAX) \
     : sizeof *(r) == sizeof (int) \
     ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
                        int, INT_MIN, INT_MAX) \
     : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
 # ifdef LLONG_MAX
 #  define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
     (sizeof *(r) == sizeof (long int) \
      ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
                         long int, LONG_MIN, LONG_MAX) \
      : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
                         long long int, LLONG_MIN, LLONG_MAX))
 # else
 #  define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
     _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
                      long int, LONG_MIN, LONG_MAX)
 # endif
 #endif
 
 /* Store the low-order bits of A <op> B into *R, where the operation
    is given by OP.  Use the unsigned type UT for calculation to avoid
    overflow problems.  *R's type is T, with extrema TMIN and TMAX.
    T must be a signed integer type.  Return 1 if the result overflows.  */
 #define _GL_INT_OP_CALC(a, b, r, op, overflow, ut, t, tmin, tmax) \
   (sizeof ((a) op (b)) < sizeof (t) \
    ? _GL_INT_OP_CALC1 ((t) (a), (t) (b), r, op, overflow, ut, t, tmin, tmax) \
    : _GL_INT_OP_CALC1 (a, b, r, op, overflow, ut, t, tmin, tmax))
 #define _GL_INT_OP_CALC1(a, b, r, op, overflow, ut, t, tmin, tmax) \
   ((overflow (a, b) \
     || (EXPR_SIGNED ((a) op (b)) && ((a) op (b)) < (tmin)) \
     || (tmax) < ((a) op (b))) \
    ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 1) \
    : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 0))
 
 /* Return the low-order bits of A <op> B, where the operation is given
    by OP.  Use the unsigned type UT for calculation to avoid undefined
    behavior on signed integer overflow, and convert the result to type T.
    UT is at least as wide as T and is no narrower than unsigned int,
    T is two's complement, and there is no padding or trap representations.
    Assume that converting UT to T yields the low-order bits, as is
    done in all known two's-complement C compilers.  E.g., see:
    https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
 
    According to the C standard, converting UT to T yields an
    implementation-defined result or signal for values outside T's
    range.  However, code that works around this theoretical problem
    runs afoul of a compiler bug in Oracle Studio 12.3 x86.  See:
    https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html
    As the compiler bug is real, don't try to work around the
    theoretical problem.  */
 
 #define _GL_INT_OP_WRAPV_VIA_UNSIGNED(a, b, op, ut, t) \
   ((t) ((ut) (a) op (ut) (b)))
   
 #endif /* _GL_INTPROPS_H */  #endif /* _GL_INTPROPS_H */

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>