diff options
author | Peter Klausler <pklausler@nvidia.com> | 2022-05-10 13:42:08 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2022-05-10 16:47:03 -0700 |
commit | 2cd95504df575d129b0c23327962695d47dc25fd (patch) | |
tree | b0efb738e6601b544e1dbee7db26485ad104991a /flang | |
parent | c167c0a4dcdb998affb2756ce76903a12f7d8ca5 (diff) | |
download | llvm-2cd95504df575d129b0c23327962695d47dc25fd.zip llvm-2cd95504df575d129b0c23327962695d47dc25fd.tar.gz llvm-2cd95504df575d129b0c23327962695d47dc25fd.tar.bz2 |
[flang] Allow local variables and function result inquiries in specification expressions
Inquiries into the bounds, size, and length of local variables (and function results)
are acceptable specification expressions. A recent change allowed them for dummy
arguments that are not OPTIONAL or INTENT(OUT), but didn't address other object
entities.
Differential Revision: https://reviews.llvm.org/D125343
Diffstat (limited to 'flang')
-rw-r--r-- | flang/lib/Evaluate/check-expression.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp index 13b48a2c..789e0a2 100644 --- a/flang/lib/Evaluate/check-expression.cpp +++ b/flang/lib/Evaluate/check-expression.cpp @@ -114,7 +114,8 @@ bool IsConstantExprHelper<INVARIANT>::operator()( // been rewritten into DescriptorInquiry operations. if (const auto *intrinsic{std::get_if<SpecificIntrinsic>(&call.proc().u)}) { if (intrinsic->name == "kind" || - intrinsic->name == IntrinsicProcTable::InvalidName) { + intrinsic->name == IntrinsicProcTable::InvalidName || + call.arguments().empty() || !call.arguments()[0]) { // kind is always a constant, and we avoid cascading errors by considering // invalid calls to intrinsics to be constant return true; @@ -539,7 +540,11 @@ public: return std::nullopt; } } - return "reference to local entity '"s + ultimate.name().ToString() + "'"; + if (inInquiry_) { + return std::nullopt; + } else { + return "reference to local entity '"s + ultimate.name().ToString() + "'"; + } } Result operator()(const Component &x) const { |