re PR fortran/33221 (Cannot declare variables of TYPE without components)
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Thu, 20 Sep 2007 22:03:22 +0000 (22:03 +0000)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Thu, 20 Sep 2007 22:03:22 +0000 (22:03 +0000)
PR fortran/33221

* gfortran.h (symbol_attribute): Add zero_comp field.
* symbol.c (gfc_use_derived): Handle case of emtpy derived types.
* decl.c (gfc_match_data_decl): Likewise.
(gfc_match_derived_decl): Likewise.
* module.c (ab_attribute, attr_bits): Add AB_ZERO_COMP member.
(mio_symbol_attribute): Write and read AB_ZERO_COMP.
* resolve.c (resolve_symbol): Handle case of emtpy derived types.
* parse.c (parse_derived): Likewise.

* gfortran.dg/used_types_18.f90: Declare variable of empty
derived type.

From-SVN: r128633

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/gfortran.h
gcc/fortran/module.c
gcc/fortran/parse.c
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/used_types_18.f90

index f3a65cd..5a81ebe 100644 (file)
@@ -1,5 +1,17 @@
 2007-09-20  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
+       PR fortran/33221
+       * gfortran.h (symbol_attribute): Add zero_comp field.
+       * symbol.c (gfc_use_derived): Handle case of emtpy derived types.
+       * decl.c (gfc_match_data_decl): Likewise.
+       (gfc_match_derived_decl): Likewise.
+       * module.c (ab_attribute, attr_bits): Add AB_ZERO_COMP member.
+       (mio_symbol_attribute): Write and read AB_ZERO_COMP.
+       * resolve.c (resolve_symbol): Handle case of emtpy derived types.
+       * parse.c (parse_derived): Likewise.
+
+2007-09-20  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
        PR fortran/33288
        * arith.c (reduce_unary, reduce_binary_ac, reduce_binary_ca,
        reduce_binary_aa): Call ourselves recursively if an element of
index f9f92ad..7fa8548 100644 (file)
@@ -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)
@@ -3426,7 +3427,8 @@ gfc_match_data_decl (void)
       /* Any symbol that we find had better be a type definition
         which has its components defined.  */
       if (sym != NULL && sym->attr.flavor == FL_DERIVED
-         && current_ts.derived->components != NULL)
+         && (current_ts.derived->components != NULL
+             || current_ts.derived->attr.zero_comp))
        goto ok;
 
       /* Now we have an error, which we signal, and then fix up
@@ -5884,7 +5886,7 @@ gfc_match_derived_decl (void)
       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
     return MATCH_ERROR;
 
-  if (sym->components != NULL)
+  if (sym->components != NULL || sym->attr.zero_comp)
     {
       gfc_error ("Derived type definition of '%s' at %C has already been "
                 "defined", sym->name);
index a5f4881..32b1561 100644 (file)
@@ -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 0b01ee4..3418afa 100644 (file)
@@ -1523,7 +1523,7 @@ typedef enum
   AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
   AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
   AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED,
-  AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT
+  AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP
 }
 ab_attribute;
 
@@ -1560,6 +1560,7 @@ static const mstring attr_bits[] =
     minit ("ALLOC_COMP", AB_ALLOC_COMP),
     minit ("POINTER_COMP", AB_POINTER_COMP),
     minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
+    minit ("ZERO_COMP", AB_ZERO_COMP),
     minit ("PROTECTED", AB_PROTECTED),
     minit ("ABSTRACT", AB_ABSTRACT),
     minit (NULL, -1)
@@ -1673,6 +1674,8 @@ mio_symbol_attribute (symbol_attribute *attr)
        MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
       if (attr->private_comp)
        MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
+      if (attr->zero_comp)
+       MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
 
       mio_rparen ();
 
@@ -1788,6 +1791,9 @@ mio_symbol_attribute (symbol_attribute *attr)
            case AB_PRIVATE_COMP:
              attr->private_comp = 1;
              break;
+           case AB_ZERO_COMP:
+             attr->zero_comp = 1;
+             break;
            }
        }
     }
index 50c0c0d..a6672f4 100644 (file)
@@ -1651,6 +1651,9 @@ parse_derived (void)
        }
     }
 
+  if (!seen_component)
+    sym->attr.zero_comp = 1;
+
   pop_state ();
 }
 
index 1b3aab6..26632bb 100644 (file)
@@ -7627,7 +7627,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 6ed366f..d6bd963 100644 (file)
@@ -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 ee10c4c..14fb1f3 100644 (file)
@@ -1,5 +1,11 @@
 2007-09-20  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
+       PR fortran/33221
+       * gfortran.dg/used_types_18.f90: Declare variable of empty
+       derived type.
+
+2007-09-20  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
        PR fortran/33288
        * gfortran.dg/array_constructor_19.f90: New test.