[Patch, fortran] PR30554 - ICE in mio_pointer_ref at module.c:1945

Jerry DeLisle jvdelisle@verizon.net
Sun Jan 28 20:43:00 GMT 2007


Paul Thomas wrote:
> :ADDPATCH fortran:
> 
> I have been worrying at this one for a few minutes every day, since 
> Tobias posted it.  Since I had set myself the target of reforming 
> modules and introducing sub-modules, over the next few months, I thought 
> that there would be no hope of achieving these ambitions if I could not 
> fix this bug :-)
> 
> Fortunately for my self-esteem, Tobias had posted the key clue by 
> noticing that deleting the USE ATOMS in potential_energy cured the 
> fault.  Also, interchanging the USE statements does likewise.  Thus, 
> although the segfault occurs on writing the module, the problem is with 
> reading the modules that it uses.  Noting that it is a missing symtree 
> that causes the segfault, we right away suspect the reading of the 
> symtree entries from the module file.
> 
> It turns out that, since find_use_name_n returns NULL for a name that is 
> excluded from an ONLY clause, no check is made to see if there is an 
> existing symtree for this symbol.  If this check is not done, the 
> pointer_info gets marked as NEEDED but has no symtree attached to it.  
> This is cured by checking if there is a symtree associated with the 
> true_name and attaching that to the pointer_info.  Note that the symbol 
> cannot be ambiguous in this case because it did not appear in the ONLY 
> clause.
> 
> The testcase is that of the reporter and is not modified, apart from 
> being festooned with dejagnuery.
> 
> Bootstrapped and regtested on  ia64/FC5 - OK for trunk and, after a week 
> or two, for 4.2?
> 
> Paul
> 
> 
> ------------------------------------------------------------------------
> 
> 2007-01-28  Paul Thomas  <pault@gcc.gnu.org>
> 
> 	PR fortran/30554
> 	* module.c (read_module): If a symbol is excluded by an ONLY
> 	clause, check to see if there is a symtree already loaded. If
> 	so, attach the symtree to the pointer_info.
> 
> 2007-01-28  Paul Thomas  <pault@gcc.gnu.org>
> 
> 	PR fortran/30554
> 	* gfortran.dg/used_dummy_types_6.f90: New test.
> 
> 
> ------------------------------------------------------------------------
> 
> Index: gcc/fortran/module.c
> ===================================================================
> *** gcc/fortran/module.c	(revision 121234)
> --- gcc/fortran/module.c	(working copy)
> *************** read_module (void)
> *** 3394,3408 ****
>   	  /* Get the jth local name for this symbol.  */
>   	  p = find_use_name_n (name, &j);
>   
> ! 	  /* Skip symtree nodes not in an ONLY clause.  */
>   	  if (p == NULL)
> ! 	    continue;
>   
> - 	  /* Check for ambiguous symbols.  */
>   	  st = gfc_find_symtree (gfc_current_ns->sym_root, p);
>   
>   	  if (st != NULL)
>   	    {
>   	      if (st->n.sym != info->u.rsym.sym)
>   		st->ambiguous = 1;
>   	      info->u.rsym.symtree = st;
> --- 3394,3414 ----
>   	  /* Get the jth local name for this symbol.  */
>   	  p = find_use_name_n (name, &j);
>   
> ! 	  /* Skip symtree nodes not in an ONLY clause, unless there
> ! 	     is an existing symtree loaded from another USE.  */
>   	  if (p == NULL)
> ! 	    {
> ! 	      st = gfc_find_symtree (gfc_current_ns->sym_root, name);
> ! 	      if (st != NULL)
> ! 		info->u.rsym.symtree = st;
> ! 	      continue;
> ! 	    }
>   
>   	  st = gfc_find_symtree (gfc_current_ns->sym_root, p);
>   
>   	  if (st != NULL)
>   	    {
> + 	      /* Check for ambiguous symbols.  */
>   	      if (st->n.sym != info->u.rsym.sym)
>   		st->ambiguous = 1;
>   	      info->u.rsym.symtree = st;
> Index: gcc/testsuite/gfortran.dg/used_dummy_types_6.f90
> ===================================================================
> *** gcc/testsuite/gfortran.dg/used_dummy_types_6.f90	(revision 0)
> --- gcc/testsuite/gfortran.dg/used_dummy_types_6.f90	(revision 0)
> ***************
> *** 0 ****
> --- 1,25 ----
> + ! { dg-do compile }
> + ! Tests the fix for PR30554, the USE statements in potential_energy
> + ! would cause a segfault because the pointer_info for nfree coming
> + ! from constraint woul not find the existing symtree coming directly
> + ! from atom.
> + !
> + ! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
> + 
> + MODULE ATOMS
> + INTEGER :: NFREE = 0
> + END MODULE ATOMS
> + 
> + MODULE CONSTRAINT
> + USE ATOMS, ONLY: NFREE
> + CONTAINS
> +    SUBROUTINE ENERGY_CONSTRAINT ( HESSIAN )
> +    REAL , DIMENSION(1:(3*NFREE*(3*NFREE+1))/2):: HESSIAN
> +    END SUBROUTINE ENERGY_CONSTRAINT
> + END MODULE CONSTRAINT
> + 
> + MODULE POTENTIAL_ENERGY
> + USE ATOMS
> + USE CONSTRAINT,         ONLY : ENERGY_CONSTRAINT
> + END MODULE POTENTIAL_ENERGY
> + ! { dg-final { cleanup-modules "atoms constraint potential_energy" } }

This is OK for trunk and the usual wait for 4.2.

Jerry



More information about the Fortran mailing list