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

via flang-commits flang-commits at lists.llvm.org
Tue Jan 13 16:48:07 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Andre Kuhlenschmidt (akuhlens)

<details>
<summary>Changes</summary>

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

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

---
Full diff: https://github.com/llvm/llvm-project/pull/175874.diff


2 Files Affected:

- (modified) flang/lib/Lower/Bridge.cpp (+5-1) 
- (modified) flang/test/Lower/assigned-goto.f90 (+20) 


``````````diff
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

``````````

</details>


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


More information about the flang-commits mailing list