1! { dg-do run }
2! A test of f2k style constructors with derived type extension.
3!
4! Contributed by Paul Thomas  <pault@gcc.gnu.org>
5!
6module persons
7  type :: person
8    character(24) :: name = ""
9    integer :: ss = 1
10  end type person
11end module persons
12
13module person_education
14  use persons
15  type, extends(person) :: education
16    integer ::  attainment = 0
17    character(24) :: institution = ""
18  end type education
19end module person_education
20
21  use person_education
22  type, extends(education) :: service
23    integer :: personnel_number = 0
24    character(24) :: department = ""
25  end type service
26
27  type, extends(service) :: person_record
28    type (person_record), pointer :: supervisor => NULL ()
29  end type person_record
30
31  type(person_record), pointer :: recruit, supervisor
32
33! Check that F2K constructor with missing entries works
34  allocate (supervisor)
35  supervisor%service = service (NAME = "Joe Honcho", SS= 123455)
36
37  recruit => entry ("John Smith", 123456, 1, "Bog Hill High School", &
38                    99, "Records", supervisor)
39
40  if (supervisor%ss /= 123455) STOP 1
41  if (trim (supervisor%name) /= "Joe Honcho") STOP 2
42  if (trim (supervisor%institution) /= "") STOP 3
43  if (supervisor%attainment /= 0) STOP 4
44
45  if (trim (recruit%name) /= "John Smith") STOP 5
46  if (recruit%name /= recruit%service%name) STOP 6
47  if (recruit%supervisor%ss /= 123455) STOP 7
48  if (recruit%supervisor%ss /= supervisor%person%ss) STOP 8
49
50  deallocate (supervisor)
51  deallocate (recruit)
52contains
53  function entry (name, ss, attainment, institution, &
54                  personnel_number, department, supervisor) result (new_person)
55    integer :: ss, attainment, personnel_number
56    character (*) :: name, institution, department
57    type (person_record), pointer :: supervisor, new_person
58
59    allocate (new_person)
60
61! Check F2K constructor with order shuffled a bit
62    new_person = person_record (NAME = name, SS =ss, &
63                                DEPARTMENT = department, &
64                                INSTITUTION = institution, &
65                                PERSONNEL_NUMBER = personnel_number, &
66                                ATTAINMENT = attainment, &
67                                SUPERVISOR = supervisor)
68  end function
69end
70