OSDN Git Service

2010-05-15 Janus Weil <janus@gcc.gnu.org>
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 May 2010 13:52:33 +0000 (13:52 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:08:57 +0000 (14:08 +0900)
PR fortran/43207
PR fortran/43969
* gfortran.h (gfc_class_null_initializer): New prototype.
* expr.c (gfc_class_null_initializer): New function to build a NULL
initializer for CLASS pointers.
* symbol.c (gfc_build_class_symbol): Modify internal naming of class
containers. Remove default NULL initialization of $data component.
* trans.c (gfc_allocate_array_with_status): Fix wording of an error
message.
* trans-expr.c (gfc_conv_initializer,gfc_trans_subcomponent_assign):
Use new function 'gfc_class_null_initializer'.
* trans-intrinsic.c (gfc_conv_allocated): Handle allocatable scalar
class variables.

2010-05-15  Janus Weil  <janus@gcc.gnu.org>

PR fortran/43207
PR fortran/43969
* gfortran.dg/class_18.f03: New.
* gfortran.dg/class_19.f03: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159431 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/gfortran.h
gcc/fortran/symbol.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog

index a95d16d..dd6d23f 100644 (file)
@@ -1,3 +1,19 @@
+2010-05-15  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/43207
+       PR fortran/43969
+       * gfortran.h (gfc_class_null_initializer): New prototype.
+       * expr.c (gfc_class_null_initializer): New function to build a NULL
+       initializer for CLASS pointers.
+       * symbol.c (gfc_build_class_symbol): Modify internal naming of class
+       containers. Remove default NULL initialization of $data component.
+       * trans.c (gfc_allocate_array_with_status): Fix wording of an error 
+       message.
+       * trans-expr.c (gfc_conv_initializer,gfc_trans_subcomponent_assign):
+       Use new function 'gfc_class_null_initializer'.
+       * trans-intrinsic.c (gfc_conv_allocated): Handle allocatable scalar
+       class variables.
+
 2010-05-14  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/44135
index 8230b46..382d1fe 100644 (file)
@@ -3628,6 +3628,32 @@ gfc_default_initializer (gfc_typespec *ts)
 }
 
 
+/* Build a NULL initializer for CLASS pointers,
+   initializing the $data and $vptr components to zero.  */
+
+gfc_expr *
+gfc_class_null_initializer (gfc_typespec *ts)
+{
+  gfc_expr *init;
+  gfc_component *comp;
+  
+  init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
+                                            &ts->u.derived->declared_at);
+  init->ts = *ts;
+  
+  for (comp = ts->u.derived->components; comp; comp = comp->next)
+    {
+      gfc_constructor *ctor = gfc_constructor_get();
+      ctor->expr = gfc_get_expr ();
+      ctor->expr->expr_type = EXPR_NULL;
+      ctor->expr->ts = comp->ts;
+      gfc_constructor_append (&init->value.constructor, ctor);
+    }
+
+  return init;
+}
+
+
 /* Given a symbol, create an expression node with that symbol as a
    variable. If the symbol is array valued, setup a reference of the
    whole array.  */
index 91c8b80..96acaa4 100644 (file)
@@ -2630,6 +2630,7 @@ gfc_try gfc_check_pointer_assign (gfc_expr *, gfc_expr *);
 gfc_try gfc_check_assign_symbol (gfc_symbol *, gfc_expr *);
 
 gfc_expr *gfc_default_initializer (gfc_typespec *);
+gfc_expr *gfc_class_null_initializer (gfc_typespec *);
 gfc_expr *gfc_get_variable_expr (gfc_symtree *);
 
 gfc_array_spec *gfc_get_full_arrayspec_from_expr (gfc_expr *expr);
index 8403578..ceb45bf 100644 (file)
@@ -4717,15 +4717,15 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
 
   /* Determine the name of the encapsulating type.  */
   if ((*as) && (*as)->rank && attr->allocatable)
-    sprintf (name, ".class.%s.%d.a", ts->u.derived->name, (*as)->rank);
+    sprintf (name, "class$%s_%d_a", ts->u.derived->name, (*as)->rank);
   else if ((*as) && (*as)->rank)
-    sprintf (name, ".class.%s.%d", ts->u.derived->name, (*as)->rank);
+    sprintf (name, "class$%s_%d", ts->u.derived->name, (*as)->rank);
   else if (attr->pointer)
-    sprintf (name, ".class.%s.p", ts->u.derived->name);
+    sprintf (name, "class$%s_p", ts->u.derived->name);
   else if (attr->allocatable)
-    sprintf (name, ".class.%s.a", ts->u.derived->name);
+    sprintf (name, "class$%s_a", ts->u.derived->name);
   else
-    sprintf (name, ".class.%s", ts->u.derived->name);
+    sprintf (name, "class$%s", ts->u.derived->name);
 
   gfc_find_symbol (name, ts->u.derived->ns, 0, &fclass);
   if (fclass == NULL)
@@ -4759,7 +4759,7 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
       c->attr.codimension = attr->codimension;
       c->attr.abstract = ts->u.derived->attr.abstract;
       c->as = (*as);
-      c->initializer = gfc_get_null_expr (NULL);
+      c->initializer = NULL;
 
       /* Add component '$vptr'.  */
       if (gfc_add_component (fclass, "$vptr", &c) == FAILURE)
index 47883e2..4d48c05 100644 (file)
@@ -3894,7 +3894,10 @@ gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
        case BT_DERIVED:
        case BT_CLASS:
          gfc_init_se (&se, NULL);
-         gfc_conv_structure (&se, expr, 1);
+         if (ts->type == BT_CLASS && expr->expr_type == EXPR_NULL)
+           gfc_conv_structure (&se, gfc_class_null_initializer(ts), 1);
+         else
+           gfc_conv_structure (&se, expr, 1);
          return se.expr;
 
        case BT_CHARACTER:
@@ -4202,7 +4205,7 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
     {
       /* NULL initialization for CLASS components.  */
       tmp = gfc_trans_structure_assign (dest,
-                                       gfc_default_initializer (&cm->ts));
+                                       gfc_class_null_initializer (&cm->ts));
       gfc_add_expr_to_block (&block, tmp);
     }
   else if (cm->attr.dimension)
index a813121..1e3d9c7 100644 (file)
@@ -1,3 +1,10 @@
+2010-05-15  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/43207
+       PR fortran/43969
+       * gfortran.dg/class_18.f03: New.
+       * gfortran.dg/class_19.f03: New.
+
 2010-05-14  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/44112