diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2007-05-04 14:02:18 -0400 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2007-05-04 14:02:18 -0400 |
commit | dcdc26dfd5606c0837de979ddd9b2d6c960f5102 (patch) | |
tree | f5fbb8c905ad4fe8db79b23d98f6fdde28648680 /gcc/fortran/iresolve.c | |
parent | aa2bd2db03ce5bef785823ebca7b97cc2fa7f807 (diff) | |
download | gcc-dcdc26dfd5606c0837de979ddd9b2d6c960f5102.zip gcc-dcdc26dfd5606c0837de979ddd9b2d6c960f5102.tar.gz gcc-dcdc26dfd5606c0837de979ddd9b2d6c960f5102.tar.bz2 |
re PR target/22539 (Internal compiler error with maximum sized array)
gcc/fortran:
2007-05-04 Daniel Franke <franke.daniel@gmail.com>
PR fortran/22539
* intrinsic.c (add_subroutines): Added FSEEK.
* intrinsic.h (gfc_resolve_fseek_sub, gfc_check_fseek_sub): New.
* iresolve.c (gfc_resolve_fseek_sub): New.
* check.c (gfc_check_fseek_sub): New.
* intrinsic.texi (FSEEK): Updated.
gcc/testsuite:
2007-05-01 Daniel Franke <franke.daniel@gmail.com>
PR fortran/22539
* gfortran.dg/fseek.f90: New test.
libgfortran:
2007-05-04 Daniel Franke <franke.daniel@gmail.com>
PR fortran/22539
* io/intrinsics.c (fseek_sub): New.
* io/unix.c (fd_fseek): Change logical and physical offsets only
if seek succeeds.
* gfortran.map (fseek_sub): New.
From-SVN: r124437
Diffstat (limited to 'gcc/fortran/iresolve.c')
-rw-r--r-- | gcc/fortran/iresolve.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 14ed3e3..b0a1c37 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -2965,6 +2965,50 @@ gfc_resolve_fput_sub (gfc_code *c) } +void +gfc_resolve_fseek_sub (gfc_code *c) +{ + gfc_expr *unit; + gfc_expr *offset; + gfc_expr *whence; + gfc_expr *status; + gfc_typespec ts; + + unit = c->ext.actual->expr; + offset = c->ext.actual->next->expr; + whence = c->ext.actual->next->next->expr; + status = c->ext.actual->next->next->next->expr; + + if (unit->ts.kind != gfc_c_int_kind) + { + ts.type = BT_INTEGER; + ts.kind = gfc_c_int_kind; + ts.derived = NULL; + ts.cl = NULL; + gfc_convert_type (unit, &ts, 2); + } + + if (offset->ts.kind != gfc_intio_kind) + { + ts.type = BT_INTEGER; + ts.kind = gfc_intio_kind; + ts.derived = NULL; + ts.cl = NULL; + gfc_convert_type (offset, &ts, 2); + } + + if (whence->ts.kind != gfc_c_int_kind) + { + ts.type = BT_INTEGER; + ts.kind = gfc_c_int_kind; + ts.derived = NULL; + ts.cl = NULL; + gfc_convert_type (whence, &ts, 2); + } + + c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fseek_sub")); +} + void gfc_resolve_ftell_sub (gfc_code *c) { |