Author: Carlos Seo Date: 2025-07-24T12:03:42+02:00 New Revision: e43496bacf16938744a87f3f5c2170ffdb10c3ab
URL: https://github.com/llvm/llvm-project/commit/e43496bacf16938744a87f3f5c2170ffdb10c3ab DIFF: https://github.com/llvm/llvm-project/commit/e43496bacf16938744a87f3f5c2170ffdb10c3ab.diff LOG: [Flang] Fix ASSIGN statement (#149941) Handle the case where the assigned variable also has a pointer attribute. Fixes #121721 (cherry picked from commit fc0a978327215aa8883ae6f18d1e316f3c04520a) Added: flang/test/Lower/assign-statement.f90 Modified: flang/lib/Lower/Bridge.cpp Removed: ################################################################################ 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