[flang-commits] [flang] [flang] OPTIONAL char dummy has no defining op; add null check (PR #182582)

via flang-commits flang-commits at lists.llvm.org
Fri Feb 20 12:09:44 PST 2026


https://github.com/tmjbios updated https://github.com/llvm/llvm-project/pull/182582

>From fa03f86bf7991d2e1ab568cf7cec3271bab72d8d Mon Sep 17 00:00:00 2001
From: Ted Johnson <tedmjohnson at protonmail.com>
Date: Fri, 20 Feb 2026 13:43:07 -0600
Subject: [PATCH 1/2] [flang] OPTIONAL char has no defining op; add null check

size.getDefiningOp() returns nullptr for block arguments when
a OPTIONAL character length generated the conditional "fir.if".
Check for a nullptr before calling mlir::isa<> to avoid the crash.
---
 flang/lib/Optimizer/CodeGen/CodeGen.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 93f3806b18648..dc4f11d8ada8c 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -319,7 +319,10 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> {
     unsigned allocaAs = getAllocaAddressSpace(rewriter);
     unsigned programAs = getProgramAddressSpace(rewriter);
 
-    if (mlir::isa<mlir::LLVM::ConstantOp>(size.getDefiningOp())) {
+    // A value defined by a block arg, such as fir.if for a
+    // optional assumed character dummy len, doesn't have a defining op.
+    if (auto *defOp = size.getDefiningOp();
+        defOp && mlir::isa<mlir::LLVM::ConstantOp>(size.getDefiningOp())) {
       // Set the Block in which the llvm alloca should be inserted.
       mlir::Operation *parentOp = rewriter.getInsertionBlock()->getParentOp();
       mlir::Region *parentRegion = rewriter.getInsertionBlock()->getParent();

>From 35f6507bb975d81ad4eabbebe84c72c3838af053 Mon Sep 17 00:00:00 2001
From: tedj <tedmjohnson at protonmail.com>
Date: Fri, 20 Feb 2026 13:09:34 -0700
Subject: [PATCH 2/2] Update flang/lib/Optimizer/CodeGen/CodeGen.cpp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Use isa_and_nonnull, vs separate "auto &&" check.

Co-authored-by: Valentin Clement (バレンタイン クレメン) <clementval at gmail.com>
---
 flang/lib/Optimizer/CodeGen/CodeGen.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index dc4f11d8ada8c..1c5cc3cc1b306 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -321,8 +321,7 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> {
 
     // A value defined by a block arg, such as fir.if for a
     // optional assumed character dummy len, doesn't have a defining op.
-    if (auto *defOp = size.getDefiningOp();
-        defOp && mlir::isa<mlir::LLVM::ConstantOp>(size.getDefiningOp())) {
+    if (mlir::isa_and_nonnull<mlir::LLVM::ConstantOp>(size.getDefiningOp())) {
       // Set the Block in which the llvm alloca should be inserted.
       mlir::Operation *parentOp = rewriter.getInsertionBlock()->getParentOp();
       mlir::Region *parentRegion = rewriter.getInsertionBlock()->getParent();



More information about the flang-commits mailing list