Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] Selectors whose expressions are pointers returned from functi…
…ons are valid targets An ASSOCIATE or SELECT TYPE statement's selector whose "right-hand side" is the result of a reference to a function that returns a pointer must be usable as a valid target (but not as a pointer). Differential Revision: https://reviews.llvm.org/D135211
- Loading branch information
Showing
5 changed files
with
99 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
! RUN: %python %S/test_errors.py %s %flang_fc1 | ||
! 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 | ||
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 |