There are some exceptional cases where the compiler permits association of procedure pointers or dummy arguments with slightly incompatible procedure targets, but they should not override any incompatibilty of function result types. (Includes a second fix to resolve the original motivating test failure, in which a COMPLEX intrinsic function was getting its result kind divided by two due to an implicit C++ conversion of the kind to a "*kind" parse tree node, and those legacy "COMPLEX*size" type designators' values are twice the type kind value.) Differential Revision: https://reviews.llvm.org/D136964
46 lines
2.3 KiB
Fortran
46 lines
2.3 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
! C1030 - assignment of pointers to intrinsic procedures
|
|
! C1515 - interface definition for procedure pointers
|
|
! C1519 - initialization of pointers to intrinsic procedures
|
|
program main
|
|
intrinsic :: cos ! a specific & generic intrinsic name
|
|
intrinsic :: alog10 ! a specific intrinsic name, not generic
|
|
intrinsic :: null ! a weird special case
|
|
intrinsic :: bessel_j0 ! generic intrinsic, not specific
|
|
intrinsic :: amin0
|
|
intrinsic :: mod
|
|
intrinsic :: llt
|
|
!ERROR: 'haltandcatchfire' is not a known intrinsic procedure
|
|
intrinsic :: haltandcatchfire
|
|
|
|
abstract interface
|
|
logical function chrcmp(a,b)
|
|
character(*), intent(in) :: a
|
|
character(*), intent(in) :: b
|
|
end function chrcmp
|
|
end interface
|
|
|
|
procedure(sin), pointer :: p => cos
|
|
!ERROR: Intrinsic procedure 'amin0' is not an unrestricted specific intrinsic permitted for use as the definition of the interface to procedure pointer 'q'
|
|
procedure(amin0), pointer :: q
|
|
!ERROR: Intrinsic procedure 'bessel_j0' is not an unrestricted specific intrinsic permitted for use as the definition of the interface to procedure pointer 'r'
|
|
procedure(bessel_j0), pointer :: r
|
|
!ERROR: Intrinsic procedure 'llt' is not an unrestricted specific intrinsic permitted for use as the initializer for procedure pointer 's'
|
|
procedure(chrcmp), pointer :: s => llt
|
|
!ERROR: Intrinsic procedure 'bessel_j0' is not an unrestricted specific intrinsic permitted for use as the initializer for procedure pointer 't'
|
|
procedure(cos), pointer :: t => bessel_j0
|
|
procedure(chrcmp), pointer :: u
|
|
p => alog ! valid use of an unrestricted specific intrinsic
|
|
p => alog10 ! ditto, but already declared intrinsic
|
|
p => cos ! ditto, but also generic
|
|
p => tan ! a generic & an unrestricted specific, not already declared
|
|
!ERROR: Function pointer 'p' associated with incompatible function designator 'mod': function results have incompatible types: REAL(4) vs INTEGER(4)
|
|
p => mod
|
|
!ERROR: Function pointer 'p' associated with incompatible function designator 'index': function results have incompatible types: REAL(4) vs INTEGER(4)
|
|
p => index
|
|
!ERROR: 'bessel_j0' is not an unrestricted specific intrinsic procedure
|
|
p => bessel_j0
|
|
!ERROR: 'llt' is not an unrestricted specific intrinsic procedure
|
|
u => llt
|
|
end program main
|