simplify.c (gfc_simplify_floor): Set precision of temporary to that of arg.
authorSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 14 Jul 2015 21:44:46 +0000 (21:44 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 14 Jul 2015 21:44:46 +0000 (21:44 +0000)
2015-07-14  Steven G. Kargl  <kargl@gcc.gnu.org>

* simplify.c (gfc_simplify_floor): Set precision of temporary to
that of arg.

2015-07-14  Steven G. Kargl  <kargl@gcc.gnu.org>

gfortran.dg/pr66864.f90: New test.

From-SVN: r225790

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

index 0a2734b66952daf2b6d448555537a29c5a53a4a2..b13f67f75fb8ef9a1fd42147a6ad63b3983afa10 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-14  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       * simplify.c (gfc_simplify_floor): Set precision of temporary to
+       that of arg.
+
 2015-07-13  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        PR fortran/64589
index bc3ec3f8a602c99d27f64841b80f594835376d50..3fb98873709b284e4c332e95e4c3d9071b497c91 100644 (file)
@@ -2351,9 +2351,7 @@ gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
   if (e->expr_type != EXPR_CONSTANT)
     return NULL;
 
-  gfc_set_model_kind (kind);
-
-  mpfr_init (floor);
+  mpfr_init2 (floor, mpfr_get_prec (e->value.real));
   mpfr_floor (floor, e->value.real);
 
   result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
index 45df0cc0095fbe69a48390c702be94a3b648652d..801e46285a91795ded888e255fc80c0a3a99ed4b 100644 (file)
@@ -1,3 +1,7 @@
+2015-07-14  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       gfortran.dg/pr66864.f90: New test.
+
 2015-07-14  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/66626
diff --git a/gcc/testsuite/gfortran.dg/pr66864.f90 b/gcc/testsuite/gfortran.dg/pr66864.f90
new file mode 100644 (file)
index 0000000..ebea99b
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do run }
+! PR fortran/66864
+!
+program t
+   implicit none
+   real(8) x
+   x = 2.0d0**26.5d0
+   if (floor(x) /= 94906265) call abort
+   if (floor(2.0d0**26.5d0)/= 94906265) call abort
+   x = 777666555.6d0
+   if (floor(x) /= 777666555) call abort
+   if (floor(777666555.6d0) /= 777666555) call abort
+   x = 2000111222.6d0
+   if (floor(x) /= 2000111222) call abort
+   if (floor(2000111222.6d0) /= 2000111222) call abort
+end program t