2005-10-12 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Oct 2005 20:29:21 +0000 (20:29 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Oct 2005 20:29:21 +0000 (20:29 +0000)
PR fortran/18082
* decl.c (variable_decl): Make a new copy of the character
length for each variable, when the expression is not a
constant.

2005-10-12  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/18082
gfortran.dg/automatic_char_len_1.f90: New test.

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

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/automatic_char_len_1.f90 [new file with mode: 0755]

index 91acbf2..94e2418 100644 (file)
@@ -1,3 +1,10 @@
+2005-10-12  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/18082
+       * decl.c (variable_decl): Make a new copy of the character
+       length for each variable, when the expression is not a
+       constant.
+
 2005-10-12  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        * gfortran.h: Add bitmasks for different FPE traps. Add fpe
index 8c4ce58..20d1f8a 100644 (file)
@@ -900,7 +900,7 @@ gfc_match_null (gfc_expr ** result)
    symbol table or the current interface.  */
 
 static match
-variable_decl (void)
+variable_decl (int elem)
 {
   char name[GFC_MAX_SYMBOL_LEN + 1];
   gfc_expr *initializer, *char_len;
@@ -944,8 +944,20 @@ variable_decl (void)
          cl->length = char_len;
          break;
 
+       /* Non-constant lengths need to be copied after the first
+          element.  */
        case MATCH_NO:
-         cl = current_ts.cl;
+         if (elem > 1 && current_ts.cl->length
+               && current_ts.cl->length->expr_type != EXPR_CONSTANT)
+           {
+             cl = gfc_get_charlen ();
+             cl->next = gfc_current_ns->cl_list;
+             gfc_current_ns->cl_list = cl;
+             cl->length = gfc_copy_expr (current_ts.cl->length);
+           }
+         else
+           cl = current_ts.cl;
+
          break;
 
        case MATCH_ERROR:
@@ -1944,6 +1956,7 @@ gfc_match_data_decl (void)
 {
   gfc_symbol *sym;
   match m;
+  int elem;
 
   m = match_type_spec (&current_ts, 0);
   if (m != MATCH_YES)
@@ -1995,10 +2008,12 @@ ok:
   if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
     gfc_match_char (',');
 
-  /* Give the types/attributes to symbols that follow.  */
+  /* Give the types/attributes to symbols that follow. Give the element
+     a number so that repeat character length expressions can be copied.  */
+  elem = 1;
   for (;;)
     {
-      m = variable_decl ();
+      m = variable_decl (elem++);
       if (m == MATCH_ERROR)
        goto cleanup;
       if (m == MATCH_NO)
index 366ef0a..7abf169 100644 (file)
@@ -1,5 +1,10 @@
 2005-10-12  Paul Thomas  <pault@gcc.gnu.org>
 
+       PR fortran/18082
+       gfortran.dg/automatic_char_len_1.f90: New test.
+
+2005-10-12  Paul Thomas  <pault@gcc.gnu.org>
+
        PR fortran/20847
        gfortran.dg/save_common.f90: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/automatic_char_len_1.f90 b/gcc/testsuite/gfortran.dg/automatic_char_len_1.f90
new file mode 100755 (executable)
index 0000000..3ccfcb7
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR18082 - Compiler would get stuck in loop, whilst treating
+! the assignments.
+! Test is one of PR cases.
+subroutine snafu (i)
+character*(i) :: c1, c2
+c1 = ""
+c2 = ""
+end subroutine snafu
+
+