aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-const.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2009-03-27 22:55:13 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2009-03-27 22:55:13 +0100
commit346a77d1d814bc194c825ee48e75604646070bf6 (patch)
treebeaf8e8d8e61c21748269df6c2b92982034929d0 /gcc/fortran/trans-const.c
parent68599f330b29e9f1b0fd5bb1578741a5e663688d (diff)
downloadgcc-346a77d1d814bc194c825ee48e75604646070bf6.zip
gcc-346a77d1d814bc194c825ee48e75604646070bf6.tar.gz
gcc-346a77d1d814bc194c825ee48e75604646070bf6.tar.bz2
gfortran.h (enum init_local_real.): Add GFC_INIT_REAL_SNAN.
2009-03-27 Tobias Burnus <burnus@net-b.de> * gfortran.h (enum init_local_real.): Add GFC_INIT_REAL_SNAN. (gfc_expr): Add is_snan. * trans-const.c (gfc_conv_mpfr_to_tree): Support SNaN. (gfc_conv_constant_to_tree): Update call to gfc_conv_mpfr_to_tree. * trans-const.h (gfc_conv_mpfr_to_tree): Update prototype. * resolve.c (build_default_init_expr): Update call. * target-memory.c (encode_float): Ditto. * trans-intrinsic.c * (gfc_conv_intrinsic_aint,gfc_conv_intrinsic_mod, From-SVN: r145129
Diffstat (limited to 'gcc/fortran/trans-const.c')
-rw-r--r--gcc/fortran/trans-const.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/fortran/trans-const.c b/gcc/fortran/trans-const.c
index 4db3512..569aa7e 100644
--- a/gcc/fortran/trans-const.c
+++ b/gcc/fortran/trans-const.c
@@ -218,7 +218,7 @@ gfc_conv_tree_to_mpz (mpz_t i, tree source)
/* Converts a real constant into backend form. */
tree
-gfc_conv_mpfr_to_tree (mpfr_t f, int kind)
+gfc_conv_mpfr_to_tree (mpfr_t f, int kind, int is_snan)
{
tree type;
int n;
@@ -228,7 +228,11 @@ gfc_conv_mpfr_to_tree (mpfr_t f, int kind)
gcc_assert (gfc_real_kinds[n].radix == 2);
type = gfc_get_real_type (kind);
- real_from_mpfr (&real, f, type, GFC_RND_MODE);
+ if (mpfr_nan_p (f) && is_snan)
+ real_from_string (&real, "SNaN");
+ else
+ real_from_mpfr (&real, f, type, GFC_RND_MODE);
+
return build_real (type, real);
}
@@ -277,7 +281,7 @@ gfc_conv_constant_to_tree (gfc_expr * expr)
gfc_build_string_const (expr->representation.length,
expr->representation.string));
else
- return gfc_conv_mpfr_to_tree (expr->value.real, expr->ts.kind);
+ return gfc_conv_mpfr_to_tree (expr->value.real, expr->ts.kind, expr->is_snan);
case BT_LOGICAL:
if (expr->representation.string)
@@ -304,9 +308,9 @@ gfc_conv_constant_to_tree (gfc_expr * expr)
else
{
tree real = gfc_conv_mpfr_to_tree (expr->value.complex.r,
- expr->ts.kind);
+ expr->ts.kind, expr->is_snan);
tree imag = gfc_conv_mpfr_to_tree (expr->value.complex.i,
- expr->ts.kind);
+ expr->ts.kind, expr->is_snan);
return build_complex (gfc_typenode_for_spec (&expr->ts),
real, imag);