[flang] Enforce limit on rank + corank

Fortran 2018 requires that a compiler allow objects whose rank + corank
is 15, and that's our maximum; detect and diagnose violations.

Differential Revision: https://reviews.llvm.org/D125153
This commit is contained in:
Peter Klausler 2022-04-29 13:23:26 -07:00
parent c813516ef8
commit 940871dd28
3 changed files with 42 additions and 4 deletions

View File

@ -135,10 +135,6 @@ public:
ValueWithRealFlags<Real> MODULO(
const Real &, Rounding rounding = defaultRounding) const;
// DIM(X,Y) = MAX(X-Y, 0)
ValueWithRealFlags<Real> DIM(
const Real &, Rounding rounding = defaultRounding) const;
template <typename INT> constexpr INT EXPONENT() const {
if (Exponent() == maxExponent) {
return INT::HUGE();

View File

@ -457,6 +457,17 @@ void CheckHelper::CheckObjectEntity(
CheckArraySpec(symbol, details.shape());
Check(details.shape());
Check(details.coshape());
if (details.shape().Rank() > common::maxRank) {
messages_.Say(
"'%s' has rank %d, which is greater than the maximum supported rank %d"_err_en_US,
symbol.name(), details.shape().Rank(), common::maxRank);
} else if (details.shape().Rank() + details.coshape().Rank() >
common::maxRank) {
messages_.Say(
"'%s' has rank %d and corank %d, whose sum is greater than the maximum supported rank %d"_err_en_US,
symbol.name(), details.shape().Rank(), details.coshape().Rank(),
common::maxRank);
}
CheckAssumedTypeEntity(symbol, details);
WarnMissingFinal(symbol);
if (!details.coshape().empty()) {

View File

@ -0,0 +1,31 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
! Enforce limits on rank + corank
module m
!ERROR: 'x' has rank 16, which is greater than the maximum supported rank 15
real :: x(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
!ERROR: 'y' has rank 16, which is greater than the maximum supported rank 15
real, allocatable :: y(:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:)
!ERROR: 'z' has rank 16, which is greater than the maximum supported rank 15
real, pointer :: z(:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:)
!ERROR: 'w' has rank 16, which is greater than the maximum supported rank 15
real, dimension(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) :: w
!ERROR: 'a' has rank 15 and corank 1, whose sum is greater than the maximum supported rank 15
real :: a(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)[*]
!ERROR: 'b' has rank 14 and corank 2, whose sum is greater than the maximum supported rank 15
real :: b(1,1,1,1,1,1,1,1,1,1,1,1,1,1)[1,*]
!ERROR: 'c' has rank 14 and corank 2, whose sum is greater than the maximum supported rank 15
real :: c
dimension :: c(1,1,1,1,1,1,1,1,1,1,1,1,1,1)
codimension :: c[1,*]
interface
!ERROR: 'foo' has rank 16, which is greater than the maximum supported rank 15
real function foo()
dimension :: foo(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
end function
end interface
contains
function bar() result(res)
!ERROR: 'res' has rank 16, which is greater than the maximum supported rank 15
real :: res(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
end function
end module