The compiler doesn't USE-associate names of intrinsic procedures from modules (in the absence of ONLY:), so that the associating scope doesn't get populated with names of intrinsics that were used only in declarations (e.g., SELECTED_REAL_KIND). A recent bug report (below) shows that we should modify that policy in the case of names that appear in explicit INTRINSIC attribute statements. The behaviors of other Fortran compilers are not consistent and the requirements of the standard are not clear; this fix follows the precedent set by gfortran and nvfortran. Fixes https://github.com/llvm/llvm-project/issues/72084.
38 lines
1.4 KiB
Fortran
38 lines
1.4 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
|
|
module m0
|
|
real, pointer, contiguous :: p1(:) ! ok
|
|
real, pointer :: p2(:)
|
|
end
|
|
module m
|
|
use m0
|
|
!WARNING: Use-associated 'p1' already has 'CONTIGUOUS' attribute
|
|
contiguous p1
|
|
!ERROR: Cannot change CONTIGUOUS attribute on use-associated 'p2'
|
|
contiguous p2
|
|
!PORTABILITY: CONTIGUOUS entity 'x' should be an array pointer, assumed-shape, or assumed-rank
|
|
real, contiguous :: x
|
|
!PORTABILITY: CONTIGUOUS entity 'scalar' should be an array pointer, assumed-shape, or assumed-rank
|
|
real, contiguous, pointer :: scalar
|
|
!PORTABILITY: CONTIGUOUS entity 'allocatable' should be an array pointer, assumed-shape, or assumed-rank
|
|
real, contiguous, allocatable :: allocatable
|
|
contains
|
|
!PORTABILITY: CONTIGUOUS entity 'func' should be an array pointer, assumed-shape, or assumed-rank
|
|
function func(ashape,arank) result(r)
|
|
real, contiguous :: ashape(:) ! ok
|
|
real, contiguous :: arank(..) ! ok
|
|
!PORTABILITY: CONTIGUOUS entity 'r' should be an array pointer, assumed-shape, or assumed-rank
|
|
real :: r(10)
|
|
!PORTABILITY: CONTIGUOUS entity 'r2' should be an array pointer, assumed-shape, or assumed-rank
|
|
real :: r2(10)
|
|
contiguous func
|
|
contiguous r
|
|
contiguous e
|
|
contiguous r2
|
|
!PORTABILITY: CONTIGUOUS entity 'e' should be an array pointer, assumed-shape, or assumed-rank
|
|
entry e() result(r2)
|
|
end
|
|
function fp()
|
|
real, pointer, contiguous :: fp(:) ! ok
|
|
end
|
|
end
|