FWIW, the Cray compiler does not complain about your example program:
> ftn test.f90
> srun -n1 ./a.out
Salary is 302.00 for 20.0 hours.
Salary is 302.00 for 20.0 hours.
>
Cheers,
Bill
> On Jun 10, 2017, at 12:19 PM, Walt Brainerd <[log in to unmask]> wrote:
>
> Consider the F08 standard, p. 218, 9.6.3, item (7) fourth bullet, just after NOTE 9.35:
>
> If a list item of derived type in a formatted input/output statement is not processed by a defined in-
> put/output procedure, that list item is treated as if all of the components of the list item were specified
> in the list in component order;
>
> This arises because of a disagreement between Intel and Gfortran.
>
> The question is: what does "not processed by" mean?
>
> Does it mean whether or not there is an appropriate interface for the dt accessible?
> Or must there be a DT edit descriptor that processes the io list item?
>
> This is illustrated by the following program (sorry it is a bit long--of necessity, I think).
>
> Intel 2017 accepts and runs it, while gfortran 7.0.1 gives a runtime error for the second
> WRITE statement.
>
> module B_write_dt_mod
>
> implicit none
> private
>
> type, public :: B_type
> real :: amount
> end type B_type
>
> interface write (formatted)
> procedure :: Write_b_real
> end interface
>
> public :: write (formatted)
>
> contains
>
> subroutine Write_b_real &
> (amount, unit, b_edit_descriptor, v_list, iostat, iomsg)
>
> class (B_type), intent(in) :: amount
> integer, intent(in) :: unit
> character (len=*), intent(in) :: b_edit_descriptor
> integer, dimension(:), intent(in) :: v_list
> integer, intent(out) :: iostat
> character (len=*), intent(inout) :: iomsg
> write (unit=unit, fmt="("//b_edit_descriptor(3:)//")", iostat=iostat) amount%amount
>
> end subroutine Write_b_real
>
> end module B_write_dt_mod
>
> program test_b_write_dt_mod
>
> use :: B_write_dt_mod
> use, intrinsic :: iso_fortran_env, only: OUTPUT_UNIT
> implicit none
> real :: wage = 15.10
>
> write (unit=OUTPUT_UNIT, fmt="(a, DT'f9.2', a, f4.1, a)") &
> "Salary is ", B_type(20.0 * wage), " for ", 20.0, " hours."
>
> ! gfortran bombs on the following B_type(20.0); intel OK
> write (unit=OUTPUT_UNIT, fmt="(a, DT'f9.2', a, f4.1, a)") &
> "Salary is ", B_type(20.0 * wage), " for ", B_type(20.0), " hours."
> ! Note: B_type(20.0) corresponds to f4.1 format, not DT
>
> end program test_b_write_dt_mod
>
>
> --
> Walt Brainerd
Bill Long [log in to unmask]
Principal Engineer, Fortran Technical Support & voice: 651-605-9024
Bioinformatics Software Development fax: 651-605-9143
Cray Inc./ 2131 Lindau Lane/ Suite 1000/ Bloomington, MN 55425
|