https://github.com/tru updated https://github.com/llvm/llvm-project/pull/150228
>From e43496bacf16938744a87f3f5c2170ffdb10c3ab Mon Sep 17 00:00:00 2001 From: Carlos Seo <carlos....@linaro.org> Date: Wed, 23 Jul 2025 11:16:11 -0300 Subject: [PATCH] [Flang] Fix ASSIGN statement (#149941) Handle the case where the assigned variable also has a pointer attribute. Fixes #121721 (cherry picked from commit fc0a978327215aa8883ae6f18d1e316f3c04520a) --- flang/lib/Lower/Bridge.cpp | 28 +++++++++++++++++++++++++-- flang/test/Lower/assign-statement.f90 | 12 ++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 flang/test/Lower/assign-statement.f90 diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index eeae24da26796..2105fc14b0a6f 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -5505,10 +5505,34 @@ 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 &) { 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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits