re PR fortran/15969 (ICE and assertion failure in trans-expr.c)
authorTobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
Sat, 10 Jul 2004 17:30:40 +0000 (19:30 +0200)
committerTobias Schlüter <tobi@gcc.gnu.org>
Sat, 10 Jul 2004 17:30:40 +0000 (19:30 +0200)
PR fortran/15969
* trans-expr.c (gfc_conv_structure): Handle initialization
of scalar pointer components.

From-SVN: r84464

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c

index c2551f219da6ac8ff7975bf1774212f70a273c5e..ded551cb2d67dc2b5ce33263ee5f5dcf4f26ea44 100644 (file)
@@ -6,6 +6,10 @@
        PR fortran/16336
        * match.c (match_common): Fix error reporting for used common.
 
+       PR fortran/15969
+       * trans-expr.c (gfc_conv_structure): Handle initialization
+       of scalar pointer components.
+
 2004-07-10  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * trans-common.c: Fix whitespace issues, make variable names
index 47a844d92d232ad6d08fbdd75946ca2ea9b0a5e3..5c62234660fc8779cc76652971c5f0f2075ba7b5 100644 (file)
@@ -1381,7 +1381,7 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
   tree type;
   tree arraytype;
 
-  assert (expr->expr_type == EXPR_STRUCTURE);
+  assert (expr->expr_type == EXPR_STRUCTURE || expr->expr_type == EXPR_NULL);
   type = gfc_typenode_for_spec (&expr->ts);
   head = build1 (CONSTRUCTOR, type, NULL_TREE);
   tail = NULL_TREE;
@@ -1397,15 +1397,32 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
       /* Evaluate the expression for this component.  */
       if (init)
        {
-         if (cm->dimension)
+         if (!cm->pointer)
            {
-             arraytype = TREE_TYPE (cm->backend_decl);
-             cse.expr = gfc_conv_array_initializer (arraytype, c->expr);
+             /* 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);
+
            }
-         else if (cm->ts.type == BT_DERIVED)
-           gfc_conv_structure (&cse, c->expr, 1);
          else
-           gfc_conv_expr (&cse, c->expr);
+           {
+             /* 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);
+           }
        }
       else
        {