From 940871dd289c9f92ee32d899d58538c57c76c16d Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Fri, 29 Apr 2022 13:23:26 -0700 Subject: [PATCH] [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 --- flang/include/flang/Evaluate/real.h | 4 ---- flang/lib/Semantics/check-declarations.cpp | 11 +++++++++++ flang/test/Semantics/maxrank.f90 | 31 ++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 flang/test/Semantics/maxrank.f90 diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h index 4e99269..2b5562a 100644 --- a/flang/include/flang/Evaluate/real.h +++ b/flang/include/flang/Evaluate/real.h @@ -135,10 +135,6 @@ public: 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 index 42fa416..c92a8dd 100644 --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -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()) { diff --git a/flang/test/Semantics/maxrank.f90 b/flang/test/Semantics/maxrank.f90 new file mode 100644 index 0000000..ea3ece9 --- /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 -- 2.7.4