Skip to content

Conversation

@akuhlens
Copy link
Contributor

Fixes a bug in folding "ichar" and "iachar" intrinsics introduced here.

There was already a slight bug that the coded didn't fold when portability warnings were enabled which has also been fixed and tested for.

@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Aug 28, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 28, 2025

@llvm/pr-subscribers-flang-semantics

Author: Andre Kuhlenschmidt (akuhlens)

Changes

Fixes a bug in folding "ichar" and "iachar" intrinsics introduced here.

There was already a slight bug that the coded didn't fold when portability warnings were enabled which has also been fixed and tested for.


Full diff: https://github.com/llvm/llvm-project/pull/155909.diff

3 Files Affected:

  • (modified) flang/lib/Evaluate/fold-integer.cpp (+6-5)
  • (modified) flang/test/Semantics/intrinsics03.f90 (+9)
  • (modified) flang/test/Semantics/intrinsics04.f90 (+10-1)
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/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 a7d646e5c016e..abb8fe321a572 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 :: 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

@akuhlens akuhlens merged commit c7fd821 into llvm:main Aug 28, 2025
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:semantics flang Flang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants