[flang-commits] [flang] 940871d - [flang] Enforce limit on rank + corank
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue May 10 09:11:38 PDT 2022
Author: Peter Klausler
Date: 2022-05-10T08:53:08-07:00
New Revision: 940871dd289c9f92ee32d899d58538c57c76c16d
URL: https://github.com/llvm/llvm-project/commit/940871dd289c9f92ee32d899d58538c57c76c16d
DIFF: https://github.com/llvm/llvm-project/commit/940871dd289c9f92ee32d899d58538c57c76c16d.diff
LOG: [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
Added:
flang/test/Semantics/maxrank.f90
Modified:
flang/include/flang/Evaluate/real.h
flang/lib/Semantics/check-declarations.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h
index 4e992693535c..2b5562a7eee9 100644
--- a/flang/include/flang/Evaluate/real.h
+++ b/flang/include/flang/Evaluate/real.h
@@ -135,10 +135,6 @@ class Real : public common::RealDetails<PREC> {
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();
diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp
index 42fa416f49af..c92a8dd3429b 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 000000000000..ea3ece95c670
--- /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
More information about the flang-commits
mailing list