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> 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 { using Char = typename std::decay_t::Result; diff --git a/flang/test/Semantics/intrinsics03.f90 b/flang/test/Semantics/intrinsics03.f90 index 03109bc300caf..a5b13b655cf41 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 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