[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