diff --git a/flang/include/flang/Lower/ConvertExpr.h b/flang/include/flang/Lower/ConvertExpr.h --- a/flang/include/flang/Lower/ConvertExpr.h +++ b/flang/include/flang/Lower/ConvertExpr.h @@ -40,6 +40,7 @@ class ImplicitIterSpace; class StatementContext; class SymMap; +struct SymbolBox; /// Create an extended expression value. fir::ExtendedValue createSomeExtendedExpression(mlir::Location loc, @@ -225,6 +226,10 @@ SymMap &symMap, StatementContext &stmtCtx, bool isUserDefAssignment); +fir::ExtendedValue +symBoxToExtendedValue(const Fortran::lower::SymbolBox &symBox, + mlir::Location loc, fir::FirOpBuilder &builder); + // Attribute for an alloca that is a trivial adaptor for converting a value to // pass-by-ref semantics for a VALUE parameter. The optimizer may be able to // eliminate these. diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -426,21 +426,6 @@ return lookupSymbol(sym).getAddr(); } - fir::ExtendedValue - symBoxToExtendedValue(const Fortran::lower::SymbolBox &symBox) { - return symBox.match( - [](const Fortran::lower::SymbolBox::Intrinsic &box) - -> fir::ExtendedValue { return box.getAddr(); }, - [](const Fortran::lower::SymbolBox::None &) -> fir::ExtendedValue { - llvm::report_fatal_error("symbol not mapped"); - }, - [&](const fir::FortranVariableOpInterface &x) -> fir::ExtendedValue { - return hlfir::translateToExtendedValue(getCurrentLocation(), - getFirOpBuilder(), x); - }, - [](const auto &box) -> fir::ExtendedValue { return box; }); - } - fir::ExtendedValue getSymbolExtendedValue(const Fortran::semantics::Symbol &sym, Fortran::lower::SymMap *symMap) override final { @@ -451,7 +436,7 @@ fir::emitFatalError(getCurrentLocation(), "symbol is not mapped to any IR value"); } - return symBoxToExtendedValue(sb); + return symBoxToExtendedValue(sb, getCurrentLocation(), getFirOpBuilder()); } mlir::Value impliedDoBinding(llvm::StringRef name) override final { @@ -884,7 +869,8 @@ } fir::ExtendedValue getExtendedValue(Fortran::lower::SymbolBox sb) { - fir::ExtendedValue exv = symBoxToExtendedValue(sb); + fir::ExtendedValue exv = + symBoxToExtendedValue(sb, getCurrentLocation(), getFirOpBuilder()); // Dereference pointers and allocatables. if (const auto *box = exv.getBoxOf()) return fir::factory::genMutableBoxRead(*builder, getCurrentLocation(), diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp --- a/flang/lib/Lower/ConvertExpr.cpp +++ b/flang/lib/Lower/ConvertExpr.cpp @@ -1844,7 +1844,7 @@ const Fortran::evaluate::Symbol *assumedTypeSym = arg.value()->GetAssumedTypeDummy(); auto symBox = symMap.lookupSymbol(*assumedTypeSym); - operands.emplace_back(symBox.getAddr()); + operands.emplace_back(symBoxToExtendedValue(symBox, loc, builder)); continue; } if (!expr) { @@ -7451,3 +7451,19 @@ esp.resetBindings(); esp.incrementCounter(); } + +fir::ExtendedValue +Fortran::lower::symBoxToExtendedValue(const Fortran::lower::SymbolBox &symBox, + mlir::Location loc, + fir::FirOpBuilder &builder) { + return symBox.match( + [](const Fortran::lower::SymbolBox::Intrinsic &box) + -> fir::ExtendedValue { return box.getAddr(); }, + [](const Fortran::lower::SymbolBox::None &) -> fir::ExtendedValue { + llvm::report_fatal_error("symbol not mapped"); + }, + [&](const fir::FortranVariableOpInterface &x) -> fir::ExtendedValue { + return hlfir::translateToExtendedValue(loc, builder, x); + }, + [](const auto &box) -> fir::ExtendedValue { return box; }); +} diff --git a/flang/test/Lower/assumed-type.f90 b/flang/test/Lower/assumed-type.f90 --- a/flang/test/Lower/assumed-type.f90 +++ b/flang/test/Lower/assumed-type.f90 @@ -48,4 +48,14 @@ ! CHECK-SAME: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a", fir.optional}) { ! CHECK: %{{.*}} = fir.is_present %[[ARG0]] : (!fir.box>) -> i1 + subroutine assumed_type_lbound(a) + type(*), optional :: a(:,:) + print*,lbound(a,dim=1) + end subroutine + +! CHECK-LABEL: func.func @_QMassumed_type_testPassumed_type_lbound( +! CHECK-SAME: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a", fir.optional}) { +! CHECK: %[[C1:.*]] = arith.constant 1 : i32 +! CHECK: %{{.*}} = fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[C1]]) {{.*}} : (!fir.ref, i32) -> i1 + end module