2006-11-09 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Nov 2006 22:49:12 +0000 (22:49 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Nov 2006 22:49:12 +0000 (22:49 +0000)
PR fortran/29431
* trans-array.c    (get_array_ctor_strlen): If we fall through to
default, use a constant character length if it is available.

2006-11-09 Paul Thomas <pault@gcc.gnu.org>

PR fortran/29431
* gfortran.dg/array_constructor_13.f90: New test.

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

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/array_constructor_13.f90 [new file with mode: 0644]

index 7b5afcf..76a31a6 100644 (file)
@@ -1,5 +1,11 @@
 2006-11-09 Paul Thomas <pault@gcc.gnu.org>
 
+       PR fortran/29431
+       * trans-array.c    (get_array_ctor_strlen): If we fall through to
+       default, use a constant character length if it is available.
+
+2006-11-09 Paul Thomas <pault@gcc.gnu.org>
+
        PR fortran/29744
        * trans-types.c (gfc_get_derived_type): Ensure that the
        proc_name namespace is not the same as the owner namespace and
index 75f3419..2a5b3b7 100644 (file)
@@ -1416,7 +1416,7 @@ get_array_ctor_strlen (gfc_constructor * c, tree * len)
 
        case EXPR_ARRAY:
          if (!get_array_ctor_strlen (c->expr->value.constructor, len))
-           is_const = FALSE;
+           is_const = false;
          break;
 
        case EXPR_VARIABLE:
@@ -1425,7 +1425,15 @@ get_array_ctor_strlen (gfc_constructor * c, tree * len)
          break;
 
        default:
-         is_const = FALSE;
+         is_const = false;
+
+         /* Hope that whatever we have possesses a constant character
+            length!  */
+         if (!(*len && INTEGER_CST_P (*len)) && c->expr->ts.cl)
+           {
+             gfc_conv_const_charlen (c->expr->ts.cl);
+             *len = c->expr->ts.cl->backend_decl;
+           }
          /* TODO: For now we just ignore anything we don't know how to
             handle, and hope we can figure it out a different way.  */
          break;
index d56bd04..298fd30 100644 (file)
@@ -1,5 +1,10 @@
 2006-11-09 Paul Thomas <pault@gcc.gnu.org>
 
+       PR fortran/29431
+       * gfortran.dg/array_constructor_13.f90: New test.
+
+2006-11-09 Paul Thomas <pault@gcc.gnu.org>
+
        PR fortran/29744
        * gfortran.dg/used_types_12.f90: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_13.f90 b/gcc/testsuite/gfortran.dg/array_constructor_13.f90
new file mode 100644 (file)
index 0000000..bacc6ff
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! Tests patch for PR29431, which arose from PR29373.
+!
+! Contributed by Tobias Schlueter  <tobi@gcc.gnu.org>
+!
+  implicit none
+  CHARACTER(len=6), DIMENSION(2,2)  :: a
+
+! Reporters original triggered another error:
+! gfc_todo: Not Implemented: complex character array
+! constructors.
+
+  a = reshape([to_string(1.0), trim("abcdef"), &
+               to_string(7.0), trim("hijklm")], &
+               [2, 2])
+  print *, a
+
+  CONTAINS
+    FUNCTION to_string(x)
+      character*6 to_string
+      REAL, INTENT(in) :: x
+      WRITE(to_string, FMT="(F6.3)") x
+    END FUNCTION
+end