summaryrefslogtreecommitdiff
path: root/gcc/fortran/arith.c
diff options
context:
space:
mode:
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2014-04-27 10:48:56 +0000
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2014-04-27 10:48:56 +0000
commitdd0b96f0f21aae7e877ef39ff92473cf8aa04e9e (patch)
treedf8990f63d71efb8bb9c81ebabcbf81b51cbef68 /gcc/fortran/arith.c
parent6a2db0a6bbcc60c52fb025ed7933c1685641b5eb (diff)
downloadgcc-dd0b96f0f21aae7e877ef39ff92473cf8aa04e9e.tar.gz
2014-03-27 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/59604 PR fortran/58003 * gfortran.h (gfc_convert_mpz_to_signed): Add prototype. * arith.c (gfc_int2int): Convert number to signed if arithmetic overflow is not checked. * simplify.c (convert_mpz_to_unsigned): Only trigger assert for size if range checking is in force. (convert_mpz_to_signed): Make non-static, rename to (gfc_convert_mpz_to_signed). (simplify_dshift): Use gfc_convert_mpz_to_signed. (gfc_simplify_ibclr): Likewise. (gfc_simplify_ibits): Likewise. (gfc_simplify_ibset): Likewise. (simplify_shift): Likewise. (gfc_simplify_ishiftc): Likewise. (gfc_simplify_maskr): Likewise. (gfc_simplify_maskl): Likewise. 2014-03-27 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/59604 PR fortran/58003 * gfortran.dg/no_range_check_3.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209836 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/arith.c')
-rw-r--r--gcc/fortran/arith.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index 053cf765e59..a05fa4907a4 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -1976,6 +1976,17 @@ gfc_int2int (gfc_expr *src, int kind)
}
}
+ /* If we do not trap numeric overflow, we need to convert the number to
+ signed, throwing away high-order bits if necessary. */
+ if (gfc_option.flag_range_check == 0)
+ {
+ int k;
+
+ k = gfc_validate_kind (BT_INTEGER, kind, false);
+ gfc_convert_mpz_to_signed (result->value.integer,
+ gfc_integer_kinds[k].bit_size);
+ }
+
return result;
}