[flang-commits] [flang] [flang] Associate named constant actual arguments with their storage (PR #222986)
Eugene Epshteyn via flang-commits
flang-commits at lists.llvm.org
Mon Sep 28 18:32:51 PDT 2026
================
@@ -5930,7 +5936,46 @@ MaybeExpr ArgumentAnalyzer::AnalyzeExprOrWholeAssumedSizeArray(
}
}
auto restorer{context_.AllowNullPointer()};
- return context_.Analyze(expr);
+ MaybeExpr result{context_.Analyze(expr)};
+ // For actual arguments of procedure references, retain a designator whose
+ // base is a named constant in designator form instead of replacing it by
+ // its folded Constant value, so that lowering associates the dummy argument
+ // with the named constant's storage. This matters for sequence association
+ // of an array element actual argument (F'2023 15.5.2.12) and whenever the
+ // dummy's address is meaningful (e.g. OpenACC/OpenMP present checks).
+ // The inner Analyze calls below do not apply the outer folding performed
+ // by Analyze(parser::Expr), and folding still sees through the retained
+ // designator wherever a constant value is needed later.
+ if (isProcedureCall_ && result) {
+ // Look only at an expression that is itself a designator: a
+ // parenthesized designator is a primary, i.e. an expression
+ // (F'2023 R1001), and must keep its folded value. Substring actual
+ // arguments (the F'2023 15.5.2.12 p4 form of character sequence
+ // association) are not retained here and keep their folded values.
+ if (const auto *designator{
+ std::get_if<common::Indirection<parser::Designator>>(&expr.u)}) {
+ if (const auto *name{parser::Unwrap<parser::Name>(designator->value())}) {
+ // Whole named-constant array.
+ if (name->symbol &&
+ semantics::IsNamedConstant(name->symbol->GetUltimate()) &&
+ name->symbol->Rank() > 0) {
+ return context_.Analyze(*name);
+ }
+ } else if (result->Rank() == 0) {
+ // Named-constant array element (or array component of a scalar
+ // named constant of derived type), e.g. a(1) or pt%arr(1).
+ if (const auto *ae{
+ parser::Unwrap<parser::ArrayElement>(designator->value())}) {
+ const auto &baseName{parser::GetFirstName(ae->Base())};
+ if (baseName.symbol &&
+ semantics::IsNamedConstant(baseName.symbol->GetUltimate())) {
+ return context_.Analyze(*ae);
+ }
+ }
----------------
eugeneepshteyn wrote:
Yes, it does happen for sections, and this is now supported.
I originally limited the first version to whole arrays and array elements because those were the immediate obvious failure modes. Now with section support handle more corner cases. Various tests were added.
https://github.com/llvm/llvm-project/pull/222986
More information about the flang-commits
mailing list