diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-10 22:12:04 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-10 22:12:04 +0000 |
commit | c8fe94c7ea3debcf5b41cfabfe0ca395b1834da4 (patch) | |
tree | 0df09be0cf775be5c5fc3736c8d20336d1c06fe9 /gcc/fortran/trans-expr.c | |
parent | ac2610bf4275ca4edec63ccc0f6ee53309c639c1 (diff) | |
download | gcc-c8fe94c7ea3debcf5b41cfabfe0ca395b1834da4.zip gcc-c8fe94c7ea3debcf5b41cfabfe0ca395b1834da4.tar.gz gcc-c8fe94c7ea3debcf5b41cfabfe0ca395b1834da4.tar.bz2 |
re PR fortran/31270 (print subscript value and array bounds when out-of-bounds error occurs)
PR fortran/31270
* trans.c (gfc_trans_runtime_check): Reorder arguments and
add extra variable arguments. Hand them to the library function.
* trans.h (gfc_trans_runtime_check): Update prototype.
* trans-array.c (gfc_trans_array_bound_check): Issue more
detailled error messages.
(gfc_conv_array_ref): Likewise.
(gfc_conv_ss_startstride): Likewise.
(gfc_trans_dummy_array_bias): Reorder arguments to
gfc_trans_runtime_check.
* trans-expr.c (gfc_conv_substring): Issue more detailled
error messages.
(gfc_conv_function_call): Reorder arguments to gfc_trans_runtime_check.
* trans-stmt.c (gfc_trans_goto): Likewise.
* trans-io.c (set_string): Reorder arguments to
gfc_trans_runtime_check and issue a more detailled error message.
* trans-decl.c (gfc_build_builtin_function_decls): Make
runtime_error and runtime_error_at handle a variable number of
arguments.
* trans-intrinsic.c (gfc_conv_intrinsic_bound): Reorder arguments
to gfc_trans_runtime_check.
(gfc_conv_intrinsic_minmax): Likewise.
(gfc_conv_intrinsic_repeat): Issue more detailled error messages.
* runtime/error.c (runtime_error_at): Add a variable number of
arguments.
* libgfortran.h (runtime_error_at): Update prototype.
From-SVN: r127352
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 674448b..b24a8ac 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -296,12 +296,14 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind, fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node, nonempty, fault); if (name) - asprintf (&msg, "Substring out of bounds: lower bound of '%s' " + asprintf (&msg, "Substring out of bounds: lower bound (%%ld) of '%s' " "is less than one", name); else - asprintf (&msg, "Substring out of bounds: lower bound " + asprintf (&msg, "Substring out of bounds: lower bound (%%ld)" "is less than one"); - gfc_trans_runtime_check (fault, msg, &se->pre, where); + gfc_trans_runtime_check (fault, &se->pre, where, msg, + fold_convert (long_integer_type_node, + start.expr)); gfc_free (msg); /* Check upper bound. */ @@ -310,12 +312,15 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind, fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node, nonempty, fault); if (name) - asprintf (&msg, "Substring out of bounds: upper bound of '%s' " - "exceeds string length", name); + asprintf (&msg, "Substring out of bounds: upper bound (%%ld) of '%s' " + "exceeds string length (%%ld)", name); else - asprintf (&msg, "Substring out of bounds: upper bound " - "exceeds string length"); - gfc_trans_runtime_check (fault, msg, &se->pre, where); + asprintf (&msg, "Substring out of bounds: upper bound (%%ld) " + "exceeds string length (%%ld)"); + gfc_trans_runtime_check (fault, &se->pre, where, msg, + fold_convert (long_integer_type_node, end.expr), + fold_convert (long_integer_type_node, + se->string_length)); gfc_free (msg); } @@ -2589,7 +2594,7 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, tmp = gfc_conv_descriptor_data_get (info->descriptor); tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp, info->data); - gfc_trans_runtime_check (tmp, gfc_msg_fault, &se->pre, NULL); + gfc_trans_runtime_check (tmp, &se->pre, NULL, gfc_msg_fault); } se->expr = info->descriptor; /* Bundle in the string length. */ |