This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[patch, fortran] PR32432 SEGV/endless loop after: "ERROR: ... already is initialized"
- From: Jerry DeLisle <jvdelisle at verizon dot net>
- To: Fortran List <fortran at gcc dot gnu dot org>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 02 Jul 2007 22:24:17 -0700
- Subject: [patch, fortran] PR32432 SEGV/endless loop after: "ERROR: ... already is initialized"
:ADDPATCH fortran:
Hi,
This patch fixes this by returning SUCCESS or FAILURE to the caller to allow
breaking out of the loop.
Fairly self explanatory.
Regression tested on x86-64-Gnu/Linux.
OK for trunk?
This clears of data_initialized_2.f90, no new test case needed.
Regards,
Jerry
2007-07-02 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/32432
* gfortran.h: Change type of gfc_assign_data_value from void to try.
* data.c (gfc_assign_data_value): Return FAILURE if error found.
* resolve.c (check_data_variable): If gfc_assign_data_value returns
failure, break out of loop and return failure.
Index: gfortran.h
===================================================================
*** gfortran.h (revision 126242)
--- gfortran.h (working copy)
*************** extern iterator_stack *iter_stack;
*** 1897,1903 ****
/* data.c */
void gfc_formalize_init_value (gfc_symbol *);
void gfc_get_section_index (gfc_array_ref *, mpz_t *, mpz_t *);
! void gfc_assign_data_value (gfc_expr *, gfc_expr *, mpz_t);
void gfc_assign_data_value_range (gfc_expr *, gfc_expr *, mpz_t, mpz_t);
void gfc_advance_section (mpz_t *, gfc_array_ref *, mpz_t *);
--- 1897,1903 ----
/* data.c */
void gfc_formalize_init_value (gfc_symbol *);
void gfc_get_section_index (gfc_array_ref *, mpz_t *, mpz_t *);
! try gfc_assign_data_value (gfc_expr *, gfc_expr *, mpz_t);
void gfc_assign_data_value_range (gfc_expr *, gfc_expr *, mpz_t, mpz_t);
void gfc_advance_section (mpz_t *, gfc_array_ref *, mpz_t *);
Index: data.c
===================================================================
*** data.c (revision 126242)
--- data.c (working copy)
*************** create_character_intializer (gfc_expr *i
*** 245,251 ****
LVALUE already has an initialization, we extend this, otherwise we
create a new one. */
! void
gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index)
{
gfc_ref *ref;
--- 245,251 ----
LVALUE already has an initialization, we extend this, otherwise we
create a new one. */
! try
gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index)
{
gfc_ref *ref;
*************** gfc_assign_data_value (gfc_expr *lvalue,
*** 259,270 ****
--- 259,272 ----
mpz_t offset;
splay_tree spt;
splay_tree_node sptn;
+ try t;
symbol = lvalue->symtree->n.sym;
init = symbol->value;
last_ts = &symbol->ts;
last_con = NULL;
mpz_init_set_si (offset, 0);
+ t = SUCCESS;
/* Find/create the parent expressions for subobject references. */
for (ref = lvalue->ref; ref; ref = ref->next)
*************** gfc_assign_data_value (gfc_expr *lvalue,
*** 293,300 ****
gfc_error ("'%s' at %L already is initialized at %L",
lvalue->symtree->n.sym->name, &lvalue->where,
&init->where);
! gfc_free_expr (init);
! init = NULL;
}
if (init == NULL)
--- 295,301 ----
gfc_error ("'%s' at %L already is initialized at %L",
lvalue->symtree->n.sym->name, &lvalue->where,
&init->where);
! return FAILURE;
}
if (init == NULL)
*************** gfc_assign_data_value (gfc_expr *lvalue,
*** 423,428 ****
--- 424,431 ----
symbol->value = expr;
else
last_con->expr = expr;
+
+ return t;
}
Index: resolve.c
===================================================================
*** resolve.c (revision 126242)
--- resolve.c (working copy)
*************** check_data_variable (gfc_data_variable *
*** 7415,7421 ****
values.left -= 1;
mpz_sub_ui (size, size, 1);
! gfc_assign_data_value (var->expr, values.vnode->expr, offset);
if (mark == AR_FULL)
mpz_add_ui (offset, offset, 1);
--- 7415,7423 ----
values.left -= 1;
mpz_sub_ui (size, size, 1);
! t = gfc_assign_data_value (var->expr, values.vnode->expr, offset);
! if (t == FAILURE)
! break;
if (mark == AR_FULL)
mpz_add_ui (offset, offset, 1);