[flang-commits] [flang] [flang] Add parser support for explicit-shape-bounds-spec (PR #188447)
Eugene Epshteyn via flang-commits
flang-commits at lists.llvm.org
Tue Mar 31 08:32:59 PDT 2026
================
@@ -237,15 +238,79 @@ ArraySpec ArraySpecAnalyzer::Analyze(const parser::ComponentArraySpec &x) {
CHECK(!arraySpec_.empty());
return arraySpec_;
}
+
+static bool shouldRewriteShapeSpecListToExplicitBounds(
+ SemanticsContext &context, const parser::ArraySpec &x) {
+ auto &explicitShapeSpecList{std::get<std::list<parser::ExplicitShapeSpec>>(
+ const_cast<parser::ArraySpec&>(x).u)};
+
+ if (explicitShapeSpecList.size() != 1) {
+ return false;
+ }
+
+ auto &explicitShapeSpec{explicitShapeSpecList.front()};
+ const auto &upperBound{std::get<1>(explicitShapeSpec.t)};
+ const auto &lowerBoundOpt{std::get<0>(explicitShapeSpec.t)};
+
+ bool foundArray{false};
+
+ if (MaybeExpr analyzedExpr = AnalyzeExpr(context, upperBound.v.thing.thing.value());
+ analyzedExpr && (analyzedExpr->Rank() > 0)) {
+ foundArray = true;
+ }
+
+ if (lowerBoundOpt) {
+ const auto &lowerBound{*lowerBoundOpt};
+ if (MaybeExpr analyzedExpr = AnalyzeExpr(context, lowerBound.v.thing.thing.value());
+ analyzedExpr && (analyzedExpr->Rank() > 0)) {
+ foundArray = true;
+ }
+ }
+
+ return foundArray;
+}
+
+static void rewriteShapeSpecListToExplicitBounds(const parser::ArraySpec &x) {
+ auto &explicitShapeSpecList{std::get<std::list<parser::ExplicitShapeSpec>>(
+ const_cast<parser::ArraySpec&>(x).u)};
+ auto &mutableArraySpec{const_cast<parser::ArraySpec&>(x)};
+ auto &mutableExplicitShapeSpec{explicitShapeSpecList.front()};
+
+ auto &mutableUpperBound{std::get<1>(mutableExplicitShapeSpec.t)};
+ parser::IntExpr upperIntExpr{std::move(mutableUpperBound.v.thing)};
+
+ auto &lowerBoundOpt{std::get<0>(mutableExplicitShapeSpec.t)};
+ std::optional<parser::IntExpr> lowerIntExpr;
+ if (lowerBoundOpt) {
+ auto &mutableLowerBound{std::get<0>(mutableExplicitShapeSpec.t)};
----------------
eugeneepshteyn wrote:
Aren't `lowerBoundOpt` and `mutableLowerBound` the same? They both do `std::get<0>(mutableExplicitShapeSpec.t)`
https://github.com/llvm/llvm-project/pull/188447
More information about the flang-commits
mailing list