From d05d9ac771ec6e7f7a1f0f0417106b0c73a9943d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 26 Sep 2005 22:06:37 +0200 Subject: re PR fortran/23677 (-fno-automatic does not accept legal save statements) PR fortran/23677 * symbol.c (gfc_is_var_automatic): Return true if character length is non-constant rather than constant. * resolve.c (gfc_resolve): Don't handle !gfc_option.flag_automatic here. * options.c (gfc_post_options): Set gfc_option.flag_max_stack_var_size to 0 for -fno-automatic. * gfortran.fortran-torture/execute/save_1.f90: New test. * gfortran.dg/save_1.f90: New test. From-SVN: r104661 --- gcc/fortran/ChangeLog | 10 ++++++++ gcc/fortran/options.c | 4 +++ gcc/fortran/resolve.c | 2 +- gcc/fortran/symbol.c | 2 +- gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gfortran.dg/save_1.f90 | 30 ++++++++++++++++++++++ .../gfortran.fortran-torture/execute/save_1.f90 | 29 +++++++++++++++++++++ 7 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/save_1.f90 create mode 100644 gcc/testsuite/gfortran.fortran-torture/execute/save_1.f90 (limited to 'gcc') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 76b0344..a376443 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2005-09-26 Jakub Jelinek + + PR fortran/23677 + * symbol.c (gfc_is_var_automatic): Return true if character length + is non-constant rather than constant. + * resolve.c (gfc_resolve): Don't handle !gfc_option.flag_automatic + here. + * options.c (gfc_post_options): Set gfc_option.flag_max_stack_var_size + to 0 for -fno-automatic. + 2005-09-23 Paul Thomas PR fortran/16861 diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c index 693ac71..48df674 100644 --- a/gcc/fortran/options.c +++ b/gcc/fortran/options.c @@ -223,6 +223,10 @@ gfc_post_options (const char **pfilename) if (gfc_option.flag_second_underscore == -1) gfc_option.flag_second_underscore = gfc_option.flag_f2c; + /* Implement -fno-automatic as -fmax-stack-var-size=0. */ + if (!gfc_option.flag_automatic) + gfc_option.flag_max_stack_var_size = 0; + return false; } diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 88e7d18..a048da5 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -5107,7 +5107,7 @@ gfc_resolve (gfc_namespace * ns) gfc_traverse_ns (ns, resolve_values); - if (!gfc_option.flag_automatic || ns->save_all) + if (ns->save_all) gfc_save_all (ns); iter_stack = NULL; diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index acae453..de2de4b 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -2345,7 +2345,7 @@ gfc_is_var_automatic (gfc_symbol * sym) /* Check for non-constant length character variables. */ if (sym->ts.type == BT_CHARACTER && sym->ts.cl - && gfc_is_constant_expr (sym->ts.cl->length)) + && !gfc_is_constant_expr (sym->ts.cl->length)) return true; return false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9725d20..2e060cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-09-26 Jakub Jelinek + + PR fortran/23677 + * gfortran.fortran-torture/execute/save_1.f90: New test. + * gfortran.dg/save_1.f90: New test. + 2005-09-26 Uros Bizjak * gcc.target/i386/builtin-apply-mmx.c: New test. diff --git a/gcc/testsuite/gfortran.dg/save_1.f90 b/gcc/testsuite/gfortran.dg/save_1.f90 new file mode 100644 index 0000000..6149862 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/save_1.f90 @@ -0,0 +1,30 @@ +! { dg-options "-O2 -fno-automatic" } + subroutine foo (b) + logical b + integer i, j + character*24 s + save i + if (b) then + i = 26 + j = 131 + s = 'This is a test string' + else + if (i .ne. 26 .or. j .ne. 131) call abort + if (s .ne. 'This is a test string') call abort + end if + end subroutine foo + subroutine bar (s) + character*42 s + if (s .ne. '0123456789012345678901234567890123456') call abort + call foo (.false.) + end subroutine bar + subroutine baz + character*42 s + ! Just clobber stack a little bit. + s = '0123456789012345678901234567890123456' + call bar (s) + end subroutine baz + call foo (.true.) + call baz + call foo (.false.) + end diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/save_1.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/save_1.f90 new file mode 100644 index 0000000..c838baa --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/execute/save_1.f90 @@ -0,0 +1,29 @@ + subroutine foo (b) + logical b + integer i, j + character*24 s + save + if (b) then + i = 26 + j = 131 + s = 'This is a test string' + else + if (i .ne. 26 .or. j .ne. 131) call abort + if (s .ne. 'This is a test string') call abort + end if + end subroutine foo + subroutine bar (s) + character*42 s + if (s .ne. '0123456789012345678901234567890123456') call abort + call foo (.false.) + end subroutine bar + subroutine baz + character*42 s + ! Just clobber stack a little bit. + s = '0123456789012345678901234567890123456' + call bar (s) + end subroutine baz + call foo (.true.) + call baz + call foo (.false.) + end -- cgit v1.1