146 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			2.7 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 :: t3
 | |
|   end type
 | |
|   type, extends(t3) :: t4
 | |
|   end type
 | |
|   type, extends(t4) :: t5
 | |
|     !ERROR: 't3' is a parent type of this type and so cannot be a component
 | |
|     real :: t3
 | |
|   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
 |