diff options
author | Paul Brook <paul@codesourcery.com> | 2004-05-30 14:37:25 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-05-30 14:37:25 +0000 |
commit | 7b5b57b7dc68b67c1e39eb88d41d377ba96c6606 (patch) | |
tree | 00a8818dcf5ba37c109c3fc7ee836662eddd859e /gcc/fortran/trans-decl.c | |
parent | 7a70d70c54f4b73e25f7860f56bcd8f9e532f16c (diff) | |
download | gcc-7b5b57b7dc68b67c1e39eb88d41d377ba96c6606.zip gcc-7b5b57b7dc68b67c1e39eb88d41d377ba96c6606.tar.gz gcc-7b5b57b7dc68b67c1e39eb88d41d377ba96c6606.tar.bz2 |
re PR fortran/15620 (Statement functions and optimization cause IC)
PR fortran/15620
* trans-decl.c (gfc_shadow_sym, gfc_restore_sym): New functions.
* trans-expr.c (gfc_trans_string_copy): New function.
(gfc_conv_statement_function): Use them. Create temp vars. Enforce
character lengths.
(gfc_conv_string_parameter): Use gfc_trans_string_copy.
* trans-stmt.c (gfc_trans_forall_1): Use gfc_{shadow,restore}_sym.
* trans.h (struct gfc_saved_var): Define.
(gfc_shadow_sym, gfc_restore_sym): Add prototypes.
testsuite/
* gfortran.fortran-torture/execute/st_function_1.f90: New test.
* gfortran.fortran-torture/execute/st_function_2.f90: New test.
From-SVN: r82452
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 32dfdc4..7bd912e 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -866,6 +866,32 @@ gfc_get_symbol_decl (gfc_symbol * sym) } +/* Substitute a temporary variable in place of the real one. */ + +void +gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save) +{ + save->attr = sym->attr; + save->decl = sym->backend_decl; + + gfc_clear_attr (&sym->attr); + sym->attr.referenced = 1; + sym->attr.flavor = FL_VARIABLE; + + sym->backend_decl = decl; +} + + +/* Restore the original variable. */ + +void +gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save) +{ + sym->attr = save->attr; + sym->backend_decl = save->decl; +} + + /* Get a basic decl for an external function. */ tree |