-
Notifications
You must be signed in to change notification settings - Fork 11.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] ASSOCIATE/SELECT TYPE entities aren't pointer/allocatable
Fix what seems to be a regression in semantics in definability checking: the construct entities of ASSOCIATE and SELECT TYPE constructs are never pointers or allocatables, even when their selectors are so. SELECT RANK construct entities, however, can be pointers or allocatables.
- Loading branch information
Showing
2 changed files
with
83 additions
and
1 deletion.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic | ||
! A construct entity does not have the POINTER or ALLOCATABLE attribute, | ||
! except in SELECT RANK. | ||
|
||
subroutine test(up,ua,rp,ra) | ||
class(*), pointer :: up | ||
class(*), allocatable :: ua | ||
real, pointer :: rp(..) | ||
real, allocatable :: ra(..) | ||
real, target :: x | ||
real, pointer :: p | ||
real, allocatable :: a | ||
associate (s => p) | ||
!ERROR: The left-hand side of a pointer assignment is not definable | ||
!BECAUSE: 's' is not a pointer | ||
s => x | ||
!ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
allocate(s) | ||
!ERROR: Name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
deallocate(s) | ||
!ERROR: 's' may not appear in NULLIFY | ||
!BECAUSE: 's' is not a pointer | ||
nullify(s) | ||
end associate | ||
select type(s => up) | ||
type is (real) | ||
!ERROR: The left-hand side of a pointer assignment is not definable | ||
!BECAUSE: 's' is not a pointer | ||
s => x | ||
!ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
allocate(s) | ||
!ERROR: Name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
deallocate(s) | ||
!ERROR: 's' may not appear in NULLIFY | ||
!BECAUSE: 's' is not a pointer | ||
nullify(s) | ||
end select | ||
select rank(s => rp) | ||
rank(0) | ||
s => x ! ok | ||
allocate(s) ! ok | ||
deallocate(s) ! ok | ||
nullify(s) ! ok | ||
!ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE | ||
rank(*) | ||
rank default | ||
!ERROR: The left-hand side of a pointer assignment must not be an assumed-rank dummy argument | ||
!ERROR: pointer 's' associated with object 'x' with incompatible type or shape | ||
s => x | ||
!ERROR: An assumed-rank dummy argument may not appear in an ALLOCATE statement | ||
allocate(s) | ||
deallocate(s) ! ok | ||
nullify(s) ! ok | ||
end select | ||
associate (s => a) | ||
!ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
allocate(s) | ||
!ERROR: Name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
deallocate(s) | ||
end associate | ||
select type(s => ua) | ||
type is (real) | ||
!ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
allocate(s) | ||
!ERROR: Name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute | ||
deallocate(s) | ||
end select | ||
select rank(s => ra) | ||
rank(0) | ||
allocate(s) ! ok | ||
deallocate(s) ! ok | ||
!ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE | ||
rank(*) | ||
rank default | ||
!ERROR: An assumed-rank dummy argument may not appear in an ALLOCATE statement | ||
allocate(s) | ||
deallocate(s) ! ok | ||
end select | ||
end |