http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46838
janus at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2010.12.28 10:52:23
AssignedTo|unassigned at gcc dot |janus at gcc dot gnu.org
|gnu.org |
Summary|[OOP] Wrong allocation |[OOP] Initialization of
|status for polymorphic |polymorphic allocatable
|component INTENT(OUT) dummy |components
Ever Confirmed|0 |1
--- Comment #4 from janus at gcc dot gnu.org 2010-12-28 10:52:23 UTC ---
(In reply to comment #2)
> The default initializer is obtained via expr.c's gfc_default_initializer.
Indeed this is the place where things go wrong. Here's a patch:
Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c (revision 168277)
+++ gcc/fortran/expr.c (working copy)
@@ -3648,7 +3648,8 @@ gfc_default_initializer (gfc_typespec *ts)
/* See if we have a default initializer in this, but not in nested
types (otherwise we could use gfc_has_default_initializer()). */
for (comp = ts->u.derived->components; comp; comp = comp->next)
- if (comp->initializer || comp->attr.allocatable)
+ if (comp->initializer || comp->attr.allocatable
+ || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
break;
if (!comp)
@@ -3664,8 +3665,9 @@ gfc_default_initializer (gfc_typespec *ts)
if (comp->initializer)
ctor->expr = gfc_copy_expr (comp->initializer);
-
- if (comp->attr.allocatable)
+ else if (comp->attr.allocatable
+ || (comp->ts.type == BT_CLASS
+ && CLASS_DATA (comp)->attr.allocatable))
{
ctor->expr = gfc_get_expr ();
ctor->expr->expr_type = EXPR_NULL;
This fixes the test case in comment #1. However, I was not able to see a
failure with the test case in comment #0. Salvatore, can you check whether the
patch cures your troubles?