aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/expr.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2007-12-14 16:11:17 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2007-12-14 16:11:17 +0100
commit4956b1f14709e967ec5a374a4f9f5bcdadaea480 (patch)
tree5b92aa98aad961b67cdefffbc0c12ff912bfdcd0 /gcc/fortran/expr.c
parentae4dbd44baaea8b195e792c1865d02e8bf6c36b8 (diff)
downloadgcc-4956b1f14709e967ec5a374a4f9f5bcdadaea480.zip
gcc-4956b1f14709e967ec5a374a4f9f5bcdadaea480.tar.gz
gcc-4956b1f14709e967ec5a374a4f9f5bcdadaea480.tar.bz2
re PR fortran/34398 (BOZ literals: Range checks)
2007-12-14 Tobias Burnus <burnus@net-b.de> PR fortran/34398 * expr.c (gfc_check_assign): Add range checks for assignments of * BOZs. * resolve.c (resolve_ordinary_assign): Ditto. * arith.c (gfc_range_check): Fix return value for complex * numbers. 2007-12-14 Tobias Burnus <burnus@net-b.de> PR fortran/34398 * gfortran.dg/nan_4.f90: New. From-SVN: r130932
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r--gcc/fortran/expr.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 255acb6..92ad77e 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -2755,11 +2755,28 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
/* Handle the case of a BOZ literal on the RHS. */
if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
{
+ int rc;
if (gfc_option.warn_surprising)
gfc_warning ("BOZ literal at %L is bitwise transferred "
"non-integer symbol '%s'", &rvalue->where,
lvalue->symtree->n.sym->name);
gfc_convert_boz (rvalue, &lvalue->ts);
+ if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
+ {
+ if (rc == ARITH_UNDERFLOW)
+ gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
+ ". This check can be disabled with the option "
+ "-fno-range-check", &rvalue->where);
+ else if (rc == ARITH_OVERFLOW)
+ gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
+ ". This check can be disabled with the option "
+ "-fno-range-check", &rvalue->where);
+ else if (rc == ARITH_NAN)
+ gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
+ ". This check can be disabled with the option "
+ "-fno-range-check", &rvalue->where);
+ return FAILURE;
+ }
}
if (gfc_compare_types (&lvalue->ts, &rvalue->ts))