trans-array.c (gfc_build_null_descriptor): New function.
authorPaul Brook <paul@codesourcery.com>
Sat, 10 Jul 2004 22:55:40 +0000 (22:55 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Sat, 10 Jul 2004 22:55:40 +0000 (22:55 +0000)
* trans-array.c (gfc_build_null_descriptor): New function.
(gfc_trans_static_array_pointer): Use it.
* trans-array.h (gfc_build_null_descriptor): Add prototype.
* trans-expr.c (gfc_conv_structure): Handle array pointers.
testsuite/
* gfortran.fortran-torture/execute/der_init_5.f90: Enable more tests.

From-SVN: r84477

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/fortran/trans-array.h
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/execute/der_init_5.f90

index 1b39762b9676b9cf7a4dd5193b3017d669b6dae9..813e7c0d400581cc3776ae6a43586c604cd74c58 100644 (file)
@@ -1,3 +1,10 @@
+2004-07-10  Paul Brook  <paul@codesourcery.com>
+
+       * trans-array.c (gfc_build_null_descriptor): New function.
+       (gfc_trans_static_array_pointer): Use it.
+       * trans-array.h (gfc_build_null_descriptor): Add prototype.
+       * trans-expr.c (gfc_conv_structure): Handle array pointers.
+
 2004-07-10  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
        
        PR fortran/16336
index 731fb193099863fae78d875cf2aa0b73fdef7925..62ecafe767dda0c24e80f5878e7499c05c20625d 100644 (file)
@@ -288,27 +288,26 @@ gfc_conv_descriptor_ubound (tree desc, tree dim)
 }
 
 
-/* Generate an initializer for a static pointer or allocatable array.  */
+/* Build an null array descriptor constructor.  */
 
-void
-gfc_trans_static_array_pointer (gfc_symbol * sym)
+tree
+gfc_build_null_descriptor (tree type)
 {
-  tree tmp;
   tree field;
-  tree type;
+  tree tmp;
 
-  assert (TREE_STATIC (sym->backend_decl));
-  /* Just zero the data member.  */
-  type = TREE_TYPE (sym->backend_decl);
   assert (GFC_DESCRIPTOR_TYPE_P (type));
   assert (DATA_FIELD == 0);
   field = TYPE_FIELDS (type);
 
+  /* Set a NULL data pointer.  */
   tmp = tree_cons (field, null_pointer_node, NULL_TREE);
   tmp = build1 (CONSTRUCTOR, type, tmp);
   TREE_CONSTANT (tmp) = 1;
   TREE_INVARIANT (tmp) = 1;
-  DECL_INITIAL (sym->backend_decl) = tmp;
+  /* All other fields are ignored.  */
+
+  return tmp;
 }
 
 
@@ -422,6 +421,20 @@ gfc_add_ss_to_loop (gfc_loopinfo * loop, gfc_ss * head)
 }
 
 
+/* Generate an initializer for a static pointer or allocatable array.  */
+
+void
+gfc_trans_static_array_pointer (gfc_symbol * sym)
+{
+  tree type;
+
+  assert (TREE_STATIC (sym->backend_decl));
+  /* Just zero the data member.  */
+  type = TREE_TYPE (sym->backend_decl);
+  DECL_INITIAL (sym->backend_decl) =gfc_build_null_descriptor (type);
+}
+
+
 /* Generate code to allocate an array temporary, or create a variable to
    hold the data.  */
 
index a78c04f4b049e76be872608715ff39f86fe8be1d..ee7db9beaee67362b8e59cf539c73701c1a19e2b 100644 (file)
@@ -73,6 +73,8 @@ void gfc_trans_scalarized_loop_boundary (gfc_loopinfo *, stmtblock_t *);
 void gfc_conv_loop_setup (gfc_loopinfo *);
 /* Resolve array assignment dependencies.  */
 void gfc_conv_resolve_dependencies (gfc_loopinfo *, gfc_ss *, gfc_ss *);
+/* Build an null array descriptor constructor.  */
+tree gfc_build_null_descriptor (tree);
 
 /* Get a single array element.  */
 void gfc_conv_array_ref (gfc_se *, gfc_array_ref *);
index 5c62234660fc8779cc76652971c5f0f2075ba7b5..a8412bdcf28119cf4025c46d3cb5c5519bbe2726 100644 (file)
@@ -1379,7 +1379,6 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
   tree val;
   gfc_se cse;
   tree type;
-  tree arraytype;
 
   assert (expr->expr_type == EXPR_STRUCTURE || expr->expr_type == EXPR_NULL);
   type = gfc_typenode_for_spec (&expr->ts);
@@ -1397,32 +1396,28 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
       /* Evaluate the expression for this component.  */
       if (init)
        {
-         if (!cm->pointer)
+         if (cm->dimension)
            {
-             /* Initializing a non-pointer element.  */
-             if (cm->dimension)
-               {
-                 arraytype = TREE_TYPE (cm->backend_decl);
-                 cse.expr = gfc_conv_array_initializer (arraytype, c->expr);
-               }
-             else if (cm->ts.type == BT_DERIVED)
-               gfc_conv_structure (&cse, c->expr, 1);
-             else
-               gfc_conv_expr (&cse, c->expr);
+             tree arraytype;
+             arraytype = TREE_TYPE (cm->backend_decl);
 
+             /* Arrays need special handling.  */
+             if (cm->pointer)
+               cse.expr = gfc_build_null_descriptor (arraytype);
+             else
+               cse.expr = gfc_conv_array_initializer (arraytype, c->expr);
            }
-         else
+         else if (cm->pointer)
            {
-             /* Pointer components may only be initialized to
-                NULL. This should have been enforced by the frontend.  */
-             if (cm->dimension)
-               {
-                 gfc_todo_error ("Initialization of pointer members");
-               }
-             else
-               cse.expr = fold_convert (TREE_TYPE (cm->backend_decl), 
-                                        null_pointer_node);
+             /* Pointer components may only be initialized to NULL.  */
+             assert (c->expr->expr_type == EXPR_NULL);
+             cse.expr = fold_convert (TREE_TYPE (cm->backend_decl), 
+                                      null_pointer_node);
            }
+         else if (cm->ts.type == BT_DERIVED)
+           gfc_conv_structure (&cse, c->expr, 1);
+         else
+           gfc_conv_expr (&cse, c->expr);
        }
       else
        {
index 7ae23fd8b288d4a3ba49830c73633e29954c15a8..497eca53383df5877a0c329ecc39a443622ca3ef 100644 (file)
@@ -1,3 +1,7 @@
+2004-07-10  Paul Brook  <paul@codesourcery.com>
+
+       * gfortran.fortran-torture/execute/der_init_5.f90: Enable more tests.
+
 2004-07-10  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/15969
index 22c0c33ba2f3577e9264cb4492ca94dcc166f396..c81d9260e557df410cb287e27a04199af0c4c748 100644 (file)
@@ -5,12 +5,12 @@ program der_init_5
   type t
      type(t), pointer :: a => NULL()
      real, pointer :: b => NULL()
-!     character, pointer :: c => NULL()
-!     integer, pointer, dimension(:) :: d => NULL()
+     character, pointer :: c => NULL()
+     integer, pointer, dimension(:) :: d => NULL()
   end type t
   type (t) :: p
   if (associated(p%a)) call abort()
   if (associated(p%b)) call abort()
 !  if (associated(p%c)) call abort()
-!  if (associated(p%d)) call abort()
+  if (associated(p%d)) call abort()
 end