[flang-commits] [flang] [Flang] Fix ASSIGN statement (PR #149941)

Carlos Seo via flang-commits flang-commits at lists.llvm.org
Tue Jul 22 08:09:17 PDT 2025


https://github.com/ceseo updated https://github.com/llvm/llvm-project/pull/149941

>From e468ec6f7e4034578f0fe6e6a6e72e6a182fc4fd Mon Sep 17 00:00:00 2001
From: Carlos Seo <carlos.seo at linaro.org>
Date: Mon, 21 Jul 2025 23:11:16 +0000
Subject: [PATCH 1/3] [Flang] Fix ASSIGN statement

Handle the case where the assigned variable also has a pointer attribute.

Fixes #121721
---
 flang/lib/Lower/Bridge.cpp | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 7ce397a11861b..243fda63d5e29 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -5506,10 +5506,35 @@ class FirConverter : public Fortran::lower::AbstractConverter {
   void genFIR(const Fortran::parser::AssignStmt &stmt) {
     const Fortran::semantics::Symbol &symbol =
         *std::get<Fortran::parser::Name>(stmt.t).symbol;
+
     mlir::Location loc = toLocation();
+    mlir::Type symbolType = genType(symbol);
+    mlir::Value addr = getSymbolAddress(symbol);
+
+    // Handle the case where the assigned variable is declared as a pointer
+    if (auto eleTy = fir::dyn_cast_ptrOrBoxEleTy(symbolType)) {
+      if (auto ptrType = mlir::dyn_cast<fir::PointerType>(eleTy)) {
+        symbolType = ptrType.getEleTy();
+      } else {
+        symbolType = eleTy;
+      }
+    }
+    else if (auto ptrType = mlir::dyn_cast<fir::PointerType>(symbolType)) {
+      symbolType = ptrType.getEleTy();
+    }
+
     mlir::Value labelValue = builder->createIntegerConstant(
-        loc, genType(symbol), std::get<Fortran::parser::Label>(stmt.t));
-    builder->create<fir::StoreOp>(loc, labelValue, getSymbolAddress(symbol));
+        loc, symbolType, std::get<Fortran::parser::Label>(stmt.t));
+
+    // If the address points to a boxed pointer, we need to dereference it
+    if (auto refType = mlir::dyn_cast<fir::ReferenceType>(addr.getType())) {
+      if (auto boxType = mlir::dyn_cast<fir::BoxType>(refType.getEleTy())) {
+        mlir::Value boxValue = builder->create<fir::LoadOp>(loc, addr);
+        addr = builder->create<fir::BoxAddrOp>(loc, boxValue);
+      }
+    }
+
+    builder->create<fir::StoreOp>(loc, labelValue, addr);
   }
 
   void genFIR(const Fortran::parser::FormatStmt &) {

>From 04d5cd81990032aa1a21de253983363331f6df1a Mon Sep 17 00:00:00 2001
From: Carlos Seo <carlos.seo at linaro.org>
Date: Mon, 21 Jul 2025 23:35:54 +0000
Subject: [PATCH 2/3] Fix formatting

---
 flang/lib/Lower/Bridge.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 243fda63d5e29..9c0fcfb8c74ba 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -5518,8 +5518,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
       } else {
         symbolType = eleTy;
       }
-    }
-    else if (auto ptrType = mlir::dyn_cast<fir::PointerType>(symbolType)) {
+    } else if (auto ptrType = mlir::dyn_cast<fir::PointerType>(symbolType)) {
       symbolType = ptrType.getEleTy();
     }
 

>From 2de6a3ed9386199ca77cfa16c964f0c86c4fa278 Mon Sep 17 00:00:00 2001
From: Carlos Seo <carlos.seo at linaro.org>
Date: Tue, 22 Jul 2025 15:08:24 +0000
Subject: [PATCH 3/3] Added testcase

---
 flang/test/Lower/assign-statement.f90 | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 flang/test/Lower/assign-statement.f90

diff --git a/flang/test/Lower/assign-statement.f90 b/flang/test/Lower/assign-statement.f90
new file mode 100644
index 0000000000000..342355bf469c8
--- /dev/null
+++ b/flang/test/Lower/assign-statement.f90
@@ -0,0 +1,12 @@
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
+
+  ! CHECK-LABEL: func @_QQmain
+  program main
+  integer :: ip
+  pointer :: ip
+
+  allocate(ip)
+  assign 10 to ip
+  ! CHECK: fir.store %c10_i32 to %11 : !fir.ptr<i32>
+  10 return
+  end program main



More information about the flang-commits mailing list