[flang] [llvm] [flang][folding] fix i(a)char folding regression (PR #155909)
Andre Kuhlenschmidt via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 28 13:09:09 PDT 2025
https://github.com/akuhlens updated https://github.com/llvm/llvm-project/pull/155909
>From 34986008e136c3dedc4068910f8f96135e2a4c55 Mon Sep 17 00:00:00 2001
From: Andre Kuhlenschmidt <akuhlenschmi at nvidia.com>
Date: Thu, 28 Aug 2025 12:47:33 -0700
Subject: [PATCH 1/3] [flang][folding] fix ichar regression
---
flang-rt/lib/runtime/io-stmt.cpp | 2 +-
flang/lib/Evaluate/fold-integer.cpp | 11 ++++++-----
flang/test/Semantics/intrinsics04.f90 | 11 ++++++++++-
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/flang-rt/lib/runtime/io-stmt.cpp b/flang-rt/lib/runtime/io-stmt.cpp
index 28149090eb169..85f0b869cb5cc 100644
--- a/flang-rt/lib/runtime/io-stmt.cpp
+++ b/flang-rt/lib/runtime/io-stmt.cpp
@@ -1109,7 +1109,7 @@ template <Direction DIR>
bool ChildListIoStatementState<DIR>::AdvanceRecord(int n) {
#if !defined(RT_DEVICE_AVOID_RECURSION)
// Allow child NAMELIST input to advance
- if (DIR == Direction::Input && this->mutableModes().inNamelist) {
+ if (DIR == Direction::Input) {
return this->child().parent().AdvanceRecord(n);
} else {
return false;
diff --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp
index 00f92d3900c32..3628497531ef1 100644
--- a/flang/lib/Evaluate/fold-integer.cpp
+++ b/flang/lib/Evaluate/fold-integer.cpp
@@ -1050,12 +1050,13 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
context.messages().Say(
"Character in intrinsic function %s must have length one"_err_en_US,
name);
- } else if (len.value() > 1) {
- // Do not die, this was not checked before
- context.Warn(common::UsageWarning::Portability,
- "Character in intrinsic function %s should have length one"_port_en_US,
- name);
} else {
+ // Do not die, this was not checked before
+ if (len.value() > 1) {
+ context.Warn(common::UsageWarning::Portability,
+ "Character in intrinsic function %s should have length one"_port_en_US,
+ name);
+ }
return common::visit(
[&funcRef, &context, &FromInt64](const auto &str) -> Expr<T> {
using Char = typename std::decay_t<decltype(str)>::Result;
diff --git a/flang/test/Semantics/intrinsics04.f90 b/flang/test/Semantics/intrinsics04.f90
index a7d646e5c016e..f5d7956a4bd26 100644
--- a/flang/test/Semantics/intrinsics04.f90
+++ b/flang/test/Semantics/intrinsics04.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/test_errors.py %s %flang_fc1
+! RUN: %python %S/test_errors.py %s %flang_fc1 -Wportability
! A potentially absent actual argument cannot require data type conversion.
subroutine s(o,a,p)
integer(2), intent(in), optional :: o
@@ -23,3 +23,12 @@ subroutine s(o,a,p)
print *, min(1_2, 2_2, a) ! ok
print *, min(1_2, 2_2, p) ! ok
end
+
+subroutine ichar_tests()
+ integer, parameter :: a1 = ichar('B')
+ !WARNING: Character in intrinsic function ichar should have length one [-Wportability]
+ integer, parameter :: a = ichar('B ')
+ !ERROR: Character in intrinsic function ichar must have length one
+ !ERROR: Must be a constant value
+ integer, parameter :: a3 = ichar('')
+end subroutine
>From 9fa048e88522000ead06291acd6c24ce7bcba03e Mon Sep 17 00:00:00 2001
From: Andre Kuhlenschmidt <akuhlenschmi at nvidia.com>
Date: Thu, 28 Aug 2025 12:55:25 -0700
Subject: [PATCH 2/3] remove accidental commit and add negative test
---
flang-rt/lib/runtime/io-stmt.cpp | 2 +-
flang/test/Semantics/intrinsics03.f90 | 9 +++++++++
flang/test/Semantics/intrinsics04.f90 | 2 +-
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/flang-rt/lib/runtime/io-stmt.cpp b/flang-rt/lib/runtime/io-stmt.cpp
index 85f0b869cb5cc..28149090eb169 100644
--- a/flang-rt/lib/runtime/io-stmt.cpp
+++ b/flang-rt/lib/runtime/io-stmt.cpp
@@ -1109,7 +1109,7 @@ template <Direction DIR>
bool ChildListIoStatementState<DIR>::AdvanceRecord(int n) {
#if !defined(RT_DEVICE_AVOID_RECURSION)
// Allow child NAMELIST input to advance
- if (DIR == Direction::Input) {
+ if (DIR == Direction::Input && this->mutableModes().inNamelist) {
return this->child().parent().AdvanceRecord(n);
} else {
return false;
diff --git a/flang/test/Semantics/intrinsics03.f90 b/flang/test/Semantics/intrinsics03.f90
index 03109bc300caf..dbf0967c914fb 100644
--- a/flang/test/Semantics/intrinsics03.f90
+++ b/flang/test/Semantics/intrinsics03.f90
@@ -123,3 +123,12 @@ subroutine s4(ix)
call s4(index3)
call s4(index4) ! ok
end
+
+subroutine ichar_tests()
+ integer, parameter :: a1 = ichar('B')
+ !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
+ integer, parameter :: a3 = ichar('')
+end subroutine
\ No newline at end of file
diff --git a/flang/test/Semantics/intrinsics04.f90 b/flang/test/Semantics/intrinsics04.f90
index f5d7956a4bd26..abb8fe321a572 100644
--- a/flang/test/Semantics/intrinsics04.f90
+++ b/flang/test/Semantics/intrinsics04.f90
@@ -27,7 +27,7 @@ subroutine s(o,a,p)
subroutine ichar_tests()
integer, parameter :: a1 = ichar('B')
!WARNING: Character in intrinsic function ichar should have length one [-Wportability]
- integer, parameter :: a = ichar('B ')
+ integer, parameter :: a2 = ichar('B ')
!ERROR: Character in intrinsic function ichar must have length one
!ERROR: Must be a constant value
integer, parameter :: a3 = ichar('')
>From 85b2e6ecd9a05f22fc6322fa8d01ff789ab83269 Mon Sep 17 00:00:00 2001
From: Andre Kuhlenschmidt <akuhlenschmi at nvidia.com>
Date: Thu, 28 Aug 2025 13:08:56 -0700
Subject: [PATCH 3/3] add newline at end of file
---
flang/test/Semantics/intrinsics03.f90 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang/test/Semantics/intrinsics03.f90 b/flang/test/Semantics/intrinsics03.f90
index dbf0967c914fb..a5b13b655cf41 100644
--- a/flang/test/Semantics/intrinsics03.f90
+++ b/flang/test/Semantics/intrinsics03.f90
@@ -131,4 +131,4 @@ subroutine ichar_tests()
!ERROR: Character in intrinsic function ichar must have length one
!ERROR: Must be a constant value
integer, parameter :: a3 = ichar('')
-end subroutine
\ No newline at end of file
+end subroutine
More information about the llvm-commits
mailing list