------- Comment #2 from fxcoudert at gcc dot gnu dot org  2007-09-18 08:26 
-------
This is because, in gfc_use_derived (symbol.c), when checking whether a derived
type is in the current unit or a parent unit, we check (sym->components !=
NULL) and if it's true, we take it to mean that the derived type was in a
parent unit (while, in fact, it's simply NULL because there *is* no component).
We need either a better test for the derived type being in the current scoping
unit, or a way to indicate a derived type without components other than setting
components to NULL.

One thing that comes to mind is the following patch. It allows derived types
with zero components to be accepted, but I fear that it might make us accept
invalid code with empty derived types outside the current scoping unit.



Index: symbol.c
===================================================================
--- symbol.c    (revision 128540)
+++ symbol.c    (working copy)
@@ -1703,7 +1703,7 @@ gfc_use_derived (gfc_symbol *sym)
   gfc_symtree *st;
   int i;

-  if (sym->components != NULL)
+  if (sym->components != NULL || sym->attr.zero_comp)
     return sym;               /* Already defined.  */

   if (sym->ns->parent == NULL)
Index: decl.c
===================================================================
--- decl.c      (revision 128540)
+++ decl.c      (working copy)
@@ -3414,7 +3414,8 @@ gfc_match_data_decl (void)
       goto cleanup;
     }

-  if (current_ts.type == BT_DERIVED && current_ts.derived->components == NULL)
+  if (current_ts.type == BT_DERIVED && current_ts.derived->components == NULL
+      && !current_ts.derived->attr.zero_comp)
     {

       if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
Index: gfortran.h
===================================================================
--- gfortran.h  (revision 128540)
+++ gfortran.h  (working copy)
@@ -650,8 +650,9 @@ typedef struct
   unsigned cray_pointer:1, cray_pointee:1;

   /* The symbol is a derived type with allocatable components, pointer 
-     components or private components, possibly nested.  */
-  unsigned alloc_comp:1, pointer_comp:1, private_comp:1;
+     components or private components, possibly nested.  zer_comp
+     is true if the derived type has no component at all.  */
+  unsigned alloc_comp:1, pointer_comp:1, private_comp:1, zero_comp:1;

   /* The namespace where the VOLATILE attribute has been set.  */
   struct gfc_namespace *volatile_ns;
Index: resolve.c
===================================================================
--- resolve.c   (revision 128540)
+++ resolve.c   (working copy)
@@ -7567,7 +7567,8 @@ resolve_symbol (gfc_symbol *sym)
      the type is not declared in the scope of the implicit
      statement. Change the type to BT_UNKNOWN, both because it is so
      and to prevent an ICE.  */
-  if (sym->ts.type == BT_DERIVED && sym->ts.derived->components == NULL)
+  if (sym->ts.type == BT_DERIVED && sym->ts.derived->components == NULL
+      && !sym->ts.derived->attr.zero_comp)
     {
       gfc_error ("The derived type '%s' at %L is of type '%s', "
                 "which has not been defined", sym->name,
Index: parse.c
===================================================================
--- parse.c     (revision 128540)
+++ parse.c     (working copy)
@@ -1651,6 +1651,9 @@ parse_derived (void)
        }
     }

+  if (!seen_component)
+    sym->attr.zero_comp = 1;
+
   pop_state ();
 }



-- 

fxcoudert at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |fxcoudert at gcc dot gnu dot
                   |                            |org


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

Reply via email to