diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2007-02-04 22:33:10 +0100 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-02-04 21:33:10 +0000 |
commit | a14fb6faeb27b26cdacea6f4c5f3d121ae540d7e (patch) | |
tree | fd54893bee97669ebd4effe1e61628b8994d390c /gcc/fortran/trans-intrinsic.c | |
parent | 8135cfa844ab2f7a33fc300eff2917f6fbb51e8c (diff) | |
download | gcc-a14fb6faeb27b26cdacea6f4c5f3d121ae540d7e.zip gcc-a14fb6faeb27b26cdacea6f4c5f3d121ae540d7e.tar.gz gcc-a14fb6faeb27b26cdacea6f4c5f3d121ae540d7e.tar.bz2 |
re PR fortran/30611 ([4.1 only] Confusing error message for negative ncopies in REPEAT)
PR fortran/30611
* trans-intrinsic.c (gfc_conv_intrinsic_repeat): Evaluate
arguments only once. Generate check that NCOPIES argument is not
negative.
* intrinsics/string_intrinsics.c (string_repeat): Don't check
if ncopies is negative.
* gcc/testsuite/gfortran.dg/repeat_1.f90: New test.
From-SVN: r121581
Diffstat (limited to 'gcc/fortran/trans-intrinsic.c')
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index 6c321f1..aa8008b 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -3357,18 +3357,32 @@ gfc_conv_intrinsic_repeat (gfc_se * se, gfc_expr * expr) tree ncopies; tree var; tree type; + tree cond; args = gfc_conv_intrinsic_function_args (se, expr); len = TREE_VALUE (args); tmp = gfc_advance_chain (args, 2); ncopies = TREE_VALUE (tmp); + + /* Check that ncopies is not negative. */ + ncopies = gfc_evaluate_now (ncopies, &se->pre); + cond = fold_build2 (LT_EXPR, boolean_type_node, ncopies, + build_int_cst (TREE_TYPE (ncopies), 0)); + gfc_trans_runtime_check (cond, + "Argument NCOPIES of REPEAT intrinsic is negative", + &se->pre, &expr->where); + + /* Compute the destination length. */ len = fold_build2 (MULT_EXPR, gfc_int4_type_node, len, ncopies); type = gfc_get_character_type (expr->ts.kind, expr->ts.cl); var = gfc_conv_string_tmp (se, build_pointer_type (type), len); + /* Create the argument list and generate the function call. */ arglist = NULL_TREE; arglist = gfc_chainon_list (arglist, var); - arglist = chainon (arglist, args); + arglist = gfc_chainon_list (arglist, TREE_VALUE (args)); + arglist = gfc_chainon_list (arglist, TREE_VALUE (TREE_CHAIN (args))); + arglist = gfc_chainon_list (arglist, ncopies); tmp = build_function_call_expr (gfor_fndecl_string_repeat, arglist); gfc_add_expr_to_block (&se->pre, tmp); |