[flang][folding] fix i(a)char folding regression (#155909)
Fixes a bug in folding "ichar" and "iachar" intrinsics introduced
[here](c649d31c59 (r164779170)).
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.
This commit is contained in:
parent
20b86644e4
commit
c7fd821baa
@ -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;
|
||||
|
||||
@ -123,3 +123,12 @@ program test
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user