diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h --- a/flang/include/flang/Evaluate/real.h +++ b/flang/include/flang/Evaluate/real.h @@ -135,10 +135,6 @@ ValueWithRealFlags MODULO( const Real &, Rounding rounding = defaultRounding) const; - // DIM(X,Y) = MAX(X-Y, 0) - ValueWithRealFlags DIM( - const Real &, Rounding rounding = defaultRounding) const; - template constexpr INT EXPONENT() const { if (Exponent() == maxExponent) { return INT::HUGE(); diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -457,6 +457,17 @@ 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()) { diff --git a/flang/test/Semantics/maxrank.f90 b/flang/test/Semantics/maxrank.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/maxrank.f90 @@ -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