1! { dg-do run }
2!
3! Tests dtio transfer sequence types.
4!
5! Note difficulty at end with comparisons at any level of optimization.
6!
7MODULE p
8  TYPE :: person
9    sequence
10    CHARACTER (LEN=20) :: name
11    INTEGER(4) :: age
12  END TYPE person
13  INTERFACE WRITE(UNFORMATTED)
14    MODULE PROCEDURE pwuf
15  END INTERFACE
16  INTERFACE READ(UNFORMATTED)
17    MODULE PROCEDURE pruf
18  END INTERFACE
19
20CONTAINS
21
22  SUBROUTINE pwuf (dtv,unit,iostat,iomsg)
23    type(person), INTENT(IN) :: dtv
24    INTEGER, INTENT(IN) :: unit
25    INTEGER, INTENT(OUT) :: iostat
26    CHARACTER (LEN=*), INTENT(INOUT) :: iomsg
27    WRITE (UNIT=UNIT) DTV%name, DTV%age
28  END SUBROUTINE pwuf
29
30  SUBROUTINE pruf (dtv,unit,iostat,iomsg)
31    type(person), INTENT(INOUT) :: dtv
32    INTEGER, INTENT(IN) :: unit
33    INTEGER, INTENT(OUT) :: iostat
34    CHARACTER (LEN=*), INTENT(INOUT) :: iomsg
35    READ (UNIT = UNIT) dtv%name, dtv%age
36  END SUBROUTINE pruf
37
38END MODULE p
39
40PROGRAM test
41  USE p
42  TYPE (person) :: chairman
43  character(10) :: line
44
45  chairman%name="Charlie"
46  chairman%age=62
47
48  OPEN (UNIT=71, status = 'scratch', FORM='UNFORMATTED')
49  write (71) chairman
50  rewind (71)
51
52  chairman%name = "Charles"
53  chairman%age = 0
54
55  read (71) chairman
56  close (unit = 71)
57
58! Straight comparisons fail at any level of optimization.
59
60  write(line, "(A7)") chairman%name
61  if (trim (line) .ne. "Charlie") STOP 1
62  line = "          "
63  write(line, "(I4)") chairman%age
64  if (trim (line) .eq. "   62") print *, trim(line)
65END PROGRAM test
66