re PR fortran/33221 (Cannot declare variables of TYPE without components)
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
This commit is contained in:
parent
4f68f111df
commit
9fa6b0af1f
9 changed files with 42 additions and 8 deletions
|
@ -1,3 +1,15 @@
|
|||
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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1651,6 +1651,9 @@ parse_derived (void)
|
|||
}
|
||||
}
|
||||
|
||||
if (!seen_component)
|
||||
sym->attr.zero_comp = 1;
|
||||
|
||||
pop_state ();
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -9,4 +9,7 @@
|
|||
!
|
||||
type t
|
||||
end type
|
||||
|
||||
type(t) :: a
|
||||
print *, a
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue