This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]