llvm-project/flang/test/Semantics/resolve31.f90

108 lines
2.6 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
! C735 If EXTENDS appears, SEQUENCE shall not appear.
! C738 The same private-or-sequence shall not appear more than once in a
! given derived-type-def .
!
! C740 If SEQUENCE appears,
! the type shall have at least one component,
! each data component shall be declared to be of an intrinsic type or of a sequence type,
! the derived type shall not have any type parameter,
! and a type-bound-procedure-part shall not appear.
subroutine s1
integer :: t0
!ERROR: 't0' is not a derived type
type(t0) :: x
type :: t1
end type
type, extends(t1) :: t2
end type
!ERROR: Derived type 't3' not found
type, extends(t3) :: t4
end type
!ERROR: 't0' is not a derived type
type, extends(t0) :: t5
end type
end subroutine
module m1
type t0
end type
end
module m2
type t
end type
end
module m3
type t0
end type
end
subroutine s2
use m1
use m2, t0 => t
use m3
!ERROR: Reference to 't0' is ambiguous
type, extends(t0) :: t1
end type
end subroutine
module m4
type :: t1
private
sequence
private ! not a fatal error
sequence ! not a fatal error
real :: t1Field
end type
type :: t1a
end type
!ERROR: A sequence type may not have the EXTENDS attribute
type, extends(t1a) :: t2
sequence
integer i
end type
type :: t3
sequence
integer i
!ERROR: A sequence type may not have a CONTAINS statement
contains
end type
!ERROR: A sequence type must have at least one component
type :: emptyType
sequence
end type emptyType
type :: plainType
real :: plainField
end type plainType
type :: sequenceType
sequence
real :: sequenceField
end type sequenceType
type :: testType
sequence
!ERROR: A sequence type data component must either be of an intrinsic type or a derived sequence type
class(*), allocatable :: typeStarField
!ERROR: A sequence type data component must either be of an intrinsic type or a derived sequence type
type(plainType) :: testField1
!Pointers are ok as an extension
type(plainType), pointer :: testField1p
type(sequenceType) :: testField2
procedure(real), pointer, nopass :: procField
end type testType
!ERROR: A sequence type may not have type parameters
type :: paramType(param)
integer, kind :: param
sequence
real :: paramField
end type paramType
contains
subroutine s3
type :: t1
!ERROR: PRIVATE is only allowed in a derived type that is in a module
private
contains
!ERROR: PRIVATE is only allowed in a derived type that is in a module
private
end type
end
end