Commit 9fa6b0af by Francois-Xavier Coudert Committed by François-Xavier Coudert

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
parent 4f68f111
2007-09-20 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 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 PR fortran/33288
* arith.c (reduce_unary, reduce_binary_ac, reduce_binary_ca, * arith.c (reduce_unary, reduce_binary_ac, reduce_binary_ca,
reduce_binary_aa): Call ourselves recursively if an element of reduce_binary_aa): Call ourselves recursively if an element of
......
...@@ -3414,7 +3414,8 @@ gfc_match_data_decl (void) ...@@ -3414,7 +3414,8 @@ gfc_match_data_decl (void)
goto cleanup; 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) if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
...@@ -3426,7 +3427,8 @@ gfc_match_data_decl (void) ...@@ -3426,7 +3427,8 @@ gfc_match_data_decl (void)
/* Any symbol that we find had better be a type definition /* Any symbol that we find had better be a type definition
which has its components defined. */ which has its components defined. */
if (sym != NULL && sym->attr.flavor == FL_DERIVED 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; goto ok;
/* Now we have an error, which we signal, and then fix up /* Now we have an error, which we signal, and then fix up
...@@ -5884,7 +5886,7 @@ gfc_match_derived_decl (void) ...@@ -5884,7 +5886,7 @@ gfc_match_derived_decl (void)
&& gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE) && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
return MATCH_ERROR; 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 " gfc_error ("Derived type definition of '%s' at %C has already been "
"defined", sym->name); "defined", sym->name);
......
...@@ -650,8 +650,9 @@ typedef struct ...@@ -650,8 +650,9 @@ typedef struct
unsigned cray_pointer:1, cray_pointee:1; unsigned cray_pointer:1, cray_pointee:1;
/* The symbol is a derived type with allocatable components, pointer /* The symbol is a derived type with allocatable components, pointer
components or private components, possibly nested. */ components or private components, possibly nested. zer_comp
unsigned alloc_comp:1, pointer_comp:1, private_comp:1; 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. */ /* The namespace where the VOLATILE attribute has been set. */
struct gfc_namespace *volatile_ns; struct gfc_namespace *volatile_ns;
......
...@@ -1523,7 +1523,7 @@ typedef enum ...@@ -1523,7 +1523,7 @@ typedef enum
AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT, AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT,
AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP, AB_CRAY_POINTER, AB_CRAY_POINTEE, AB_THREADPRIVATE, AB_ALLOC_COMP,
AB_POINTER_COMP, AB_PRIVATE_COMP, AB_VALUE, AB_VOLATILE, AB_PROTECTED, 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; ab_attribute;
...@@ -1560,6 +1560,7 @@ static const mstring attr_bits[] = ...@@ -1560,6 +1560,7 @@ static const mstring attr_bits[] =
minit ("ALLOC_COMP", AB_ALLOC_COMP), minit ("ALLOC_COMP", AB_ALLOC_COMP),
minit ("POINTER_COMP", AB_POINTER_COMP), minit ("POINTER_COMP", AB_POINTER_COMP),
minit ("PRIVATE_COMP", AB_PRIVATE_COMP), minit ("PRIVATE_COMP", AB_PRIVATE_COMP),
minit ("ZERO_COMP", AB_ZERO_COMP),
minit ("PROTECTED", AB_PROTECTED), minit ("PROTECTED", AB_PROTECTED),
minit ("ABSTRACT", AB_ABSTRACT), minit ("ABSTRACT", AB_ABSTRACT),
minit (NULL, -1) minit (NULL, -1)
...@@ -1673,6 +1674,8 @@ mio_symbol_attribute (symbol_attribute *attr) ...@@ -1673,6 +1674,8 @@ mio_symbol_attribute (symbol_attribute *attr)
MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits); MIO_NAME (ab_attribute) (AB_POINTER_COMP, attr_bits);
if (attr->private_comp) if (attr->private_comp)
MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits); MIO_NAME (ab_attribute) (AB_PRIVATE_COMP, attr_bits);
if (attr->zero_comp)
MIO_NAME (ab_attribute) (AB_ZERO_COMP, attr_bits);
mio_rparen (); mio_rparen ();
...@@ -1788,6 +1791,9 @@ mio_symbol_attribute (symbol_attribute *attr) ...@@ -1788,6 +1791,9 @@ mio_symbol_attribute (symbol_attribute *attr)
case AB_PRIVATE_COMP: case AB_PRIVATE_COMP:
attr->private_comp = 1; attr->private_comp = 1;
break; break;
case AB_ZERO_COMP:
attr->zero_comp = 1;
break;
} }
} }
} }
......
...@@ -1651,6 +1651,9 @@ parse_derived (void) ...@@ -1651,6 +1651,9 @@ parse_derived (void)
} }
} }
if (!seen_component)
sym->attr.zero_comp = 1;
pop_state (); pop_state ();
} }
......
...@@ -7627,7 +7627,8 @@ resolve_symbol (gfc_symbol *sym) ...@@ -7627,7 +7627,8 @@ resolve_symbol (gfc_symbol *sym)
the type is not declared in the scope of the implicit the type is not declared in the scope of the implicit
statement. Change the type to BT_UNKNOWN, both because it is so statement. Change the type to BT_UNKNOWN, both because it is so
and to prevent an ICE. */ 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', " gfc_error ("The derived type '%s' at %L is of type '%s', "
"which has not been defined", sym->name, "which has not been defined", sym->name,
......
...@@ -1703,7 +1703,7 @@ gfc_use_derived (gfc_symbol *sym) ...@@ -1703,7 +1703,7 @@ gfc_use_derived (gfc_symbol *sym)
gfc_symtree *st; gfc_symtree *st;
int i; int i;
if (sym->components != NULL) if (sym->components != NULL || sym->attr.zero_comp)
return sym; /* Already defined. */ return sym; /* Already defined. */
if (sym->ns->parent == NULL) if (sym->ns->parent == NULL)
......
2007-09-20 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 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 PR fortran/33288
* gfortran.dg/array_constructor_19.f90: New test. * gfortran.dg/array_constructor_19.f90: New test.
...@@ -9,4 +9,7 @@ ...@@ -9,4 +9,7 @@
! !
type t type t
end type end type
type(t) :: a
print *, a
end end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment