diff gcc/testsuite/gfortran.dg/extends_1.f03 @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/gfortran.dg/extends_1.f03	Fri Oct 27 22:46:09 2017 +0900
@@ -0,0 +1,71 @@
+! { dg-do run }
+! A basic functional test of derived type extension.
+!
+! Contributed by Paul Thomas  <pault@gcc.gnu.org>
+!
+module persons
+  type :: person
+    character(24) :: name = ""
+    integer :: ss = 1
+  end type person
+end module persons
+
+module person_education
+  use persons
+  type, extends(person) :: education
+    integer ::  attainment = 0
+    character(24) :: institution = ""
+  end type education
+end module person_education
+
+  use person_education
+  type, extends(education) :: service
+    integer :: personnel_number = 0
+    character(24) :: department = ""
+  end type service
+  
+  type, extends(service) :: person_record
+    type (person_record), pointer :: supervisor => NULL ()
+  end type person_record
+  
+  type(person_record), pointer :: recruit, supervisor
+  
+! Check that references by ultimate component work
+
+  allocate (supervisor)
+  supervisor%name = "Joe Honcho"
+  supervisor%ss = 123455
+  supervisor%attainment = 100
+  supervisor%institution = "Celestial University"
+  supervisor%personnel_number = 1
+  supervisor%department = "Directorate"
+
+  recruit => entry ("John Smith", 123456, 1, "Bog Hill High School", &
+                    99, "Records", supervisor)
+
+  if (trim (recruit%name) /= "John Smith") call abort
+  if (recruit%name /= recruit%service%name) call abort
+  if (recruit%supervisor%ss /= 123455) call abort
+  if (recruit%supervisor%ss /= supervisor%person%ss) call abort
+
+  deallocate (supervisor)
+  deallocate (recruit)
+contains
+  function entry (name, ss, attainment, institution, &
+                  personnel_number, department, supervisor) result (new_person)
+    integer :: ss, attainment, personnel_number
+    character (*) :: name, institution, department
+    type (person_record), pointer :: supervisor, new_person
+
+    allocate (new_person)
+
+! Check mixtures of references
+    new_person%person%name = name
+    new_person%service%education%person%ss = ss
+    new_person%service%attainment = attainment
+    new_person%education%institution = institution
+    new_person%personnel_number = personnel_number
+    new_person%service%department = department
+    new_person%supervisor => supervisor
+  end function
+end