diff options
Diffstat (limited to 'flang/lib/Evaluate/check-expression.cpp')
-rw-r--r-- | flang/lib/Evaluate/check-expression.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp index 8931cbe..647eebaaa0 100644 --- a/flang/lib/Evaluate/check-expression.cpp +++ b/flang/lib/Evaluate/check-expression.cpp @@ -135,16 +135,22 @@ bool IsConstantExprHelper<INVARIANT>::operator()( } else if (proc.IsPure()) { std::size_t j{0}; for (const auto &arg : call.arguments()) { - if (const auto *dataDummy{j < proc.dummyArguments.size() - ? std::get_if<characteristics::DummyDataObject>( - &proc.dummyArguments[j].u) - : nullptr}; - dataDummy && + const auto *dataDummy{j < proc.dummyArguments.size() + ? std::get_if<characteristics::DummyDataObject>( + &proc.dummyArguments[j].u) + : nullptr}; + if (dataDummy && dataDummy->attrs.test( characteristics::DummyDataObject::Attr::OnlyIntrinsicInquiry)) { // The value of the argument doesn't matter } else if (!arg) { - return false; + if (dataDummy && + dataDummy->attrs.test( + characteristics::DummyDataObject::Attr::Optional)) { + // Missing optional arguments are okay. + } else { + return false; + } } else if (const auto *expr{arg->UnwrapExpr()}; !expr || !(*this)(*expr)) { return false; |