re PR fortran/18109 (ICE with explicit array of strings)
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 31 May 2005 17:19:11 +0000 (17:19 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 31 May 2005 17:19:11 +0000 (17:19 +0000)
2005-05-30  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/18109
PR fortran/18283
PR fortran/19107
* fortran/trans-array.c (gfc_conv_expr_descriptor): Obtain the
string length from the expression typespec character length value
and set temp_ss->stringlength and backend_decl. Obtain the
tree expression from gfc_conv_expr rather than gfc_conv_expr_val.
Dereference the expression to obtain the character.
* fortran/trans-expr.c (gfc_conv_component_ref): Remove the
dereference of scalar character pointer structure components.
* fortran/trans-expr.c (gfc_trans_subarray_assign): Obtain the
string length for the structure component from the component
expression.

From-SVN: r100400

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

index d2253328760c3716b16851c0997976dd3c1929c1..6ea04202d5a16cf1759711926cf9e1af00b60b53 100644 (file)
@@ -1,3 +1,19 @@
+2005-05-31  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/18109
+       PR fortran/18283
+       PR fortran/19107
+       * fortran/trans-array.c (gfc_conv_expr_descriptor): Obtain the
+       string length from the expression typespec character length value
+       and set temp_ss->stringlength and backend_decl. Obtain the
+       tree expression from gfc_conv_expr rather than gfc_conv_expr_val.
+       Dereference the expression to obtain the character.
+       * fortran/trans-expr.c (gfc_conv_component_ref): Remove the
+       dereference of scalar character pointer structure components.
+       * fortran/trans-expr.c (gfc_trans_subarray_assign): Obtain the
+       string length for the structure component from the component
+       expression.
+
 2005-05-30  Roger Sayle  <roger@eyesopen.com>
 
        * gfortran.h (GFC_STD_LEGACY): New "standard" macro.  Reindent.
index 047f8bcd7f1c36ce2fa360c3a812fa3c0dc3fbc0..fabbef99dc991ae53b4279eb978e70bc5ac3b871 100644 (file)
@@ -3616,12 +3616,23 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
       loop.temp_ss = gfc_get_ss ();
       loop.temp_ss->type = GFC_SS_TEMP;
       loop.temp_ss->next = gfc_ss_terminator;
-      loop.temp_ss->data.temp.type = gfc_typenode_for_spec (&expr->ts);
+      if (expr->ts.type == BT_CHARACTER)
+       {
+         gcc_assert (expr->ts.cl && expr->ts.cl->length
+                     && expr->ts.cl->length->expr_type == EXPR_CONSTANT);
+         loop.temp_ss->string_length = gfc_conv_mpz_to_tree
+                       (expr->ts.cl->length->value.integer,
+                        expr->ts.cl->length->ts.kind);
+         expr->ts.cl->backend_decl = loop.temp_ss->string_length;
+       }
+        loop.temp_ss->data.temp.type = gfc_typenode_for_spec (&expr->ts);
 
       /* ... which can hold our string, if present.  */
       if (expr->ts.type == BT_CHARACTER)
-       se->string_length = loop.temp_ss->string_length
-         = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type);
+       {
+         loop.temp_ss->string_length = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type);
+         se->string_length = loop.temp_ss->string_length;
+       }
       else
        loop.temp_ss->string_length = NULL;
       loop.temp_ss->data.temp.dimen = loop.dimen;
@@ -3653,7 +3664,13 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
       rse.ss = ss;
 
       gfc_conv_scalarized_array_ref (&lse, NULL);
-      gfc_conv_expr_val (&rse, expr);
+      if (expr->ts.type == BT_CHARACTER)
+       {
+         gfc_conv_expr (&rse, expr);
+         rse.expr = gfc_build_indirect_ref (rse.expr);
+       }
+      else
+        gfc_conv_expr_val (&rse, expr);
 
       gfc_add_block_to_block (&block, &rse.pre);
       gfc_add_block_to_block (&block, &lse.pre);
index cb6f167ff94b57bf0008813edeb730233beeec60..3d7dc726f38a8aa53ea44d69fc43a94284efded1 100644 (file)
@@ -281,7 +281,7 @@ gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
       se->string_length = tmp;
     }
 
-  if (c->pointer && c->dimension == 0)
+  if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER)
     se->expr = gfc_build_indirect_ref (se->expr);
 }
 
@@ -1671,6 +1671,9 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
   gfc_start_scalarized_body (&loop, &body);
 
   gfc_conv_tmp_array_ref (&lse);
+  if (cm->ts.type == BT_CHARACTER)
+    lse.string_length = cm->ts.cl->backend_decl;
+
   gfc_conv_expr (&rse, expr);
 
   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts.type);