Establish a set of optional usage warnings, and enable some only in "-pedantic" mode that, in our subjective experience with application codes, seem to issue frequently without indicating usage that really needs to be corrected. By default, with this patch the compiler should appear to be somewhat less persnickety but not less informative. Differential Revision: https://reviews.llvm.org/D150710
48 lines
1.7 KiB
Fortran
48 lines
1.7 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
|
|
! Tests of selectors whose defining expressions are pointer-valued functions;
|
|
! they must be valid targets, but not pointers.
|
|
! (F'2018 11.1.3.3 p1) "The associating entity does not have the ALLOCATABLE or
|
|
! POINTER attributes; it has the TARGET attribute if and only if the selector
|
|
! is a variable and has either the TARGET or POINTER attribute."
|
|
module m1
|
|
type t
|
|
contains
|
|
procedure, nopass :: iptr
|
|
end type
|
|
contains
|
|
function iptr(n)
|
|
integer, intent(in), target :: n
|
|
integer, pointer :: iptr
|
|
!WARNING: Pointer target is not a definable variable
|
|
!BECAUSE: 'n' is an INTENT(IN) dummy argument
|
|
iptr => n
|
|
end function
|
|
subroutine test
|
|
type(t) tv
|
|
integer, target :: itarget
|
|
integer, pointer :: ip
|
|
associate (sel => iptr(itarget))
|
|
ip => sel
|
|
!ERROR: POINTER= argument of ASSOCIATED() must be a POINTER
|
|
if (.not. associated(sel)) stop
|
|
end associate
|
|
associate (sel => tv%iptr(itarget))
|
|
ip => sel
|
|
!ERROR: POINTER= argument of ASSOCIATED() must be a POINTER
|
|
if (.not. associated(sel)) stop
|
|
end associate
|
|
associate (sel => (iptr(itarget)))
|
|
!ERROR: In assignment to object pointer 'ip', the target 'sel' is not an object with POINTER or TARGET attributes
|
|
ip => sel
|
|
!ERROR: POINTER= argument of ASSOCIATED() must be a POINTER
|
|
if (.not. associated(sel)) stop
|
|
end associate
|
|
associate (sel => 0 + iptr(itarget))
|
|
!ERROR: In assignment to object pointer 'ip', the target 'sel' is not an object with POINTER or TARGET attributes
|
|
ip => sel
|
|
!ERROR: POINTER= argument of ASSOCIATED() must be a POINTER
|
|
if (.not. associated(sel)) stop
|
|
end associate
|
|
end subroutine
|
|
end module
|