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
This commit is contained in:
Tobias Schlüter 2004-07-15 20:43:50 +02:00 committed by Tobias Schlüter
parent fdb510e7d6
commit d157d97822
4 changed files with 43 additions and 1 deletions

View File

@ -1,3 +1,9 @@
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

View 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);

View 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.

View File

@ -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