forked from OSchip/llvm-project
[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:
parent
c813516ef8
commit
940871dd28
|
@ -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();
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue