[flang-commits] [flang] [flang] Don't evaluate initializers for arrays with invalid rank (PR #171163)

Leandro Lupori via flang-commits flang-commits at lists.llvm.org
Tue Dec 9 11:58:41 PST 2025


https://github.com/luporl updated https://github.com/llvm/llvm-project/pull/171163

>From 94e356240e48318a993a887e6c9bc3c58152742a Mon Sep 17 00:00:00 2001
From: Leandro Lupori <leandro.lupori at linaro.org>
Date: Mon, 8 Dec 2025 13:24:03 -0300
Subject: [PATCH 1/2] [flang] Don't evaluate initializers for arrays with
 invalid rank

Evaluating initializers for arrays with a rank greater than the
maximum supported can make the compiler run out of memory.

Fixes #124488
---
 flang/lib/Semantics/resolve-names.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 345a0e4e8ecce..c070546c6729d 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -9209,6 +9209,11 @@ bool DeclarationVisitor::CheckNonPointerInitialization(
 
 void DeclarationVisitor::NonPointerInitialization(
     const parser::Name &name, const parser::ConstantExpr &constExpr) {
+  // Don't evaluate initializers for arrays with a rank greater than the
+  // maximum supported, to avoid running out of memory.
+  if (name.symbol && name.symbol->Rank() > common::maxRank) {
+    return;
+  }
   if (CheckNonPointerInitialization(
           name, /*inLegacyDataInitialization=*/false)) {
     Symbol &ultimate{name.symbol->GetUltimate()};

>From 7cb7be48ecab0244383052805f30e22b244dfba0 Mon Sep 17 00:00:00 2001
From: Leandro Lupori <leandro.lupori at linaro.org>
Date: Mon, 8 Dec 2025 17:27:51 -0300
Subject: [PATCH 2/2] Detect and report errors when initializing arrays with
 invalid rank

---
 flang/lib/Semantics/resolve-names.cpp | 30 ++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index c070546c6729d..eeb6df0def2f9 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1086,6 +1086,7 @@ class DeclarationVisitor : public ArraySpecVisitor,
       const parser::Name &, const parser::InitialDataTarget &);
   void PointerInitialization(
       const parser::Name &, const parser::ProcPointerInit &);
+  bool CheckRank(const Symbol &symbol);
   bool CheckNonPointerInitialization(
       const parser::Name &, bool inLegacyDataInitialization);
   void NonPointerInitialization(
@@ -9052,6 +9053,12 @@ void DeclarationVisitor::Initialization(const parser::Name &name,
     return;
   }
   Symbol &ultimate{name.symbol->GetUltimate()};
+  // Don't evaluate initializers for arrays with a rank greater than the
+  // maximum supported, to avoid running out of memory.
+  if (!CheckRank(ultimate)) {
+    return;
+  }
+
   // TODO: check C762 - all bounds and type parameters of component
   // are colons or constant expressions if component is initialized
   common::visit(
@@ -9178,6 +9185,18 @@ void DeclarationVisitor::PointerInitialization(
   }
 }
 
+bool DeclarationVisitor::CheckRank(const Symbol &symbol) {
+  if (auto *details{symbol.detailsIf<ObjectEntityDetails>()}) {
+    if (details->shape().Rank() > common::maxRank) {
+      Say(symbol.name(),
+          "'%s' has rank %d, which is greater than the maximum supported rank %d"_err_en_US,
+          symbol.name(), details->shape().Rank(), common::maxRank);
+      return false;
+    }
+  }
+  return true;
+}
+
 bool DeclarationVisitor::CheckNonPointerInitialization(
     const parser::Name &name, bool inLegacyDataInitialization) {
   if (!context().HasError(name.symbol)) {
@@ -9209,11 +9228,6 @@ bool DeclarationVisitor::CheckNonPointerInitialization(
 
 void DeclarationVisitor::NonPointerInitialization(
     const parser::Name &name, const parser::ConstantExpr &constExpr) {
-  // Don't evaluate initializers for arrays with a rank greater than the
-  // maximum supported, to avoid running out of memory.
-  if (name.symbol && name.symbol->Rank() > common::maxRank) {
-    return;
-  }
   if (CheckNonPointerInitialization(
           name, /*inLegacyDataInitialization=*/false)) {
     Symbol &ultimate{name.symbol->GetUltimate()};
@@ -10627,11 +10641,13 @@ class DeferredCheckVisitor {
 private:
   void Init(const parser::Name &name,
       const std::optional<parser::Initialization> &init) {
-    if (init) {
+    // Don't evaluate initializers for arrays with a rank greater than the
+    // maximum supported, to avoid running out of memory.
+    if (init && name.symbol && resolver_.CheckRank(*name.symbol)) {
       if (const auto *target{
               std::get_if<parser::InitialDataTarget>(&init->u)}) {
         resolver_.PointerInitialization(name, *target);
-      } else if (name.symbol) {
+      } else {
         if (const auto *object{name.symbol->detailsIf<ObjectEntityDetails>()};
             !object || !object->init()) {
           if (const auto *expr{std::get_if<parser::ConstantExpr>(&init->u)}) {



More information about the flang-commits mailing list