[flang-commits] [flang] [flang][lowering] lowering assigned goto of allocatable variable (PR #175874)

Andre Kuhlenschmidt via flang-commits flang-commits at lists.llvm.org
Tue Jan 13 16:47:32 PST 2026


https://github.com/akuhlens created https://github.com/llvm/llvm-project/pull/175874

towards [#173594](https://github.com/llvm/llvm-project/issues/173594)

This PR adds a lowering for `AssignedGoto`s that reference an allocatable variable.

>From f52f6091fea3c3768b84679946b000b532522225 Mon Sep 17 00:00:00 2001
From: Andre Kuhlenschmidt <akuhlenschmi at nvidia.com>
Date: Tue, 13 Jan 2026 16:04:06 -0800
Subject: [PATCH] initial commit

---
 flang/lib/Lower/Bridge.cpp         |  6 +++++-
 flang/test/Lower/assigned-goto.f90 | 20 ++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 5cf3daccc4630..b8a8c8fe0d24e 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -2132,8 +2132,12 @@ class FirConverter : public Fortran::lower::AbstractConverter {
       }
     }
     if (!labelList.empty()) {
-      auto selectExpr =
+      mlir::Value selectExpr =
           fir::LoadOp::create(*builder, loc, getSymbolAddress(symbol));
+      if (Fortran::semantics::IsAllocatableOrPointer(symbol)) {
+        selectExpr = fir::BoxAddrOp::create(*builder, loc, selectExpr);
+        selectExpr = fir::LoadOp::create(*builder, loc, selectExpr);
+      }
       // Add a default error target in case the goto is nonconforming.
       mlir::Block *errorBlock =
           builder->getBlock()->splitBlock(builder->getInsertionPoint());
diff --git a/flang/test/Lower/assigned-goto.f90 b/flang/test/Lower/assigned-goto.f90
index 4184839337de1..15bc8a9c95962 100644
--- a/flang/test/Lower/assigned-goto.f90
+++ b/flang/test/Lower/assigned-goto.f90
@@ -35,6 +35,26 @@ subroutine list
  42 print*, 300, V
  end
 
+ subroutine allocated
+    integer, allocatable :: L
+    integer :: V
+ 13 V = 1
+    allocate(L)
+    ! CHECK: %[[N0:.+]] = fir.box_addr %{{.+}}
+    ! CHECK: fir.store %c31{{.*}} to %[[N0]]
+    assign 31 to L
+    ! CHECK: %[[N1:.+]] = fir.box_addr %{{.+}}
+    ! CHECK: %[[N2:.+]] = fir.load %[[N1]]
+    ! CHECK: fir.select %[[N2]] : i32 [31, ^bb{{.}}, unit, ^bb{{.}}]
+    ! CHECK: fir.call @_FortranAReportFatalUserError
+    goto L
+ 23 V = 2
+    goto 41
+ 31 V = 3
+ 41 print*, 3, V
+ end subroutine allocated
+
     call nolist
     call list
+    call allocated
  end



More information about the flang-commits mailing list