mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 16:26:42 +00:00

We emit an incorrect error message when !DIR$ IGNORE_TKR appears in a separate module procedure's interface declaration. Fixes https://github.com/llvm/llvm-project/issues/98210.
235 lines
4.8 KiB
Fortran
235 lines
4.8 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
|
|
! !DIR$ IGNORE_TKR tests
|
|
|
|
!ERROR: !DIR$ IGNORE_TKR directive must appear in a subroutine or function
|
|
!dir$ ignore_tkr
|
|
|
|
module m
|
|
|
|
!ERROR: !DIR$ IGNORE_TKR directive must appear in a subroutine or function
|
|
!dir$ ignore_tkr
|
|
|
|
interface
|
|
subroutine t1(x)
|
|
!dir$ ignore_tkr
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t2(x)
|
|
!dir$ ignore_tkr(t) x
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t3(x)
|
|
!dir$ ignore_tkr(k) x
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t4(a)
|
|
!dir$ ignore_tkr(r) a
|
|
real, intent(in) :: a(2)
|
|
end
|
|
|
|
subroutine t5(m)
|
|
!dir$ ignore_tkr(r) m
|
|
real, intent(in) :: m(2,2)
|
|
end
|
|
|
|
subroutine t6(x)
|
|
!dir$ ignore_tkr(a) x
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t7(x)
|
|
!ERROR: !DIR$ IGNORE_TKR directive may not have an empty parenthesized list of letters
|
|
!dir$ ignore_tkr() x
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t8(x)
|
|
!dir$ ignore_tkr x
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t9(x)
|
|
!dir$ ignore_tkr x
|
|
!WARNING: !DIR$ IGNORE_TKR should not apply to an allocatable or pointer
|
|
real, intent(in), allocatable :: x
|
|
end
|
|
|
|
subroutine t10(x)
|
|
!dir$ ignore_tkr x
|
|
!WARNING: !DIR$ IGNORE_TKR should not apply to an allocatable or pointer
|
|
real, intent(in), pointer :: x
|
|
end
|
|
|
|
subroutine t11
|
|
!dir$ ignore_tkr x
|
|
!ERROR: !DIR$ IGNORE_TKR directive may apply only to a dummy data argument
|
|
real :: x
|
|
end
|
|
|
|
subroutine t12(p,q,r)
|
|
!dir$ ignore_tkr p, q
|
|
!ERROR: 'p' is a data object and may not be EXTERNAL
|
|
real, external :: p
|
|
!ERROR: 'q' is already declared as an object
|
|
procedure(real) :: q
|
|
procedure(), pointer :: r
|
|
!ERROR: 'r' must be an object
|
|
!dir$ ignore_tkr r
|
|
end
|
|
|
|
elemental subroutine t13(x)
|
|
!dir$ ignore_tkr(r) x
|
|
!ERROR: !DIR$ IGNORE_TKR(R) may not apply in an ELEMENTAL procedure
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
subroutine t14(x)
|
|
!dir$ ignore_tkr(r) x
|
|
!WARNING: !DIR$ IGNORE_TKR(R) should not apply to a dummy argument passed via descriptor
|
|
real x(:)
|
|
end
|
|
|
|
module subroutine t24(x)
|
|
!dir$ ignore_tkr(t) x
|
|
real x(:)
|
|
end
|
|
|
|
end interface
|
|
|
|
contains
|
|
subroutine t15(x)
|
|
!dir$ ignore_tkr x
|
|
!ERROR: !DIR$ IGNORE_TKR may not apply to an allocatable or pointer
|
|
real, intent(in), allocatable :: x
|
|
end
|
|
|
|
subroutine t16(x)
|
|
!dir$ ignore_tkr x
|
|
!ERROR: !DIR$ IGNORE_TKR may not apply to an allocatable or pointer
|
|
real, intent(in), pointer :: x
|
|
end
|
|
|
|
subroutine t17(x)
|
|
real x
|
|
x = x + 1.
|
|
!ERROR: !DIR$ IGNORE_TKR directive must appear in the specification part
|
|
!dir$ ignore_tkr x
|
|
end
|
|
|
|
subroutine t18(x)
|
|
!ERROR: 'q' is not a valid letter for !DIR$ IGNORE_TKR directive
|
|
!dir$ ignore_tkr(q) x
|
|
real x
|
|
x = x + 1.
|
|
end
|
|
|
|
subroutine t19(x)
|
|
real x
|
|
contains
|
|
subroutine inner
|
|
!ERROR: 'x' must be local to this subprogram
|
|
!dir$ ignore_tkr x
|
|
end
|
|
end
|
|
|
|
subroutine t20(x)
|
|
real x
|
|
block
|
|
!ERROR: 'x' must be local to this subprogram
|
|
!dir$ ignore_tkr x
|
|
end block
|
|
end
|
|
|
|
subroutine t22(x)
|
|
!dir$ ignore_tkr(r) x
|
|
!WARNING: !DIR$ IGNORE_TKR(R) is not meaningful for an assumed-rank array
|
|
real x(..)
|
|
end
|
|
|
|
subroutine t23(x)
|
|
!dir$ ignore_tkr(r) x
|
|
!ERROR: !DIR$ IGNORE_TKR(R) may not apply to a dummy argument passed via descriptor
|
|
real x(:)
|
|
end
|
|
|
|
end
|
|
|
|
subroutine bad1(x)
|
|
!dir$ ignore_tkr x
|
|
!ERROR: !DIR$ IGNORE_TKR may apply only in an interface or a module procedure
|
|
real, intent(in) :: x
|
|
end
|
|
|
|
submodule(m) subm
|
|
contains
|
|
module subroutine t24(x)
|
|
!dir$ ignore_tkr(t) x
|
|
real x(:)
|
|
end
|
|
end
|
|
|
|
program test
|
|
|
|
!ERROR: !DIR$ IGNORE_TKR directive must appear in a subroutine or function
|
|
!dir$ ignore_tkr
|
|
|
|
use m
|
|
real x
|
|
real a(2)
|
|
real m(2,2)
|
|
double precision dx
|
|
|
|
call t1(1)
|
|
call t1(dx)
|
|
call t1('a')
|
|
call t1((1.,2.))
|
|
call t1(.true.)
|
|
|
|
call t2(1)
|
|
!ERROR: Actual argument type 'REAL(8)' is not compatible with dummy argument type 'REAL(4)'
|
|
call t2(dx)
|
|
call t2('a')
|
|
call t2((1.,2.))
|
|
call t2(.true.)
|
|
|
|
!ERROR: Actual argument type 'INTEGER(4)' is not compatible with dummy argument type 'REAL(4)'
|
|
call t3(1)
|
|
call t3(dx)
|
|
!ERROR: passing Hollerith or character literal as if it were BOZ
|
|
call t3('a')
|
|
!ERROR: Actual argument type 'COMPLEX(4)' is not compatible with dummy argument type 'REAL(4)'
|
|
call t3((1.,2.))
|
|
!ERROR: Actual argument type 'LOGICAL(4)' is not compatible with dummy argument type 'REAL(4)'
|
|
call t3(.true.)
|
|
|
|
call t4(x)
|
|
call t4(m)
|
|
call t5(x)
|
|
!WARNING: Actual argument array has fewer elements (2) than dummy argument 'm=' array (4)
|
|
call t5(a)
|
|
|
|
call t6(1)
|
|
call t6(dx)
|
|
call t6('a')
|
|
call t6((1.,2.))
|
|
call t6(.true.)
|
|
call t6(a)
|
|
|
|
call t8(1)
|
|
call t8(dx)
|
|
call t8('a')
|
|
call t8((1.,2.))
|
|
call t8(.true.)
|
|
call t8(a)
|
|
|
|
contains
|
|
subroutine inner(x)
|
|
!dir$ ignore_tkr x
|
|
!ERROR: !DIR$ IGNORE_TKR may apply only in an interface or a module procedure
|
|
real, intent(in) :: x
|
|
end
|
|
end
|