http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55763
--- Comment #11 from Tobias Burnus <burnus at gcc dot gnu.org> 2013-01-01
14:09:09 UTC ---
(In reply to comment #10)
> I have a simple case where CLASS(*) leads to an ICE.
> If it doesn't fit here, please feel free to move it elsewhere.
The segfault occurs for comp == "_extends" in gfc_default_initializer. The
problem is that comp->ts.type is BT_CLASS, which is not handled. As one has
CLASS(*), ts.u.derived == NULL, which breaks the following check:
if (comp->attr.allocatable
|| (comp->ts.type == BT_CLASS && CLASS_DATA
(comp)->attr.allocatable))
>From class.c's gfc_find_intrinsic_vtab
if (gfc_add_component (vtype, "_extends", &c) == FAILURE)
...
/* Avoid segfaults because due to character length. */
c->ts.type = ts->type == BT_CHARACTER ? BT_VOID : ts->type;
c->ts.kind = ts->kind;
Thus, either BT_CLASS shouldn't be used - or ts.u.derived has to be used.
By the way, class.c's gfc_find_derived_vtab uses the following if there is no
parent - or for unlimited polymorphic:
c->ts.type = BT_DERIVED;
c->ts.u.derived = vtype;
c->initializer = gfc_get_null_expr (NULL);