________________________________________
From: Mikael Morin [mikael.mo...@sfr.fr]
Sent: Sunday, March 09, 2014 3:40 PM
To: Davis, Bud @ SSG - Link; gcc-patches@gcc.gnu.org; fort...@gcc.gnu.org
Subject: Re: patch fortran, pr 59746, internal compiler error : segmentation 
fault

   
> -      if (p->gfc_new)
 
>write this instead:
>if (p->attr.in_common && p->common_block && p->common_block->head
>    && (p->gfc_new || !p->old_symbol->attr.in_common))

>[p->attr.in_common is less likely than p->gfc_new which happens all the
>time; we may as well short-circuit the latter.]

Done.

>For the rest of the patch, there are indentation issues, any leading 8
>spaces block should be replaced with a tab.

Done.  All sequences of 8 spaces are replaced with a tab.

>You can use "contrib/check_GNU_style.sh your_patch" to check common
>style issues)

All issues fixed, except for test case lines, the 'dg error' lines are over 80 
columns.  A lot of the tests do this, I am guessing this violation is 
acceptable.

 
> +         if (p->common_block->head == p)
>I think the code block starting here is indented too much.

Fixed.

> +        if (p->gfc_new)
>Same here, the code after this shouldn't need reindenting.
 
Fixed.

>Mikael

Below is the revised patch.  Still passes the testsuite with no new failures.


regards,
Bud Davis





Index: gcc/gcc/testsuite/gfortran.dg/pr59746.f90
===================================================================
--- gcc/gcc/testsuite/gfortran.dg/pr59746.f90   (revision 0)
+++ gcc/gcc/testsuite/gfortran.dg/pr59746.f90   (revision 0)
@@ -0,0 +1,18 @@
+! { dg-do compile }
+!pr59746
+      CALL RCCFL (NVE,IR,NU3,VE (1,1,1,I))
+      COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+      COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+!  the PR only contained the two above.
+!  success is no segfaults or infinite loops.
+!  let's check some combinations
+     CALL ABC (INTG)
+     COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+     COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+     CALL DEF (NT1)
+     COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+     COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+     CALL GHI (NRESL)
+     COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+     COMMON /CCFILE/ INTG,NT1,NT2,NT3,NVM,NVE,NFRLE,NRESF,NRESL !{ dg-error 
"Unexpected COMMON" }
+     END
Index: gcc/gcc/fortran/symbol.c
===================================================================
--- gcc/gcc/fortran/symbol.c    (revision 208437)
+++ gcc/gcc/fortran/symbol.c    (working copy)
@@ -3069,56 +3069,56 @@
 
   FOR_EACH_VEC_ELT (latest_undo_chgset->syms, i, p)
     {
-      if (p->gfc_new)
+      /* Symbol was new.  Or was old and just put in common.  */
+      if ( p->attr.in_common && p->common_block && p->common_block->head
+          && (p->gfc_new || !p->old_symbol->attr.in_common))
        {
-         /* Symbol was new.  */
-         if (p->attr.in_common && p->common_block && p->common_block->head)
-           {
-             /* If the symbol was added to any common block, it
-                needs to be removed to stop the resolver looking
-                for a (possibly) dead symbol.  */
+         /* If the symbol was added to any common block, it
+         needs to be removed to stop the resolver looking
+         for a (possibly) dead symbol.  */
 
-             if (p->common_block->head == p && !p->common_next)
+         if (p->common_block->head == p && !p->common_next)
+           {
+             gfc_symtree st, *st0;
+             st0 = find_common_symtree (p->ns->common_root,
+                                        p->common_block);
+             if (st0)
                {
-                 gfc_symtree st, *st0;
-                 st0 = find_common_symtree (p->ns->common_root,
-                                            p->common_block);
-                 if (st0)
-                   {
-                     st.name = st0->name;
-                     gfc_delete_bbt (&p->ns->common_root, &st, 
compare_symtree);
-                     free (st0);
-                   }
+                 st.name = st0->name;
+                 gfc_delete_bbt (&p->ns->common_root, &st, compare_symtree);
+                 free (st0);
                }
+           }
 
-             if (p->common_block->head == p)
-               p->common_block->head = p->common_next;
-             else
-               {
-                 gfc_symbol *cparent, *csym;
+         if (p->common_block->head == p)
+           p->common_block->head = p->common_next;
+         else
+           {
+             gfc_symbol *cparent, *csym;
 
-                 cparent = p->common_block->head;
-                 csym = cparent->common_next;
+             cparent = p->common_block->head;
+             csym = cparent->common_next;
 
-                 while (csym != p)
-                   {
-                     cparent = csym;
-                     csym = csym->common_next;
-                   }
-
-                 gcc_assert(cparent->common_next == p);
-
-                 cparent->common_next = csym->common_next;
+             while (csym != p)
+               {
+                 cparent = csym;
+                 csym = csym->common_next;
                }
-           }
 
+             gcc_assert (cparent->common_next == p);
+             cparent->common_next = csym->common_next;
+           }
+       }
+      if (p->gfc_new)
+       {
          /* The derived type is saved in the symtree with the first
             letter capitalized; the all lower-case version to the
             derived type contains its associated generic function.  */
+
          if (p->attr.flavor == FL_DERIVED)
            gfc_delete_symtree (&p->ns->sym_root, gfc_get_string ("%c%s",
-                        (char) TOUPPER ((unsigned char) p->name[0]),
-                        &p->name[1]));
+                               (char) TOUPPER ((unsigned char) p->name[0]),
+                               &p->name[1]));
          else
            gfc_delete_symtree (&p->ns->sym_root, p->name);
 
@@ -3127,7 +3127,6 @@
       else
        restore_old_symbol (p);
     }
-
   latest_undo_chgset->syms.truncate (0);
   latest_undo_chgset->tbps.truncate (0);
 

 

Reply via email to