aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>2006-11-26 13:25:50 +0100
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2006-11-26 12:25:50 +0000
commitd19c0f4fa6599e454c1c7b12917252f6f34852e7 (patch)
treedd60c2c6bad2e014d025f178a2f49f119786e154
parent9dedcfe16a380a72d92cb164f229c64a5e97d312 (diff)
downloadgcc-d19c0f4fa6599e454c1c7b12917252f6f34852e7.zip
gcc-d19c0f4fa6599e454c1c7b12917252f6f34852e7.tar.gz
gcc-d19c0f4fa6599e454c1c7b12917252f6f34852e7.tar.bz2
re PR fortran/29892 (substring out of bounds: Missing variable name for variables with parameter attribute)
PR fortran/29892 * trans-intrinsic.c (gfc_conv_intrinsic_bound): Use a locus in the call to gfc_trans_runtime_check. * trans-array.c (gfc_trans_array_bound_check): Try harder to find the variable or function name for the runtime error message. (gfc_trans_dummy_array_bias): Use a locus in the call to gfc_trans_runtime_check From-SVN: r119223
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/trans-array.c39
-rw-r--r--gcc/fortran/trans-intrinsic.c2
3 files changed, 45 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9b350ff..4c8a2ec 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,13 @@
+2006-11-26 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR fortran/29892
+ * trans-intrinsic.c (gfc_conv_intrinsic_bound): Use a locus in
+ the call to gfc_trans_runtime_check.
+ * trans-array.c (gfc_trans_array_bound_check): Try harder to find
+ the variable or function name for the runtime error message.
+ (gfc_trans_dummy_array_bias): Use a locus in the call to
+ gfc_trans_runtime_check
+
2006-11-26 Andrew Pinski <pinskia@gmail.com>
* trans-decl.c (gfc_build_intrinsic_function_decls): Mark the
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 2a5b3b7..991fa1c 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -1849,18 +1849,47 @@ gfc_trans_array_bound_check (gfc_se * se, tree descriptor, tree index, int n,
tree fault;
tree tmp;
char *msg;
+ const char * name = NULL;
if (!flag_bounds_check)
return index;
index = gfc_evaluate_now (index, &se->pre);
+ /* We find a name for the error message. */
+ if (se->ss)
+ name = se->ss->expr->symtree->name;
+
+ if (!name && se->loop && se->loop->ss && se->loop->ss->expr
+ && se->loop->ss->expr->symtree)
+ name = se->loop->ss->expr->symtree->name;
+
+ if (!name && se->loop && se->loop->ss && se->loop->ss->loop_chain
+ && se->loop->ss->loop_chain->expr
+ && se->loop->ss->loop_chain->expr->symtree)
+ name = se->loop->ss->loop_chain->expr->symtree->name;
+
+ if (!name && se->loop && se->loop->ss && se->loop->ss->loop_chain
+ && se->loop->ss->loop_chain->expr->symtree)
+ name = se->loop->ss->loop_chain->expr->symtree->name;
+
+ if (!name && se->loop && se->loop->ss && se->loop->ss->expr)
+ {
+ if (se->loop->ss->expr->expr_type == EXPR_FUNCTION
+ && se->loop->ss->expr->value.function.name)
+ name = se->loop->ss->expr->value.function.name;
+ else
+ if (se->loop->ss->type == GFC_SS_CONSTRUCTOR
+ || se->loop->ss->type == GFC_SS_SCALAR)
+ name = "unnamed constant";
+ }
+
/* Check lower bound. */
tmp = gfc_conv_array_lbound (descriptor, n);
fault = fold_build2 (LT_EXPR, boolean_type_node, index, tmp);
- if (se->ss)
+ if (name)
asprintf (&msg, "%s for array '%s', lower bound of dimension %d exceeded",
- gfc_msg_fault, se->ss->expr->symtree->name, n+1);
+ gfc_msg_fault, name, n+1);
else
asprintf (&msg, "%s, lower bound of dimension %d exceeded",
gfc_msg_fault, n+1);
@@ -1870,9 +1899,9 @@ gfc_trans_array_bound_check (gfc_se * se, tree descriptor, tree index, int n,
/* Check upper bound. */
tmp = gfc_conv_array_ubound (descriptor, n);
fault = fold_build2 (GT_EXPR, boolean_type_node, index, tmp);
- if (se->ss)
+ if (name)
asprintf (&msg, "%s for array '%s', upper bound of dimension %d exceeded",
- gfc_msg_fault, se->ss->expr->symtree->name, n+1);
+ gfc_msg_fault, name, n+1);
else
asprintf (&msg, "%s, upper bound of dimension %d exceeded",
gfc_msg_fault, n+1);
@@ -3904,7 +3933,7 @@ gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc, tree body)
tmp = fold_build2 (NE_EXPR, gfc_array_index_type, tmp, stride2);
asprintf (&msg, "%s for dimension %d of array '%s'",
gfc_msg_bounds, n+1, sym->name);
- gfc_trans_runtime_check (tmp, msg, &block, NULL);
+ gfc_trans_runtime_check (tmp, msg, &block, &loc);
gfc_free (msg);
}
}
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 9256e86..d284931 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -779,7 +779,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, int upper)
tmp = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))];
tmp = fold_build2 (GE_EXPR, boolean_type_node, bound, tmp);
cond = fold_build2 (TRUTH_ORIF_EXPR, boolean_type_node, cond, tmp);
- gfc_trans_runtime_check (cond, gfc_msg_fault, &se->pre, NULL);
+ gfc_trans_runtime_check (cond, gfc_msg_fault, &se->pre, &expr->where);
}
}