[flang-commits] [flang] [flang][semantics] fix IsConstantExpr for intrinsic with optional argument (PR #161915)
via flang-commits
flang-commits at lists.llvm.org
Fri Oct 3 14:58:28 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Andre Kuhlenschmidt (akuhlens)
<details>
<summary>Changes</summary>
fixes https://github.com/llvm/llvm-project/issues/161694
Exposes that some sequences of duplicate messages are being printed.
---
Full diff: https://github.com/llvm/llvm-project/pull/161915.diff
3 Files Affected:
- (modified) flang/lib/Evaluate/check-expression.cpp (+11-6)
- (modified) flang/test/Semantics/intrinsics03.f90 (+4-1)
- (modified) flang/test/Semantics/intrinsics04.f90 (+4-1)
``````````diff
diff --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp
index 8931cbe485ac2..012b44e7d3747 100644
--- a/flang/lib/Evaluate/check-expression.cpp
+++ b/flang/lib/Evaluate/check-expression.cpp
@@ -135,16 +135,21 @@ 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;
+ // Missing optional arguments are constant
+ if (!(dataDummy &&
+ dataDummy->attrs.test(
+ characteristics::DummyDataObject::Attr::Optional))) {
+ return false;
+ }
} else if (const auto *expr{arg->UnwrapExpr()};
!expr || !(*this)(*expr)) {
return false;
diff --git a/flang/test/Semantics/intrinsics03.f90 b/flang/test/Semantics/intrinsics03.f90
index a5b13b655cf41..2b07c5ee98eaf 100644
--- a/flang/test/Semantics/intrinsics03.f90
+++ b/flang/test/Semantics/intrinsics03.f90
@@ -129,6 +129,9 @@ subroutine ichar_tests()
!Without -Wportability, the warning isn't emitted and the parameter is constant.
integer, parameter :: a2 = ichar('B ')
!ERROR: Character in intrinsic function ichar must have length one
- !ERROR: Must be a constant value
+ !ERROR: Value of named constant 'a3' (ichar("")) cannot be computed as a constant value
+ !ERROR: Character in intrinsic function ichar must have length one
+ !ERROR: Value of named constant 'a3' (ichar("")) cannot be computed as a constant value
+ !ERROR: Character in intrinsic function ichar must have length one
integer, parameter :: a3 = ichar('')
end subroutine
diff --git a/flang/test/Semantics/intrinsics04.f90 b/flang/test/Semantics/intrinsics04.f90
index abb8fe321a572..8b6b29fed2128 100644
--- a/flang/test/Semantics/intrinsics04.f90
+++ b/flang/test/Semantics/intrinsics04.f90
@@ -29,6 +29,9 @@ subroutine ichar_tests()
!WARNING: Character in intrinsic function ichar should have length one [-Wportability]
integer, parameter :: a2 = ichar('B ')
!ERROR: Character in intrinsic function ichar must have length one
- !ERROR: Must be a constant value
+ !ERROR: Value of named constant 'a3' (ichar("")) cannot be computed as a constant value
+ !ERROR: Character in intrinsic function ichar must have length one
+ !ERROR: Value of named constant 'a3' (ichar("")) cannot be computed as a constant value
+ !ERROR: Character in intrinsic function ichar must have length one
integer, parameter :: a3 = ichar('')
end subroutine
``````````
</details>
https://github.com/llvm/llvm-project/pull/161915
More information about the flang-commits
mailing list