Skip to content

Commit

Permalink
[flang] Don't fold SIZE()/SHAPE() into expression referencing optiona…
Browse files Browse the repository at this point in the history
…l dummy arguments

When computing the shape of an expression at compilation time as part of
folding an intrinsic function like SIZE(), don't create an expression that
increases a dependence on the presence of an optional dummy argument.

Differential Revision: https://reviews.llvm.org/D151737
  • Loading branch information
klausler committed May 31, 2023
1 parent 660e453 commit 71d5a94
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
16 changes: 13 additions & 3 deletions flang/lib/Evaluate/shape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -805,9 +805,19 @@ auto GetShapeHelper::operator()(const ProcedureRef &call) const -> Result {
if (call.Rank() == 0) {
return ScalarShape();
} else if (call.IsElemental()) {
for (const auto &arg : call.arguments()) {
if (arg && arg->Rank() > 0) {
return (*this)(*arg);
// Use the shape of an actual array argument associated with a
// non-OPTIONAL dummy object argument.
if (context_) {
if (auto chars{characteristics::Procedure::FromActuals(
call.proc(), call.arguments(), *context_)}) {
std::size_t j{0};
for (const auto &arg : call.arguments()) {
if (arg && arg->Rank() > 0 && j < chars->dummyArguments.size() &&
!chars->dummyArguments[j].IsOptional()) {
return (*this)(*arg);
}
++j;
}
}
}
return ScalarShape();
Expand Down
16 changes: 16 additions & 0 deletions flang/test/Evaluate/elem-shape.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
! Ensure that optional arguments aren't used to fold SIZE() or SHAPE()
module m
contains
subroutine sub(x,y)
real :: x(:), y(:)
optional x
!CHECK: PRINT *, int(size(y,dim=1,kind=8),kind=4)
print *, size(f(x,y))
end
elemental function f(x,y)
real, intent(in) :: x, y
optional x
f = y
end
end

0 comments on commit 71d5a94

Please sign in to comment.