annotate gcc/testsuite/gfortran.dg/extends_1.f03 @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ! { dg-do run }
kono
parents:
diff changeset
2 ! A basic functional test of derived type extension.
kono
parents:
diff changeset
3 !
kono
parents:
diff changeset
4 ! Contributed by Paul Thomas <pault@gcc.gnu.org>
kono
parents:
diff changeset
5 !
kono
parents:
diff changeset
6 module persons
kono
parents:
diff changeset
7 type :: person
kono
parents:
diff changeset
8 character(24) :: name = ""
kono
parents:
diff changeset
9 integer :: ss = 1
kono
parents:
diff changeset
10 end type person
kono
parents:
diff changeset
11 end module persons
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 module person_education
kono
parents:
diff changeset
14 use persons
kono
parents:
diff changeset
15 type, extends(person) :: education
kono
parents:
diff changeset
16 integer :: attainment = 0
kono
parents:
diff changeset
17 character(24) :: institution = ""
kono
parents:
diff changeset
18 end type education
kono
parents:
diff changeset
19 end module person_education
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 use person_education
kono
parents:
diff changeset
22 type, extends(education) :: service
kono
parents:
diff changeset
23 integer :: personnel_number = 0
kono
parents:
diff changeset
24 character(24) :: department = ""
kono
parents:
diff changeset
25 end type service
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 type, extends(service) :: person_record
kono
parents:
diff changeset
28 type (person_record), pointer :: supervisor => NULL ()
kono
parents:
diff changeset
29 end type person_record
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 type(person_record), pointer :: recruit, supervisor
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 ! Check that references by ultimate component work
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 allocate (supervisor)
kono
parents:
diff changeset
36 supervisor%name = "Joe Honcho"
kono
parents:
diff changeset
37 supervisor%ss = 123455
kono
parents:
diff changeset
38 supervisor%attainment = 100
kono
parents:
diff changeset
39 supervisor%institution = "Celestial University"
kono
parents:
diff changeset
40 supervisor%personnel_number = 1
kono
parents:
diff changeset
41 supervisor%department = "Directorate"
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 recruit => entry ("John Smith", 123456, 1, "Bog Hill High School", &
kono
parents:
diff changeset
44 99, "Records", supervisor)
kono
parents:
diff changeset
45
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
46 if (trim (recruit%name) /= "John Smith") STOP 1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
47 if (recruit%name /= recruit%service%name) STOP 2
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
48 if (recruit%supervisor%ss /= 123455) STOP 3
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
49 if (recruit%supervisor%ss /= supervisor%person%ss) STOP 4
111
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 deallocate (supervisor)
kono
parents:
diff changeset
52 deallocate (recruit)
kono
parents:
diff changeset
53 contains
kono
parents:
diff changeset
54 function entry (name, ss, attainment, institution, &
kono
parents:
diff changeset
55 personnel_number, department, supervisor) result (new_person)
kono
parents:
diff changeset
56 integer :: ss, attainment, personnel_number
kono
parents:
diff changeset
57 character (*) :: name, institution, department
kono
parents:
diff changeset
58 type (person_record), pointer :: supervisor, new_person
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 allocate (new_person)
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 ! Check mixtures of references
kono
parents:
diff changeset
63 new_person%person%name = name
kono
parents:
diff changeset
64 new_person%service%education%person%ss = ss
kono
parents:
diff changeset
65 new_person%service%attainment = attainment
kono
parents:
diff changeset
66 new_person%education%institution = institution
kono
parents:
diff changeset
67 new_person%personnel_number = personnel_number
kono
parents:
diff changeset
68 new_person%service%department = department
kono
parents:
diff changeset
69 new_person%supervisor => supervisor
kono
parents:
diff changeset
70 end function
kono
parents:
diff changeset
71 end