Commit 110eec24 by Tobias Schlüter Committed by Tobias Schlüter

re PR fortran/18990 (ICE in gfc_get_derived_type, at fortran/trans-types.c)

fortran/
	PR fortran/18990
	* gfortran.h (gfc_charlen): Add resolved field.
	* expr.c (gfc_specification_expr): Accept NULL argument.
	* resolve.c (gfc_resolve_charlen, gfc_resolve_derived): New.
	(gfc_resolve_symbol): Resolve derived type definitions.  Use
	resolve_charlen to resolve character lengths.
testsuite/
	PR fortran/18990
	* gfortran.dg/der_charlen_1.f90: New.

From-SVN: r108946
parent e0e85e06
2005-12-22 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/18990
* gfortran.h (gfc_charlen): Add resolved field.
* expr.c (gfc_specification_expr): Accept NULL argument.
* resolve.c (gfc_resolve_charlen, gfc_resolve_derived): New.
(gfc_resolve_symbol): Resolve derived type definitions. Use
resolve_charlen to resolve character lengths.
2005-12-22 Paul Thomas <pault@gcc.gnu.org> 2005-12-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/20889 PR fortran/20889
......
...@@ -1768,6 +1768,8 @@ check_restricted (gfc_expr * e) ...@@ -1768,6 +1768,8 @@ check_restricted (gfc_expr * e)
try try
gfc_specification_expr (gfc_expr * e) gfc_specification_expr (gfc_expr * e)
{ {
if (e == NULL)
return SUCCESS;
if (e->ts.type != BT_INTEGER) if (e->ts.type != BT_INTEGER)
{ {
......
...@@ -571,6 +571,8 @@ typedef struct gfc_charlen ...@@ -571,6 +571,8 @@ typedef struct gfc_charlen
struct gfc_expr *length; struct gfc_expr *length;
struct gfc_charlen *next; struct gfc_charlen *next;
tree backend_decl; tree backend_decl;
int resolved;
} }
gfc_charlen; gfc_charlen;
......
...@@ -4328,6 +4328,60 @@ resolve_values (gfc_symbol * sym) ...@@ -4328,6 +4328,60 @@ resolve_values (gfc_symbol * sym)
} }
/* Resolve a charlen structure. */
static try
resolve_charlen (gfc_charlen *cl)
{
if (cl->resolved)
return SUCCESS;
cl->resolved = 1;
if (gfc_resolve_expr (cl->length) == FAILURE)
return FAILURE;
if (gfc_simplify_expr (cl->length, 0) == FAILURE)
return FAILURE;
if (gfc_specification_expr (cl->length) == FAILURE)
return FAILURE;
return SUCCESS;
}
/* Resolve the components of a derived type. */
static try
resolve_derived (gfc_symbol *sym)
{
gfc_component *c;
for (c = sym->components; c != NULL; c = c->next)
{
if (c->ts.type == BT_CHARACTER)
{
if (resolve_charlen (c->ts.cl) == FAILURE)
return FAILURE;
if (c->ts.cl->length == NULL
|| !gfc_is_constant_expr (c->ts.cl->length))
{
gfc_error ("Character length of component '%s' needs to "
"be a constant specification expression at %L.",
c->name,
c->ts.cl->length ? &c->ts.cl->length->where : &c->loc);
return FAILURE;
}
}
/* TODO: Anything else that should be done here? */
}
return SUCCESS;
}
/* Do anything necessary to resolve a symbol. Right now, we just /* Do anything necessary to resolve a symbol. Right now, we just
assume that an otherwise unknown symbol is a variable. This sort assume that an otherwise unknown symbol is a variable. This sort
of thing commonly happens for symbols in module. */ of thing commonly happens for symbols in module. */
...@@ -4380,6 +4434,9 @@ resolve_symbol (gfc_symbol * sym) ...@@ -4380,6 +4434,9 @@ resolve_symbol (gfc_symbol * sym)
} }
} }
if (sym->attr.flavor == FL_DERIVED && resolve_derived (sym) == FAILURE)
return;
/* Symbols that are module procedures with results (functions) have /* Symbols that are module procedures with results (functions) have
the types and array specification copied for type checking in the types and array specification copied for type checking in
procedures that call them, as well as for saving to a module procedures that call them, as well as for saving to a module
...@@ -5588,16 +5645,7 @@ gfc_resolve (gfc_namespace * ns) ...@@ -5588,16 +5645,7 @@ gfc_resolve (gfc_namespace * ns)
gfc_check_interfaces (ns); gfc_check_interfaces (ns);
for (cl = ns->cl_list; cl; cl = cl->next) for (cl = ns->cl_list; cl; cl = cl->next)
{ resolve_charlen (cl);
if (cl->length == NULL || gfc_resolve_expr (cl->length) == FAILURE)
continue;
if (gfc_simplify_expr (cl->length, 0) == FAILURE)
continue;
if (gfc_specification_expr (cl->length) == FAILURE)
continue;
}
gfc_traverse_ns (ns, resolve_values); gfc_traverse_ns (ns, resolve_values);
......
2005-12-22 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/18990
* gfortran.dg/der_charlen_1.f90: New.
2005-12-22 Paul Thomas <pault@gcc.gnu.org> 2005-12-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/20889 PR fortran/20889
! { dg-do compile }
! PR 18990
! we used to ICE on these examples
module core
type, public :: T
character(len=I) :: str ! { dg-error "needs to be a constant specification expression" }
end type T
private
CONTAINS
subroutine FOO(X)
type(T), intent(in) :: X
end subroutine
end module core
module another_core
type :: T
character(len=*) :: s ! { dg-error "needs to be a constant specification expr" }
end type T
private
CONTAINS
subroutine FOO(X)
type(T), intent(in) :: X
end subroutine
end module another_core
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