Many semantic checks for constraints related to PURE subprograms can be implemented in terms of Semantics' "definable.h" utilities, slightly expanded. Replace some particular PURE constraint checks with calls to WhyNotDefinable(), except for cases that had better specific error messages, and start checking some missing constraints with DEALLOCATE statements and local variable declarations. Differential Revision: https://reviews.llvm.org/D147389
43 lines
1.3 KiB
Fortran
43 lines
1.3 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
! Other checks for declarations in PURE procedures
|
|
module m
|
|
type t0
|
|
end type
|
|
type t1
|
|
contains
|
|
final :: final
|
|
end type
|
|
type t2
|
|
type(t1), allocatable :: c
|
|
end type
|
|
type t3
|
|
class(t1), allocatable :: c
|
|
end type
|
|
type t4
|
|
class(t0), allocatable :: c
|
|
end type
|
|
contains
|
|
impure subroutine final(x)
|
|
type(t1) x
|
|
end
|
|
pure subroutine test
|
|
!ERROR: 'x0' may not be a local variable in a pure subprogram
|
|
!BECAUSE: 'x0' is polymorphic in a pure subprogram
|
|
class(t0), allocatable :: x0
|
|
!ERROR: 'x1' may not be a local variable in a pure subprogram
|
|
!BECAUSE: 'x1' has an impure FINAL procedure 'final'
|
|
type(t1) x1
|
|
!WARNING: 'x1a' of derived type 't1' does not have a FINAL subroutine for its rank (1)
|
|
type(t1), allocatable :: x1a(:)
|
|
!ERROR: 'x2' may not be a local variable in a pure subprogram
|
|
!BECAUSE: 'x2' has an impure FINAL procedure 'final'
|
|
type(t2) x2
|
|
!ERROR: 'x3' may not be a local variable in a pure subprogram
|
|
!BECAUSE: 'x3' has an impure FINAL procedure 'final'
|
|
type(t3) x3
|
|
!ERROR: 'x4' may not be a local variable in a pure subprogram
|
|
!BECAUSE: 'x4' has polymorphic component '%c' in a pure subprogram
|
|
type(t4) x4
|
|
end
|
|
end
|