diff options
author | Tobias Burnus <burnus@net-b.de> | 2009-03-27 22:55:13 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2009-03-27 22:55:13 +0100 |
commit | 346a77d1d814bc194c825ee48e75604646070bf6 (patch) | |
tree | beaf8e8d8e61c21748269df6c2b92982034929d0 /gcc/fortran/trans-const.c | |
parent | 68599f330b29e9f1b0fd5bb1578741a5e663688d (diff) | |
download | gcc-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.c | 14 |
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); |