diff options
| author | jvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-10-15 13:55:47 +0000 |
|---|---|---|
| committer | jvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-10-15 13:55:47 +0000 |
| commit | 07671b0c4868a6d83c9a755f09efef0fe2bab4b4 (patch) | |
| tree | bbeaf515e3b99ce10483ffa88f685a6513bb4725 | |
| parent | bfa5a9d90154acaa07e5f1c799ccd70b2b73f3f1 (diff) | |
| download | ppe42-gcc-07671b0c4868a6d83c9a755f09efef0fe2bab4b4.tar.gz ppe42-gcc-07671b0c4868a6d83c9a755f09efef0fe2bab4b4.zip | |
2007-10-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/33055
* trans-io.c (create_dummy_iostat): New function to create a unique
dummy variable expression to use with IOSTAT.
(gfc_trans_inquire): Use the new function to pass unit number error info
to run-time library if a regular IOSTAT variable was not given.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129328 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/fortran/trans-io.c | 39 |
2 files changed, 45 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 717053a68fe..7ee3b07b44a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2007-10-15 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/33055 + * trans-io.c (create_dummy_iostat): New function to create a unique + dummy variable expression to use with IOSTAT. + (gfc_trans_inquire): Use the new function to pass unit number error info + to run-time library if a regular IOSTAT variable was not given. + 2007-10-14 Tobias Burnus <burnus@net-b.de> PR fortran/33745 diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 72875f1e7be..6c438496bb7 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -1083,6 +1083,32 @@ gfc_trans_flush (gfc_code * code) } +/* Create a dummy iostat variable to catch any error due to bad unit. */ + +static gfc_expr * +create_dummy_iostat (void) +{ + gfc_symtree *st; + gfc_expr *e; + + gfc_get_ha_sym_tree ("@iostat", &st); + st->n.sym->ts.type = BT_INTEGER; + st->n.sym->ts.kind = gfc_default_integer_kind; + gfc_set_sym_referenced (st->n.sym); + st->n.sym->backend_decl + = gfc_create_var (gfc_get_int_type (st->n.sym->ts.kind), + st->n.sym->name); + + e = gfc_get_expr (); + e->expr_type = EXPR_VARIABLE; + e->symtree = st; + e->ts.type = BT_INTEGER; + e->ts.kind = st->n.sym->ts.kind; + + return e; +} + + /* Translate the non-IOLENGTH form of an INQUIRE statement. */ tree @@ -1122,8 +1148,17 @@ gfc_trans_inquire (gfc_code * code) p->file); if (p->exist) - mask |= set_parameter_ref (&block, &post_block, var, IOPARM_inquire_exist, - p->exist); + { + mask |= set_parameter_ref (&block, &post_block, var, IOPARM_inquire_exist, + p->exist); + + if (p->unit && !p->iostat) + { + p->iostat = create_dummy_iostat (); + mask |= set_parameter_ref (&block, &post_block, var, + IOPARM_common_iostat, p->iostat); + } + } if (p->opened) mask |= set_parameter_ref (&block, &post_block, var, IOPARM_inquire_opened, |

