------- Comment #4 from paul dot richard dot thomas at cea dot fr 2005-11-10 10:32 ------- I have a patch for this, which is regtesting now and will be submitted at lunchtime.
Apologies for letting this regression through; please give the patch a try. Paul T Index: gcc/gcc/fortran/match.c =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/fortran/match.c,v retrieving revision 1.47 diff -c -p -r1.47 match.c *** gcc/gcc/fortran/match.c 17 Oct 2005 20:52:36 -0000 1.47 --- gcc/gcc/fortran/match.c 10 Nov 2005 10:29:15 -0000 *************** recursive_stmt_fcn (gfc_expr *e, gfc_sym *** 2721,2727 **** if (sym->name == arg->name || recursive_stmt_fcn (arg->expr, sym)) return true; ! } /* Check the name before testing for nested recursion! */ if (sym->name == e->symtree->n.sym->name) --- 2721,2730 ---- if (sym->name == arg->name || recursive_stmt_fcn (arg->expr, sym)) return true; ! } ! ! if (e->symtree == NULL) ! return false; /* Check the name before testing for nested recursion! */ if (sym->name == e->symtree->n.sym->name) *************** recursive_stmt_fcn (gfc_expr *e, gfc_sym *** 2736,2742 **** break; case EXPR_VARIABLE: ! if (sym->name == e->symtree->n.sym->name) return true; break; --- 2739,2745 ---- break; case EXPR_VARIABLE: ! if (e->symtree && sym->name == e->symtree->n.sym->name) return true; break; Index: gcc/gcc/testsuite/gfortran.dg/recursive_statement_functions.f90 =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/testsuite/gfortran.dg/recursive_statement_functions.f90,v retrieving revision 1.1 diff -c -p -r1.1 recursive_statement_functions.f90 *** gcc/gcc/testsuite/gfortran.dg/recursive_statement_functions.f90 17 Oct 2005 20:52:37 -0000 1.1 --- gcc/gcc/testsuite/gfortran.dg/recursive_statement_functions.f90 10 Nov 2005 10:28:58 -0000 *************** *** 1,16 **** ! { dg-do compile } ! PR20866 - A statement function cannot be recursive. ! Contributed by Joost VandeVondele <[EMAIL PROTECTED]> ! INTEGER :: i, st1, st2, st3 REAL :: x, z(2,2) ! character*8 :: ch ! ! Test check for recursion via other statement functions, string ! length references, function actual arguments and array index ! references. ! st1(i)=len(ch(st2(1):8)) ! st2(i)=max (st3(1), 4) ! st3(i)=2 + cos (z(st1 (1), i)) ! { dg-error "is recursive" } ! write(6,*) st1(1) END --- 1,32 ---- ! { dg-do compile } ! PR20866 - A statement function cannot be recursive. ! Contributed by Joost VandeVondele <[EMAIL PROTECTED]> ! ! ! ! Modified 20051110 to check that regressions PR24655 and PR24755 ! ! are fixed. Thanks to [EMAIL PROTECTED] and [EMAIL PROTECTED] for ! ! the tests. ! ! ! INTEGER :: i, st1, st2, st3, lambda, n REAL :: x, z(2,2) ! character(8) :: ch ! real(8) :: fi, arg, sigma, dshpfunc ! real(8), parameter :: one=1d0 ! ! Test check for recursion via other statement functions, string ! length references, function actual arguments and array index ! references. ! ! ! st1 (i) = len (ch(st2 (1):8)) ! st2 (i) = max (st3 (1), 4) ! st3 (i) = 2 + cos (z(st1 (1), i)) ! { dg-error "is recursive" } ! ! ! ! Test the two regressions. ! ! ! fi (n) = n *one ! dshpfunc (arg)=-lambda/sigma*(arg/sigma)**(lambda-1)*exp (-(arg/sigma)**lambda) ! ! ! ! References to each statement function. ! ! ! write(6,*) st1 (1), fi (2), dshpfunc (1.0_8) END -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24755