diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr15129.f90 | 15 |
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 78c2537..2667cb8 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 24087c0..f7cfd97 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 69cd43e..bab2111 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..f9a277c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr15129.f90 @@ -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 |