diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-11-24 00:25:01 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-11-24 00:25:01 +0000 |
commit | be9c3c6e931d77e06d5ec6366d7379f27dd35dd3 (patch) | |
tree | ddbdb823d91156c4576ecc437fb5a3fac2a14cde /gcc/fortran/trans-expr.c | |
parent | a98a436fdf4451837a3c564048ddfaef5a53b1e6 (diff) | |
download | gcc-be9c3c6e931d77e06d5ec6366d7379f27dd35dd3.zip gcc-be9c3c6e931d77e06d5ec6366d7379f27dd35dd3.tar.gz gcc-be9c3c6e931d77e06d5ec6366d7379f27dd35dd3.tar.bz2 |
re PR libfortran/34209 (run-time lib: NEAREST(0.0_8, -1.0) produces wrong numbers)
2007-11-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/34209
* iresolve.c (gfc_resolve_nearest): If sign variable kind does not match
kind of input variable, convert it to match.
PR fortran/33317
* trans.h: Modify prototype for gfc_conv_missing_dummy.
* trans-expr.c (gfc_conv_missing_dummy): Modify to pass an integer kind
parameter in. Set the type of the dummy to the kind given.
(gfc_conv_function_call): Pass representation.length to
gfc_conv_missing_dummy.
* iresolve.c (gfc_resolve_cshift): Determine the correct kind to use and
if appropriate set representation.length to this kind value.
(gfc_resolve_eoshift): Likewise.
* check.c (gfc_check_cshift): Enable dim_check to allow DIM as an
optional argument. (gfc_check_eoshift): Likewise.
* trans_intrinsic.c (gfc_conv_intrinsic_function_args): Update call to
gfc_conv_missing_dummy.
From-SVN: r130391
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index c47f69b..231fef5 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -146,7 +146,7 @@ gfc_conv_expr_present (gfc_symbol * sym) /* Converts a missing, dummy argument into a null or zero. */ void -gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts) +gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind) { tree present; tree tmp; @@ -154,9 +154,16 @@ gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts) present = gfc_conv_expr_present (arg->symtree->n.sym); tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr, - fold_convert (TREE_TYPE (se->expr), integer_zero_node)); - + fold_convert (TREE_TYPE (se->expr), integer_zero_node)); tmp = gfc_evaluate_now (tmp, &se->pre); + + if (kind > 0) + { + tmp = gfc_get_int_type (kind); + tmp = fold_convert (tmp, se->expr); + tmp = gfc_evaluate_now (tmp, &se->pre); + } + se->expr = tmp; if (ts.type == BT_CHARACTER) @@ -2324,7 +2331,8 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, check its presence and substitute a null if absent. */ if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.optional) - gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts); + gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts, + e->representation.length); } if (fsym && e) |