[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