[flang-commits] [flang] 59f0959 - [flang] Handle empty array references in DATA statements
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue Jun 27 13:29:44 PDT 2023
Author: Peter Klausler
Date: 2023-06-27T13:29:39-07:00
New Revision: 59f0959ba4ef43829a128f42e68fb9f08709a3cf
URL: https://github.com/llvm/llvm-project/commit/59f0959ba4ef43829a128f42e68fb9f08709a3cf
DIFF: https://github.com/llvm/llvm-project/commit/59f0959ba4ef43829a128f42e68fb9f08709a3cf.diff
LOG: [flang] Handle empty array references in DATA statements
When an array reference in a DATA statement is empty due to an
empty vector subscript or a section lower bound being higher than
its upper bound with a positive stride (or lower with negative),
ensure that isEmpty() is correct afterwards so that such an empty
array reference doesn't terminate processing of that DATA statement
block.
Fixes https://github.com/llvm/llvm-project/issues/63512.
Differential Revision: https://reviews.llvm.org/D153799
Added:
Modified:
flang/lib/Evaluate/fold-designator.cpp
flang/test/Semantics/data05.f90
Removed:
################################################################################
diff --git a/flang/lib/Evaluate/fold-designator.cpp b/flang/lib/Evaluate/fold-designator.cpp
index 2168383bc7318..d86b44971cc70 100644
--- a/flang/lib/Evaluate/fold-designator.cpp
+++ b/flang/lib/Evaluate/fold-designator.cpp
@@ -90,6 +90,8 @@ std::optional<OffsetSymbol> DesignatorFolder::FoldDesignator(
result->Augment((at - lower) * stride);
which = quotient;
return true;
+ } else {
+ isEmpty_ = true;
}
}
return false;
@@ -100,16 +102,20 @@ std::optional<OffsetSymbol> DesignatorFolder::FoldDesignator(
auto end{ToInt64(Fold(context_,
triplet.upper().value_or(ExtentExpr{upper})))};
auto step{ToInt64(Fold(context_, triplet.stride()))};
- if (start && end && step && *step != 0) {
- ConstantSubscript range{
- (*end - *start + *step) / *step};
- if (range > 0) {
- auto quotient{which / range};
- auto remainder{which - range * quotient};
- auto j{*start + remainder * *step};
- result->Augment((j - lower) * stride);
- which = quotient;
- return true;
+ if (start && end && step) {
+ if (*step != 0) {
+ ConstantSubscript range{
+ (*end - *start + *step) / *step};
+ if (range > 0) {
+ auto quotient{which / range};
+ auto remainder{which - range * quotient};
+ auto j{*start + remainder * *step};
+ result->Augment((j - lower) * stride);
+ which = quotient;
+ return true;
+ } else {
+ isEmpty_ = true;
+ }
}
}
return false;
diff --git a/flang/test/Semantics/data05.f90 b/flang/test/Semantics/data05.f90
index 35b9ed1548d60..02bfd46632645 100644
--- a/flang/test/Semantics/data05.f90
+++ b/flang/test/Semantics/data05.f90
@@ -89,4 +89,8 @@ subroutine s12
procedure(rfunc), pointer :: pp ! CHECK: pp, EXTERNAL, POINTER (Function, InDataStmt) size=8 offset=0: ProcEntity rfunc => rfunc2
data pp/rfunc2/
end subroutine
+ subroutine s13
+ integer j(2)
+ data j(2:1), j(1:2) /1,2/ ! CHECK: j (InDataStmt) size=8 offset=0: ObjectEntity type: INTEGER(4) shape: 1_8:2_8 init:[INTEGER(4)::1_4,2_4]
+ end subroutine
end module
More information about the flang-commits
mailing list