re PR libfortran/20179 (cannot mix C and Fortran I/O)
PR libfortran/20179 * io/unix.c (flush_if_preconnected): New function. * io/io.h: Add prototype for flush_if_preconnected. * io/transfer.c (data_transfer_init): Use flush_if_preconnected to workaround buggy mixed C-Fortran code. * gfortran.dg/mixed_io_1.f90: New test. * gfortran.dg/mixed_io_1.c: New file. From-SVN: r106017
This commit is contained in:
parent
0d519038a0
commit
159840cb8a
|
@ -1,3 +1,13 @@
|
|||
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
|
||||
|
||||
PR libfortran/20179
|
||||
* gfortran.dg/mixed_io_1.f90: New test.
|
||||
* gfortran.dg/mixed_io_1.c: New file.
|
||||
|
||||
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
|
||||
|
||||
* gfortran.dg/malloc_free_1.f90: New test.
|
||||
|
||||
2005-10-29 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* gcc.dg/nested-func-4.c: Require profiling -pg.
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
#include <stdio.h>
|
||||
void cio_(void){
|
||||
printf("12345");
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
! { dg-do run }
|
||||
! { dg-additional-sources mixed_io_1.c }
|
||||
call cio
|
||||
write(*,"(A)") '6789' ! { dg-output "123456789" }
|
||||
end
|
|
@ -1,3 +1,11 @@
|
|||
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
|
||||
|
||||
PR libfortran/20179
|
||||
* io/unix.c (flush_if_preconnected): New function.
|
||||
* io/io.h: Add prototype for flush_if_preconnected.
|
||||
* io/transfer.c (data_transfer_init): Use flush_if_preconnected
|
||||
to workaround buggy mixed C-Fortran code.
|
||||
|
||||
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
|
||||
|
||||
* Makefile.am: Add intrinsics/malloc.c file.
|
||||
|
|
|
@ -505,6 +505,9 @@ internal_proto(is_seekable);
|
|||
extern int is_preconnected (stream *);
|
||||
internal_proto(is_preconnected);
|
||||
|
||||
extern void flush_if_preconnected (stream *);
|
||||
internal_proto(flush_if_preconnected);
|
||||
|
||||
extern void empty_internal_buffer(stream *);
|
||||
internal_proto(empty_internal_buffer);
|
||||
|
||||
|
|
|
@ -1379,6 +1379,9 @@ data_transfer_init (int read_flag)
|
|||
&& current_unit->last_record == 0 && !is_preconnected(current_unit->s))
|
||||
struncate(current_unit->s);
|
||||
|
||||
/* Bugware for badly written mixed C-Fortran I/O. */
|
||||
flush_if_preconnected(current_unit->s);
|
||||
|
||||
current_unit->mode = g.mode;
|
||||
|
||||
/* Set the initial value of flags. */
|
||||
|
|
|
@ -228,6 +228,23 @@ is_preconnected (stream * s)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* If the stream corresponds to a preconnected unit, we flush the
|
||||
corresponding C stream. This is bugware for mixed C-Fortran codes
|
||||
where the C code doesn't flush I/O before returning. */
|
||||
void
|
||||
flush_if_preconnected (stream * s)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = ((unix_stream *) s)->fd;
|
||||
if (fd == STDIN_FILENO)
|
||||
fflush (stdin);
|
||||
else if (fd == STDOUT_FILENO)
|
||||
fflush (stdout);
|
||||
else if (fd == STDERR_FILENO)
|
||||
fflush (stderr);
|
||||
}
|
||||
|
||||
|
||||
/* Reset a stream after reading/writing. Assumes that the buffers have
|
||||
been flushed. */
|
||||
|
|
Loading…
Reference in New Issue