<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/152312>152312</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [Flang][OpenMP] Assertion `!mold.isAssumedRank() && "cannot create temporary from assumed-rank mold"' failed.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang:openmp
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          k-arrows
      </td>
    </tr>
</table>

<pre>
    Reproducer:
```f90
subroutine s(a)
integer :: a(..)
!$omp parallel reduction(+:a)
!$omp end parallel
end
```

With assertion-enabled flang, compiling the above reproducer results in the following assertion failure:
```txt
flang: /path_to_project/llvm-project/flang/lib/Optimizer/Builder/HLFIRTools.cpp:1352: std::pair<hlfir::Entity, mlir::Value> hlfir::createTempFromMold(mlir::Location, fir::FirOpBuilder &, hlfir::Entity): Assertion `!mold.isAssumedRank() && "cannot create temporary from assumed-rank mold"' failed.
```

Backtrace:
```console
 #0 0x0000729477db3097 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int)
 #1 0x0000729477db0795 llvm::sys::RunSignalHandlers()
 #2 0x0000729477db3e45 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x0000729477442520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007294774969fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007294774969fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007294774969fc pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x0000729477442476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007294774287f3 abort ./stdlib/abort.c:81:7
 #9 0x000072947742871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x0000729477439e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#11 0x0000729472a933f1 
#12 0x0000729473e218c3 Fortran::lower::populateByRefInitAndCleanupRegions(Fortran::lower::AbstractConverter&, mlir::Location, mlir::Type, mlir::Value, mlir::Block*, mlir::Value, mlir::Value, mlir::Region&, Fortran::lower::DeclOperationKind, Fortran::semantics::Symbol const*, bool, bool)
#13 0x0000729473e25db4 mlir::omp::DeclareReductionOp Fortran::lower::omp::ReductionProcessor::createDeclareReduction<mlir::omp::DeclareReductionOp>(Fortran::lower::AbstractConverter&, llvm::StringRef, Fortran::lower::omp::ReductionProcessor::ReductionIdentifier, mlir::Type, mlir::Location, bool)
#14 0x0000729473e25411 bool Fortran::lower::omp::ReductionProcessor::processReductionArguments<mlir::omp::DeclareReductionOp, llvm::SmallVector<tomp::type::ReductionIdentifierT<Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, 0u>>(mlir::Location, Fortran::lower::AbstractConverter&, llvm::SmallVector<tomp::type::ReductionIdentifierT<Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, 0u> const&, llvm::SmallVectorImpl<mlir::Value>&, llvm::SmallVectorImpl<bool>&, llvm::SmallVectorImpl<mlir::Attribute>&, llvm::SmallVectorImpl<Fortran::semantics::Symbol const*> const&)
#15 0x0000729473d58b48 std::_Function_handler<void (tomp::clause::ReductionT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>> const&, Fortran::parser::CharBlock const&), Fortran::lower::omp::ClauseProcessor::processReduction(mlir::Location, mlir::omp::ReductionClauseOps&, llvm::SmallVectorImpl<Fortran::semantics::Symbol const*>&) const::$_15>::_M_invoke(std::_Any_data const&, tomp::clause::ReductionT<Fortran::evaluate::DynamicType, Fortran::lower::omp::IdTyTemplate<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>>, Fortran::evaluate::Expr<Fortran::evaluate::SomeType>> const&, Fortran::parser::CharBlock const&) ClauseProcessor.cpp:0:0
#16 0x0000729473d23715 Fortran::lower::omp::ClauseProcessor::processReduction(mlir::Location, mlir::omp::ReductionClauseOps&, llvm::SmallVectorImpl<Fortran::semantics::Symbol const*>&) const
#17 0x0000729473dbb298 genParallelClauses(Fortran::lower::AbstractConverter&, Fortran::semantics::SemanticsContext&, Fortran::lower::StatementContext&, llvm::SmallVector<Fortran::lower::omp::Clause, 0u> const&, mlir::Location, mlir::omp::detail::Clauses<mlir::omp::AllocateClauseOps, mlir::omp::IfClauseOps, mlir::omp::NumThreadsClauseOps, mlir::omp::PrivateClauseOps, mlir::omp::ProcBindClauseOps, mlir::omp::ReductionClauseOps>&, llvm::SmallVectorImpl<Fortran::semantics::Symbol const*>&) OpenMP.cpp:0:0
#18 0x0000729473db282b genOMPDispatch(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, mlir::Location, llvm::SmallVector<tomp::DirectiveWithClauses<Fortran::lower::omp::Clause>, 0u> const&, tomp::DirectiveWithClauses<Fortran::lower::omp::Clause> const*) OpenMP.cpp:0:0
#19 0x0000729473dab749 Fortran::lower::genOpenMPConstruct(Fortran::lower::AbstractConverter&, Fortran::lower::SymMap&, Fortran::semantics::SemanticsContext&, Fortran::lower::pft::Evaluation&, Fortran::parser::OpenMPConstruct const&)

(trace continues...)
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWd1u47gVfhr6hoghkbIlXfhCcWJs0E0TJMHupUFJRzYbihRIKhP36QtS8o8cO_HOTAu0HWAGkahzvvP38ZA0mTF8JQFmaHKNJjcj1tq10rPXK6a1-mZGuSo3sydotCrbAjSiGQoyNA26f1UaoCAzba5Va7kEbBBJGCIpCjIuLaxAY6dCM8wQScbj7hMiISKRqhvcMM2EAIE1lG1huZKIJIhcI5qxY1mQ5U4eBRnI8tAV9xxkf3K7xswY0A7rCiTLBZS4EkyuEJnjQtUNF1yusF0DZrl6A6x30WENphXWYC7990oJob456R0krhgXrYajRNh3i4KsM0MzjMiiYXa9tGrZaPUPKCwiCyHe6qv9a-_TQvAckcVDY3nN_wkakcV1y0Xpn377fXH39KKUMOOiaRDNQjohzoCxZZfXhnGN6HwtKq67kVtpud24YGuxHfuDiRYQvcUHcoUGZuEF6mahVX2vRIlIslf5XRWsq8cc73QWXD80vXsYkan7eMJ06lzMdilzKSJhrUQ55iYzpq2hfGLy1Zc67XCmGBFSMCmVxZ1n2ELdKM30Blda1a4ETvFKM_mKa-8uQST2BYFy_JEL16x4tZoVx7UqlDRKAApcnWiAg_cgCIKYpFEclzkN0hi7UnUhmY3pHh41l_bZsuL1xWOSZC-k2belMlYDq_ukcGk7-joT4ZGJIE4np0w8tfKZryQTvzFZCtCmS1CPQo4dhWiCB_KIJN7uHBu-4rJSS4tI5t7fFC_9Y9prbPkU-P-dATowEEVkQgLsXeg5-p5Ml9PoSnDZvl-tZNt9KMZGjaeIXAfvXmXvcTQETKdpVeDlsrFrDaxcvnIhlrxuBNQgrScbHiOykI0VbgIdiI0LRLMoQjSLpz345BJwaUFLJj6FjRM3r7ZJmJ6CPdT5FCtJD7Hi44RG8RSvjC-Ah-keEVmM_dvGlNAYh6sMf0dkoRk34IFJjGi2DT0Z4pIkrqjrZdp2qLbs6uWHOr9CF2ivnn5QD3O8lGIpFCuXpaoZ7wrBpY_SDddmVbAOKwxj50zXm2k4nD8RTSGd_jXWeJVts6fhYLYQllJahbj_NpgDFEiYFBQvlLaayW4OCfUN-m7UqKYVzML15gmqO8ltJsu5ACbb5glWXEk3v84pZ7lxvcPOlXwDbd3kmg576mGD3I--bBo41XsHQ9dCFa_91PxU8MRQ53rvzTnvb6AQDw1o7-DfuCw_CBuombS86FvP86bOlcCuNW57Rq6U2P_dVoceVWBS5tGBd6pu9h4wDU_bZf2hOevsTmcn_KhVAcaowUp1jIjo_CK7iN5-R5337fnZai5XT1B9lvAvY9iN35UgLa-4s_Q5cQ4JNixCdFyEKAy9yPf713Svu8-ZXrWuLZuL0zxMWs2E-AMK6_DndqdnXZTnEvKC6PzLAO7Kl43btLiZfSwPb0y0ftzvRt4b_bnEs6rB553eepYc1ffH4YJ2-3xmZ_UDtPyV4V2Gt33rfIru6kYMmLzdEV-g5OfeRZJ7-MxazfPWXmjir7TmQbjbjjDYDdFykuRRsj8kLBet9ExYrvudIp27LaFbp_fMKQRrzTF3PjBmWJCbjWQ1L7bN63-HWwNKDbQaps02rvmaab-YD0pySSLmPtlfNOGzbeNER94pdcgPbiP5k3nXhdePeBlEomU48RnzPLtfcvmmXt3paE--TG6WJbNskNJftPvZtMNHlDo64bkuMR12CULjcPJ_QNUu-HgYfJ6TNMErkI_9T0qdM99zJvjUte3rXEkL7ydLe2Di2TLrj8ND8XPL_oW1O71QXlyvEizj4hDwzK4wE8IhwUFdTwLeVV9J_L2tX_zZ2nwl-aj52wUmHX2vuTsAfi53gpv_hhW8p-dDA_L-8cRETY64ShKSO64-3D_ecNMwW6x_lKeHpNvU96z5-WRuqn6ZuO063v7cepp6X29ub7iGwvI3-JPb9Z6Kl06Dc1vGn2jg4Aj9SX3TYX1ZHkfp2TS6unuguYPWbWH_q2t_dlU7CvJ4l-syl_jfc90Xy2ULZry7Udj-uDsqZ7RMacpGMAvjSRSlAQnj0XoGEwZlmYdhSaO4IlAUURpVVVrSKK2iIh3xGQnIJEiCaRgRSsk4oGkV0GmcJnFQxXGIogBqxsXY8XSs9GrEjWlhFk4IDclIsByE8fcohGxvAlQDsm4QIWhyM9IzfwWQtyuDokBwY80ey3Ir_C3MwqtObtDkussImtz8p39MH7VazNbWNr74ZIHIYsXtus3Hhar7q4yPNxo-HQaRRZ-Rtxn5VwAAAP__-JIqHg">