OSDN Git Service

PR fortran/25458
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Dec 2005 17:30:26 +0000 (17:30 +0000)
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Dec 2005 17:30:26 +0000 (17:30 +0000)
* simplify.c (gfc_simplify_ibset, gfc_simplify_not): Add call to
twos_complement.

* gfortran.dg/chkbits.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108720 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/chkbits.f90 [new file with mode: 0644]

index 882332d..98e624a 100644 (file)
@@ -1,4 +1,11 @@
 2005-12-17  Steven G. Kargl  <kargls@comcast.net>
+           Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
+
+       PR fortran/25458
+       * simplify.c (gfc_simplify_ibset, gfc_simplify_not): Add call to
+       twos_complement.
+
+2005-12-17  Steven G. Kargl  <kargls@comcast.net>
 
        * decl.c (gfc_match_old_kind_spec,match_type_spec): Use gfc_std_notify
        to report nonstandard intrinsic type declarations.
index e6fbefc..5b47e93 100644 (file)
@@ -1348,6 +1348,9 @@ gfc_simplify_ibset (gfc_expr * x, gfc_expr * y)
   result = gfc_copy_expr (x);
 
   mpz_setbit (result->value.integer, pos);
+
+  twos_complement (result->value.integer, gfc_integer_kinds[k].bit_size);
+
   return range_check (result, "IBSET");
 }
 
@@ -2514,6 +2517,8 @@ gfc_simplify_not (gfc_expr * e)
   mpz_and (result->value.integer, result->value.integer,
           gfc_integer_kinds[i].max_int);
 
+  twos_complement (result->value.integer, gfc_integer_kinds[i].bit_size);
+
   return range_check (result, "NOT");
 }
 
index a45284b..b7e00b9 100644 (file)
@@ -1,5 +1,10 @@
 2005-12-17  Steven G. Kargl  <kargls@comcast.net>
 
+       * PR fortran/25458
+       * gfortran.dg/chkbits.f90: New test.
+
+2005-12-17  Steven G. Kargl  <kargls@comcast.net>
+
        *gfortran.dg/enum_5.f:  Revert to previous version.
 
 2005-12-17  Steven G. Kargl  <kargls@comcast.net>
diff --git a/gcc/testsuite/gfortran.dg/chkbits.f90 b/gcc/testsuite/gfortran.dg/chkbits.f90
new file mode 100644 (file)
index 0000000..19ab5c7
--- /dev/null
@@ -0,0 +1,26 @@
+! { dg-do run }
+! NOT() was not return the two's complement value as reported by
+! PR fortran/25458.  In checking other bit manipulation intrinsics,
+! IBSET was found to be in error.
+program chkbits
+
+  implicit none
+
+  integer(kind=1) i1
+  integer(kind=2) i2
+  integer(kind=4) i4
+  integer(kind=8) i8
+
+  i1 = ibset(2147483647,bit_size(i4)-1)
+  i2 = ibset(2147483647,bit_size(i4)-1)
+  i4 = ibset(2147483647,bit_size(i4)-1)
+  i8 = ibset(2147483647,bit_size(i4)-1)
+  if (i1 /= -1 .or. i2 /= -1 .or. i4 /= -1 .or. i8 /= -1) call abort
+
+  i1 = not(0)
+  i2 = not(0)
+  i4 = not(0)
+  i8 = not(0)
+  if (i1 /= -1 .or. i2 /= -1 .or. i4 /= -1 .or. i8 /= -1) call abort
+
+end program chkbits