summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2006-11-09 22:49:12 +0000
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2006-11-09 22:49:12 +0000
commite2a3789bfec81eec91751bd367984c80d235eeb8 (patch)
treebed8c70b70d83314600842c219fac7804ddc3afa
parentdc2942ef6cdd1a96457764d079425d01e5cd3f6c (diff)
downloadgcc-e2a3789bfec81eec91751bd367984c80d235eeb8.tar.gz
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/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
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-array.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/array_constructor_13.f9024
4 files changed, 45 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7b5afcf36ee..76a31a6f93f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 75f34198a0f..2a5b3b72e13 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 d56bd042081..298fd305084 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..bacc6fffc38
--- /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