diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index aedec2cf78ec1be90c31a82aca734a1f803b34a2..a4897da6434bbbf1513ae87dd4e9bfc45e10fa0b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2005-07-14  Feng Wang  <fengwang@nudt.edu.cn>
+	Steven G. Kargl  <kargls@comcast.net>
+
+	* array.c (resolve_character_array_constructor): Allocate gfc_charlen
+	for the array and attach to namespace list for automatic deallocation.
+
 2005-07-13  Andreas Schwab  <schwab@suse.de>
 
 	* Make-lang.in (fortran/dependency.o): Depend on
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index dc65644f5e609ec706867b9a3aa05c91b73f1019..72b92a8368bd7f0f1aa214fe159cd2f1c95aab3d 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -1529,7 +1529,14 @@ resolve_character_array_constructor (gfc_expr * expr)
 
   max_length = -1;
 
-  if (expr->ts.cl == NULL || expr->ts.cl->length == NULL)
+  if (expr->ts.cl == NULL)
+    {
+      expr->ts.cl = gfc_get_charlen ();
+      expr->ts.cl->next = gfc_current_ns->cl_list;
+      gfc_current_ns->cl_list = expr->ts.cl;
+    }
+
+  if (expr->ts.cl->length == NULL)
     {
       /* Find the maximum length of the elements. Do nothing for variable array
 	 constructor.  */
@@ -1542,8 +1549,6 @@ resolve_character_array_constructor (gfc_expr * expr)
       if (max_length != -1)
 	{
 	  /* Update the character length of the array constructor.  */
-	  if (expr->ts.cl == NULL)
-	    expr->ts.cl = gfc_get_charlen ();
 	  expr->ts.cl->length = gfc_int_expr (max_length);
 	  /* Update the element constructors.  */
 	  for (p = expr->value.constructor; p; p = p->next)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e4682e59a915519330a018b28a2d88183b156639..1c94063bc1bd4899e764593db4f70f61e2ac16a2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-07-14  Steven G. Kargl  <kargls@comcast.net>
+
+	* gfortran.dg/char_array_constructor.f90: New test.
+
 2005-07-13  Paul Thomas  <pault@gcc.gnu.org>
 
 	* gfortran.dg/past_eor.f90: New.
diff --git a/gcc/testsuite/gfortran.dg/char_array_constructor.f90 b/gcc/testsuite/gfortran.dg/char_array_constructor.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0cb4d38bf039e35b592cb91f72cab056b1f57159
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_array_constructor.f90
@@ -0,0 +1,15 @@
+! { dg-do run }
+module z
+   integer :: i
+   character(6) :: a(2) = (/ ('main  ' , i = 1, 2) /)
+   character(6) :: b(2) = (/ 'abcd  ' , 'efghij' /)
+end module
+
+program y
+  use z
+  if (a(1) /= 'main  ') call abort
+  if (a(2) /= 'main  ') call abort
+  if (b(1) /= 'abcd  ') call abort
+  if (b(2) /= 'efghij') call abort
+end program y
+