The attached patch fixes an issue in the constant folding of FLOOR(). In the old code, the precision of an temporary MPFR variable was set according to the requested kind of the INTEGER result, ie., the wrong precision. The patch sets the precision to the precision of the arg of FLOOR(). Regression tested on trunk. OK to commit.
2015-07-14 Steven G. Kargl <ka...@gcc.gnu.org> * simplify.c (gfc_simplify_floor): Set precision of temporary to that of arg. 2015-07-14 Steven G. Kargl <ka...@gcc.gnu.org> gfortran.dg/pr66864.f90: New test. -- Steve
Index: gcc/fortran/simplify.c =================================================================== --- gcc/fortran/simplify.c (revision 225784) +++ gcc/fortran/simplify.c (working copy) @@ -2351,9 +2351,7 @@ gfc_simplify_floor (gfc_expr *e, gfc_exp 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: gcc/testsuite/gfortran.dg/pr66864.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr66864.f90 (revision 0) +++ gcc/testsuite/gfortran.dg/pr66864.f90 (working copy) @@ -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