This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/69514] ICE with nested array constructor


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69514

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #5 from kargl at gcc dot gnu.org ---
(In reply to lkrupp from comment #4)
> This patch is a kludge.  I don't recommend it.  But it does fix at least one
> of the test cases, it passes the test suite, and it might point to a proper
> solution:
> 
> Index: arith.c
> ===================================================================
> --- arith.c     (revision 239966)
> +++ arith.c     (working copy)
> @@ -1326,7 +1326,21 @@ reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_e
>    for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
>      {
>        if (c->expr->expr_type == EXPR_CONSTANT)
> -       rc = eval (op1, c->expr, &r);
> +       {
> +         /* The conversion *should* be done only if necessary. */    
> +         gfc_expr temp;
> +
> +         temp.expr_type = EXPR_OP;
> +         gfc_clear_ts (&temp.ts);
> +
> +         temp.value.op.op = INTRINSIC_PLUS; /* Arbitrary */
> +         temp.value.op.op1 = op1;
> +         temp.value.op.op2 = c->expr;
> +
> +         gfc_type_convert_binary (&temp,
> +           warn_conversion || warn_conversion_extra);
> +
> +         rc = eval (op1, c->expr, &r);
> +       }
>        else
>         rc = reduce_binary_ca (eval, op1, c->expr, &r);

I agree the patch is a kludge. :-)

For a constructor with a typespec, gfortran should probably
walk the constructor and ensure type conversion for numeric
data types.  The patch does that.

Index: gcc/fortran/array.c
===================================================================
--- gcc/fortran/array.c (revision 239797)
+++ gcc/fortran/array.c (working copy)
@@ -1089,6 +1089,7 @@ match_array_cons_element (gfc_constructo
 match
 gfc_match_array_constructor (gfc_expr **result)
 {
+  gfc_constructor *c;
   gfc_constructor_base head, new_cons;
   gfc_undo_change_set changed_syms;
   gfc_expr *expr;
@@ -1194,8 +1195,6 @@ done:
         be converted.  See PR fortran/67803.  */
       if (ts.type == BT_CHARACTER)
        {
-         gfc_constructor *c;
-
          c = gfc_constructor_first (head);
          for (; c; c = gfc_constructor_next (c))
            {
@@ -1218,6 +1217,14 @@ done:
                }
            }
        }
+
+      /* Walk the constructor and ensure type conversion for numeric types. 
*/
+      if (gfc_numeric_ts (&ts))
+       {
+         c = gfc_constructor_first (head);
+         for (; c; c = gfc_constructor_next (c))
+           gfc_convert_type (c->expr, &ts, 1);
+       }
     }
   else
     expr = gfc_get_array_expr (BT_UNKNOWN, 0, &where);
Index: gcc/testsuite/gfortran.dg/pr69514.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr69514.f90       (nonexistent)
+++ gcc/testsuite/gfortran.dg/pr69514.f90       (working copy)
@@ -0,0 +1,5 @@
+! { dg-do run }
+program foo
+   real, parameter :: x(3) = 2.0 * [real :: 1, 2, 3 ]
+   if (any(x /= [2., 4., 6.])) call abort
+end program foo

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]