forked from OSchip/llvm-project
142 lines
2.6 KiB
Fortran
142 lines
2.6 KiB
Fortran
! RUN: %S/test_errors.sh %s %t %f18
|
|
! Extended derived types
|
|
|
|
module m1
|
|
type :: t1
|
|
integer :: x
|
|
!ERROR: Component 'x' is already declared in this derived type
|
|
real :: x
|
|
end type
|
|
end
|
|
|
|
module m2
|
|
type :: t1
|
|
integer :: i
|
|
end type
|
|
type, extends(t1) :: t2
|
|
!ERROR: Component 'i' is already declared in a parent of this derived type
|
|
integer :: i
|
|
end type
|
|
end
|
|
|
|
module m3
|
|
type :: t1
|
|
end type
|
|
type, extends(t1) :: t2
|
|
integer :: i
|
|
!ERROR: 't1' is a parent type of this type and so cannot be a component
|
|
real :: t1
|
|
end type
|
|
type, extends(t2) :: t3
|
|
!ERROR: 't1' is a parent type of this type and so cannot be a component
|
|
real :: t1
|
|
end type
|
|
end
|
|
|
|
module m4
|
|
type :: t1
|
|
integer :: t1
|
|
end type
|
|
!ERROR: Type cannot be extended as it has a component named 't1'
|
|
type, extends(t1) :: t2
|
|
end type
|
|
end
|
|
|
|
module m5
|
|
type :: t1
|
|
integer :: t2
|
|
end type
|
|
type, extends(t1) :: t2
|
|
end type
|
|
!ERROR: Type cannot be extended as it has a component named 't2'
|
|
type, extends(t2) :: t3
|
|
end type
|
|
end
|
|
|
|
module m6
|
|
! t1 can be extended if it is known as anything but t3
|
|
type :: t1
|
|
integer :: t3
|
|
end type
|
|
type, extends(t1) :: t2
|
|
end type
|
|
end
|
|
subroutine s6
|
|
use :: m6, only: t3 => t1
|
|
!ERROR: Type cannot be extended as it has a component named 't3'
|
|
type, extends(t3) :: t4
|
|
end type
|
|
end
|
|
subroutine r6
|
|
use :: m6, only: t5 => t1
|
|
type, extends(t5) :: t6
|
|
end type
|
|
end
|
|
|
|
module m7
|
|
type, private :: t1
|
|
integer :: i1
|
|
end type
|
|
type, extends(t1) :: t2
|
|
integer :: i2
|
|
integer, private :: i3
|
|
end type
|
|
end
|
|
subroutine s7
|
|
use m7
|
|
type(t2) :: x
|
|
integer :: j
|
|
j = x%i2
|
|
!ERROR: PRIVATE component 'i3' is only accessible within module 'm7'
|
|
j = x%i3
|
|
!ERROR: PRIVATE component 't1' is only accessible within module 'm7'
|
|
j = x%t1%i1
|
|
end
|
|
|
|
! 7.5.4.8(2)
|
|
module m8
|
|
type :: t
|
|
integer :: i1
|
|
integer, private :: i2
|
|
end type
|
|
type(t) :: y
|
|
integer :: a(1)
|
|
contains
|
|
subroutine s0
|
|
type(t) :: x
|
|
x = t(i1=2, i2=5) !OK
|
|
end
|
|
subroutine s1
|
|
a = [y%i2] !OK
|
|
end subroutine
|
|
end
|
|
subroutine s8
|
|
use m8
|
|
type(t) :: x
|
|
!ERROR: PRIVATE component 'i2' is only accessible within module 'm8'
|
|
x = t(2, 5)
|
|
!ERROR: PRIVATE component 'i2' is only accessible within module 'm8'
|
|
x = t(i1=2, i2=5)
|
|
!ERROR: PRIVATE component 'i2' is only accessible within module 'm8'
|
|
a = [y%i2]
|
|
end
|
|
|
|
! 7.5.4.8(2)
|
|
module m9
|
|
interface
|
|
module subroutine s()
|
|
end subroutine
|
|
end interface
|
|
type :: t
|
|
integer :: i1
|
|
integer, private :: i2
|
|
end type
|
|
end
|
|
submodule(m9) sm8
|
|
contains
|
|
module subroutine s
|
|
type(t) :: x
|
|
x = t(i1=2, i2=5) !OK
|
|
end
|
|
end
|