This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [wide-int] Add more assertions


These are fine.

On 05/02/2014 03:20 PM, Richard Sandiford wrote:
This patch adds some assertions against sext (.., 0) and zext (..., 0).
The former is undefined at the sext_hwi level and the latter is disallowed
for consistency with the former.

Also, set_bit (rightly IMO) can't handle bit >= precision.  For
precision <= HOST_BITS_PER_WIDE_INT it would invoke undefined
behaviour while for other precisions I think it would crash.
A case with precision <= HOST_BITS_PER_WIDE_INT showed up in java
(fix posted separately).

Tested on x86_64-linux-gnu and powerpc64-linux-gnu.  OK to install?

Thanks,
Richard


Index: gcc/wide-int.h
===================================================================
--- gcc/wide-int.h	2014-05-02 16:28:09.561842842 +0100
+++ gcc/wide-int.h	2014-05-02 16:44:04.015463718 +0100
@@ -2046,6 +2046,8 @@ wi::sext (const T &x, unsigned int offse
    unsigned int precision = get_precision (result);
    WIDE_INT_REF_FOR (T) xi (x, precision);
+ gcc_checking_assert (offset != 0);
+
    if (offset <= HOST_BITS_PER_WIDE_INT)
      {
        val[0] = sext_hwi (xi.ulow (), offset);
@@ -2065,6 +2067,8 @@ wi::zext (const T &x, unsigned int offse
    unsigned int precision = get_precision (result);
    WIDE_INT_REF_FOR (T) xi (x, precision);
+ gcc_checking_assert (offset != 0);
+
    /* This is not just an optimization, it is actually required to
       maintain canonization.  */
    if (offset >= precision)
@@ -2102,6 +2106,9 @@ wi::set_bit (const T &x, unsigned int bi
    WI_UNARY_RESULT_VAR (result, val, T, x);
    unsigned int precision = get_precision (result);
    WIDE_INT_REF_FOR (T) xi (x, precision);
+
+  gcc_checking_assert (bit < precision);
+
    if (precision <= HOST_BITS_PER_WIDE_INT)
      {
        val[0] = xi.ulow () | ((unsigned HOST_WIDE_INT) 1 << bit);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]