diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7b5afcf36ee73befc24e02f47744e4a229417842..76a31a6f93f0e99f94fa19a9838633a8b3d25933 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 75f34198a0ffa77db6876bb53c6b7c1c5ad9fa6e..2a5b3b72e1398d907fb3eaf743c8977b69b933fa 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d56bd0420817d0d7c5ab167fc3e94bfce8e8d641..298fd305084112904d5b2b0cf5dcd01f14d6f575 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_13.f90 b/gcc/testsuite/gfortran.dg/array_constructor_13.f90
new file mode 100644
index 0000000000000000000000000000000000000000..bacc6fffc38f0c1aad254df1cb83da12dac79738
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_constructor_13.f90
@@ -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