aboutsummaryrefslogtreecommitdiff
path: root/flang
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2022-05-10 13:42:08 -0700
committerPeter Klausler <pklausler@nvidia.com>2022-05-10 16:47:03 -0700
commit2cd95504df575d129b0c23327962695d47dc25fd (patch)
treeb0efb738e6601b544e1dbee7db26485ad104991a /flang
parentc167c0a4dcdb998affb2756ce76903a12f7d8ca5 (diff)
downloadllvm-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.cpp9
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 {