! RUN: %python %S/test_errors.py %s %flang_fc1 ! Tests for defined input/output. See 12.6.4.8 and 15.4.3.2, and C777 module m1 type,public :: t integer c contains procedure, nopass :: tbp=>formattedReadProc !Error, NOPASS not allowed !ERROR: Defined input/output procedure 'tbp' may not have NOPASS attribute generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv integer, intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m1 module m2 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc !ERROR: Defined input/output procedure 'formattedreadproc' must have 6 dummy arguments rather than 5 generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat) class(t), intent(inout) :: dtv integer, intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat iostat = 343 stop 'fail' end subroutine end module m2 module m3 type,public :: t integer c contains procedure, pass :: tbp=>unformattedReadProc !ERROR: Defined input/output procedure 'unformattedreadproc' must have 4 dummy arguments rather than 5 generic :: read(unformatted) => tbp end type private contains ! Error bad # of args subroutine unformattedReadProc(dtv, unit, iostat, iomsg, iotype) class(t), intent(inout) :: dtv integer, intent(in) :: unit integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg integer, intent(out) :: iotype iostat = 343 stop 'fail' end subroutine end module m3 module m4 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains !ERROR: Dummy argument 0 of 'formattedreadproc' must be a data object !ERROR: Cannot use an alternate return as the passed-object dummy argument subroutine formattedReadProc(*, unit, iotype, vlist, iostat, iomsg) !ERROR: Dummy argument 'unit' must be a data object !ERROR: A dummy procedure without the POINTER attribute may not have an INTENT attribute procedure(real), intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m4 module m5 type,public :: t integer c contains !ERROR: Passed-object dummy argument 'dtv' of procedure 'tbp' must be of type 't' but is 'INTEGER(4)' procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) !ERROR: Dummy argument 'dtv' of a defined input/output procedure must have a derived type integer, intent(inout) :: dtv ! error, must be of type t integer, intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m5 module m6 interface read(formatted) procedure :: formattedReadProc end interface contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) !ERROR: Dummy argument 'dtv' of a defined input/output procedure must have a derived type integer, intent(inout) :: dtv integer, intent(in) :: unit character(len=*), intent(in) :: iotype ! error, must be deferred integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg end subroutine end module m6 module m7 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) !ERROR: Dummy argument 'dtv' of a defined input/output procedure must have intent 'INTENT(INOUT)' class(t), intent(in) :: dtv ! Error, must be intent(inout) integer, intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m7 module m8 type,public :: t integer c contains procedure, pass :: tbp=>formattedWriteProc generic :: write(formatted) => tbp end type private contains subroutine formattedWriteProc(dtv, unit, iotype, vlist, iostat, iomsg) !ERROR: Dummy argument 'dtv' of a defined input/output procedure must have intent 'INTENT(IN)' class(t), intent(inout) :: dtv ! Error, must be intent(inout) integer, intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m8 module m9 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv ! Error, can't have attributes !ERROR: Dummy argument 'unit' of a defined input/output procedure may not have any attributes integer, pointer, intent(in) :: unit character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m9 module m10 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv !ERROR: Dummy argument 'unit' of a defined input/output procedure must be an INTEGER of default KIND real, intent(in) :: unit ! Error, must be an integer character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m10 module m11 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv !ERROR: Dummy argument 'unit' of a defined input/output procedure must be an INTEGER of default KIND integer(8), intent(in) :: unit ! Error, must be default KIND character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m11 module m12 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv !ERROR: Dummy argument 'unit' of a defined input/output procedure must be a scalar integer, dimension(22), intent(in) :: unit ! Error, must be a scalar character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m12 module m13 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv !ERROR: Dummy argument 'unit' of a defined input/output procedure must have intent 'INTENT(IN)' integer, intent(out) :: unit !Error, must be intent(in) character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m13 module m14 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv !ERROR: Dummy argument 'unit' of a defined input/output procedure must have intent 'INTENT(IN)' integer :: unit !Error, must be INTENT(IN) character(len=*), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m14 module m15 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv integer, intent(in) :: unit !ERROR: Dummy argument 'iotype' of a defined input/output procedure must be assumed-length CHARACTER of default kind character(len=5), intent(in) :: iotype ! Error, must be assumed length integer, intent(in) :: vlist(:) integer, intent(out) :: iostat !ERROR: Dummy argument 'iomsg' of a defined input/output procedure must be assumed-length CHARACTER of default kind character(len=5), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m15 module m16 type,public :: t integer c contains procedure, pass :: tbp=>formattedReadProc generic :: read(formatted) => tbp end type private contains subroutine formattedReadProc(dtv, unit, iotype, vlist, iostat, iomsg) class(t), intent(inout) :: dtv integer, intent(in) :: unit character(len=*), intent(in) :: iotype !ERROR: Dummy argument 'vlist' of a defined input/output procedure must be deferred shape integer, intent(in) :: vlist(5) integer, intent(out) :: iostat character(len=*), intent(inout) :: iomsg iostat = 343 stop 'fail' end subroutine end module m16 module m17 ! Test the same defined input/output procedure specified as a generic type t integer c contains procedure :: formattedReadProc end type interface read(formatted) module procedure formattedReadProc end interface contains subroutine formattedReadProc(dtv,unit,iotype,v_list,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit character(*),intent(in) :: iotype integer,intent(in) :: v_list(:) integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c print *,v_list end subroutine end module module m18 ! Test the same defined input/output procedure specified as a type-bound ! procedure and as a generic type t integer c contains procedure :: formattedReadProc generic :: read(formatted) => formattedReadProc end type interface read(formatted) module procedure formattedReadProc end interface contains subroutine formattedReadProc(dtv,unit,iotype,v_list,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit character(*),intent(in) :: iotype integer,intent(in) :: v_list(:) integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c print *,v_list end subroutine end module module m19 ! Test two different defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type type t integer c contains procedure :: unformattedReadProc1 generic :: read(unformatted) => unformattedReadProc1 end type interface read(unformatted) module procedure unformattedReadProc end interface contains subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine !ERROR: Derived type 't' has conflicting type-bound input/output procedure 'read(unformatted)' subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m20 ! Test read and write defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type type t integer c contains procedure :: unformattedReadProc generic :: read(unformatted) => unformattedReadProc end type interface read(unformatted) module procedure unformattedReadProc end interface interface write(unformatted) module procedure unformattedWriteProc end interface contains subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine subroutine unformattedWriteProc(dtv,unit,iostat,iomsg) class(t),intent(in) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg write(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m21 ! Test read and write defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type with a ! KIND type parameter where they both have the same value type t(typeParam) integer, kind :: typeParam = 4 integer c contains procedure :: unformattedReadProc generic :: read(unformatted) => unformattedReadProc end type interface read(unformatted) module procedure unformattedReadProc1 end interface contains subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine !ERROR: Derived type 't' has conflicting type-bound input/output procedure 'read(unformatted)' subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t(4)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m22 ! Test read and write defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type with a ! KIND type parameter where they have different values type t(typeParam) integer, kind :: typeParam = 4 integer c contains procedure :: unformattedReadProc generic :: read(unformatted) => unformattedReadProc end type interface read(unformatted) module procedure unformattedReadProc1 end interface contains subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t(3)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m23 type t(typeParam) ! Test read and write defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type with a ! KIND type parameter where they have different values integer, kind :: typeParam = 4 integer c contains procedure :: unformattedReadProc generic :: read(unformatted) => unformattedReadProc end type interface read(unformatted) module procedure unformattedReadProc1 end interface contains subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t(2)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t(3)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m23a type t(typeParam) ! Test read and write defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type with a ! KIND type parameter where they have the same value integer, kind :: typeParam = 4 integer c contains procedure :: unformattedReadProc generic :: read(unformatted) => unformattedReadProc end type interface read(unformatted) module procedure unformattedReadProc1 end interface contains subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine !ERROR: Derived type 't' has conflicting type-bound input/output procedure 'read(unformatted)' subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t(4)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m24 ! Test read and write defined input/output procedures specified as a ! type-bound procedure and as a generic for the same derived type with a ! LEN type parameter where they are both assumed type t(typeParam) integer, len :: typeParam = 4 integer c contains procedure :: unformattedReadProc generic :: read(unformatted) => unformattedReadProc end type interface read(unformatted) module procedure unformattedReadProc1 end interface contains subroutine unformattedReadProc(dtv,unit,iostat,iomsg) class(t(*)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine !ERROR: Derived type 't' has conflicting type-bound input/output procedure 'read(unformatted)' subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t(*)),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module module m25a ! Test against false error when two defined I/O procedures exist ! for the same type but are not both visible in the same scope. type t integer c end type interface read(unformatted) module procedure unformattedReadProc1 end interface contains subroutine unformattedReadProc1(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end module subroutine m25b use m25a, only: t interface read(unformatted) procedure unformattedReadProc2 end interface contains subroutine unformattedReadProc2(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat character(*),intent(inout) :: iomsg read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%c end subroutine end subroutine module m26a type t integer n end type contains subroutine unformattedRead(dtv,unit,iostat,iomsg) class(t),intent(inout) :: dtv integer,intent(in) :: unit integer,intent(out) :: iostat !ERROR: Dummy argument 'iomsg' of a defined input/output procedure must be assumed-length CHARACTER of default kind character(kind=4,len=*),intent(inout) :: iomsg !ERROR: Must have default kind(1) of CHARACTER type, but is CHARACTER(KIND=4,LEN=*) read(unit,iotype,iostat=iostat,iomsg=iomsg) dtv%n end subroutine end module m26b use m26a interface read(unformatted) procedure unformattedRead end interface end