aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-decl.c
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2004-05-30 14:37:25 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2004-05-30 14:37:25 +0000
commit7b5b57b7dc68b67c1e39eb88d41d377ba96c6606 (patch)
tree00a8818dcf5ba37c109c3fc7ee836662eddd859e /gcc/fortran/trans-decl.c
parent7a70d70c54f4b73e25f7860f56bcd8f9e532f16c (diff)
downloadgcc-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.c26
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