diff options
Diffstat (limited to 'gcc/testsuite/gfortran.dg/extends_4.f03')
-rw-r--r-- | gcc/testsuite/gfortran.dg/extends_4.f03 | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/extends_4.f03 b/gcc/testsuite/gfortran.dg/extends_4.f03 new file mode 100644 index 000000000..941a66392 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/extends_4.f03 @@ -0,0 +1,52 @@ +! { dg-do run } +! Check that derived type extension is compatible with renaming +! the parent type and that allocatable components are OK. At +! the same time, private type and components are checked. +! +! Contributed by Paul Thomas <pault@gcc.gnu.org> +! +module mymod + type :: a + real, allocatable :: x(:) + integer, private :: ia = 0 + end type a + type :: b + private + real, allocatable :: x(:) + integer :: i + end type b +contains + function set_b () result (res) + type(b) :: res + allocate (res%x(2)) + res%x = [10.0, 20.0] + res%i = 1 + end function + subroutine check_b (arg) + type(b) :: arg + if (any (arg%x /= [10.0, 20.0])) call abort + if (arg%i /= 1) call abort + end subroutine +end module mymod + + use mymod, e => a + type, extends(e) :: f + integer :: if + end type f + type, extends(b) :: d + integer :: id + end type d + + type(f) :: p + type(d) :: q + + p = f (x = [1.0, 2.0], if = 3) + if (any (p%e%x /= [1.0, 2.0])) call abort + + q%b = set_b () + call check_b (q%b) + q = d (b = set_b (), id = 99) + call check_b (q%b) +end + +! { dg-final { cleanup-modules "persons person_education" } } |