------- Comment #4 from janus at gcc dot gnu dot org  2008-05-29 20:06 -------
Here is a first attempt to fix this. The following patch should cope with the
original test case and the one in comment #1. The fix for the POINTER issues
will go into my procedure pointer patch. Any other attributes we need to
handle?


Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c        (revision 136137)
+++ gcc/fortran/symbol.c        (working copy)
@@ -814,6 +814,14 @@ gfc_add_allocatable (symbol_attribute *a
       return FAILURE;
     }

+  if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
+      && gfc_find_state (COMP_INTERFACE) == FAILURE)
+    {
+      gfc_error ("Attribute ALLOCATABLE declared outside of INTERFACE "
+                "body at %L", where);
+      return FAILURE;
+    }
+
   attr->allocatable = 1;
   return check_conflict (attr, NULL, where);
 }
@@ -832,6 +840,14 @@ gfc_add_dimension (symbol_attribute *att
       return FAILURE;
     }

+  if (attr->flavor == FL_PROCEDURE && attr->if_source == IFSRC_IFBODY
+      && gfc_find_state (COMP_INTERFACE) == FAILURE)
+    {
+      gfc_error ("Attribute DIMENSION of %s declared outside of INTERFACE "
+                "body at %L", name, where);
+      return FAILURE;
+    }
+
   attr->dimension = 1;
   return check_conflict (attr, name, where);
 }
@@ -1453,6 +1469,13 @@ gfc_add_explicit_interface (gfc_symbol *
       return FAILURE;
     }

+  if (source == IFSRC_IFBODY && (sym->attr.dimension ||
sym->attr.allocatable))
+    {
+      gfc_error ("Attribute declared outside of INTERFACE body for %s at %L",
+                sym->name, where);
+      return FAILURE;
+    }
+
   sym->formal = formal;
   sym->attr.if_source = source;

Index: gcc/fortran/parse.c
===================================================================
--- gcc/fortran/parse.c (revision 136137)
+++ gcc/fortran/parse.c (working copy)
@@ -1915,8 +1915,13 @@ loop:

     case ST_SUBROUTINE:
       new_state = COMP_SUBROUTINE;
-      gfc_add_explicit_interface (gfc_new_block, IFSRC_IFBODY,
-                                 gfc_new_block->formal, NULL);
+      if (gfc_add_explicit_interface (gfc_new_block, IFSRC_IFBODY,
+                                 gfc_new_block->formal, NULL) == FAILURE)
+       {
+         reject_statement ();
+         gfc_free_namespace (gfc_current_ns);
+         goto loop;
+       }
       if (current_interface.type != INTERFACE_ABSTRACT &&
         !gfc_new_block->attr.dummy &&
         gfc_add_external (&gfc_new_block->attr, &gfc_current_locus) ==
FAILURE)
@@ -1929,8 +1934,13 @@ loop:

     case ST_FUNCTION:
       new_state = COMP_FUNCTION;
-      gfc_add_explicit_interface (gfc_new_block, IFSRC_IFBODY,
-                                 gfc_new_block->formal, NULL);
+      if (gfc_add_explicit_interface (gfc_new_block, IFSRC_IFBODY,
+                                 gfc_new_block->formal, NULL) == FAILURE)
+       {
+         reject_statement ();
+         gfc_free_namespace (gfc_current_ns);
+         goto loop;
+       }
       if (current_interface.type != INTERFACE_ABSTRACT &&
         !gfc_new_block->attr.dummy &&
         gfc_add_external (&gfc_new_block->attr, &gfc_current_locus) ==
FAILURE)


-- 

janus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |janus at gcc dot gnu dot org
                   |dot org                     |
             Status|NEW                         |ASSIGNED
   Last reconfirmed|2008-05-28 22:23:43         |2008-05-29 20:06:26
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36361

Reply via email to