From: Tobias Schlüter Date: Thu, 15 Jul 2004 18:43:50 +0000 (+0200) Subject: re PR fortran/15129 (assumed size characters passed to subroutines incorrect) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d157d9782201b9cd3b795add94e350506bc7d7e6;p=gcc.git re PR fortran/15129 (assumed size characters passed to subroutines incorrect) fortran/ 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. From-SVN: r84769 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 78c2537dea2..2667cb83160 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2004-07-15 Tobias Schlueter + + 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 PR fortran/15324 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 24087c07b88..f7cfd9785ca 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 69cd43e3afc..bab21110c6d 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 * 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 00000000000..f9a277cb7e8 --- /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