aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-02-10 16:10:53 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-02-10 16:10:53 +0100
commit45406a12e9b888ad287fd56f279591718ac2ac2b (patch)
tree788968a7abefcd803a6440b4971fa24d31ee8749 /gcc
parent92e8e53a31939ed5c4697c5e0a0b16af4a357bc3 (diff)
downloadgcc-45406a12e9b888ad287fd56f279591718ac2ac2b.zip
gcc-45406a12e9b888ad287fd56f279591718ac2ac2b.tar.gz
gcc-45406a12e9b888ad287fd56f279591718ac2ac2b.tar.bz2
re PR fortran/42309 (Problem with a pointer array passed to a subroutine)
PR fortran/42309 * trans-expr.c (gfc_conv_subref_array_arg): Avoid accessing info->dimen after info has been freed. From-SVN: r156659
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c6
2 files changed, 10 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a2a3c8b..0e562a8 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2010-02-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/42309
+ * trans-expr.c (gfc_conv_subref_array_arg): Avoid accessing
+ info->dimen after info has been freed.
+
2010-02-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/42999
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 4a70e73..5c3aa85 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -2311,6 +2311,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
tree size;
stmtblock_t body;
int n;
+ int dimen;
gcc_assert (expr->expr_type == EXPR_VARIABLE);
@@ -2439,9 +2440,10 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
outside the innermost loop, so the overall transfer could be
optimized further. */
info = &rse.ss->data.info;
+ dimen = info->dimen;
tmp_index = gfc_index_zero_node;
- for (n = info->dimen - 1; n > 0; n--)
+ for (n = dimen - 1; n > 0; n--)
{
tree tmp_str;
tmp = rse.loop->loopvar[n];
@@ -2508,7 +2510,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
{
size = gfc_index_one_node;
offset = gfc_index_zero_node;
- for (n = 0; n < info->dimen; n++)
+ for (n = 0; n < dimen; n++)
{
tmp = gfc_conv_descriptor_ubound_get (parmse->expr,
gfc_rank_cst[n]);