fortran/
authortobi <tobi@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Jul 2004 18:43:50 +0000 (18:43 +0000)
committertobi <tobi@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Jul 2004 18:43:50 +0000 (18:43 +0000)
PR fortran/15129
* trans-decl.c (gfc_build_function_decl): Create a new chardecl
for every assumed length character dummy argument.

testsuite/
PR fortran/15129
* gfortran.dg/pr15129.f90: New test.

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

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

index 78c2537..2667cb8 100644 (file)
@@ -1,5 +1,11 @@
 2004-07-15  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
+       PR fortran/15129
+       * trans-decl.c (gfc_build_function_decl): Create a new chardecl
+       for every assumed length character dummy argument.
+
+2004-07-15  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
+
        PR fortran/15324
        * trans-array.c gfc_trans_g77_array,
        gfc_trans_dummy_array_bias): Don't call gfc_trans_string_init
index 24087c0..f7cfd97 100644 (file)
@@ -1180,7 +1180,25 @@ gfc_build_function_decl (gfc_symbol * sym)
           if (!f->sym->ts.cl->length)
            {
              TREE_USED (length) = 1;
-             f->sym->ts.cl->backend_decl = length;
+             if (!f->sym->ts.cl->backend_decl)
+               f->sym->ts.cl->backend_decl = length;
+             else
+               {
+                 /* there is already another variable using this
+                    gfc_charlen node, build a new one for this variable
+                    and chain it into the list of gfc_charlens.
+                    This happens for e.g. in the case
+                    CHARACTER(*)::c1,c2
+                    since CHARACTER declarations on the same line share
+                    the same gfc_charlen node.  */
+                 gfc_charlen *cl;
+                 
+                 cl = gfc_get_charlen ();
+                 cl->backend_decl = length;
+                 cl->next = f->sym->ts.cl->next;
+                 f->sym->ts.cl->next = cl;
+                 f->sym->ts.cl = cl;
+               }
            }
 
           parm = TREE_CHAIN (parm);
index 69cd43e..bab2111 100644 (file)
@@ -3,6 +3,9 @@
        PR fortran/15324
        * gfortran.dg/pr15324.f90: New test.
 
+       PR fortran/15129
+       * gfortran.dg/pr15129.f90: New test.
+
 2004-07-14  Mike Stump  <mrs@apple.com>
 
        * gcc.dg/20020426-2.c: Improve type safety wrt unsignedness.
diff --git a/gcc/testsuite/gfortran.dg/pr15129.f90 b/gcc/testsuite/gfortran.dg/pr15129.f90
new file mode 100644 (file)
index 0000000..f9a277c
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do run }
+! PR 15129: we used to share the character length between A and B in the 
+! subroutine.
+CHARACTER*10 A
+CHARACTER*8 B
+A = 'gfortran'
+B = 'rocks!'
+CALL T(A,B)
+contains
+SUBROUTINE T(A,B)
+CHARACTER*(*) A,B
+if(len(a)/=10) call abort()
+if(len(b)/=8) call abort()
+END SUBROUTINE
+end