[flang][intrinsic] restrict kind of get_command(_argument) to >= 2 (#139291)
Previously the following program would have failed with a runtime
assertion violation. This PR restricts the type information such that
this assertion failure isn't reachable. The example below demonstrates
the change.
```bash
$ cat error.f90
integer (kind=1) :: i
call get_command(length=i)
print *, i
end
$ cat good.f90
integer (kind=2) :: i
call get_command(length=i)
print *, i
end
$ prior/flang error.f90 && ./a.out
fatal Fortran runtime error(/home/akuhlenschmi/work/lorado/src/llvm-project/t.f90:2): Internal error: RUNTIME_CHECK(IsValidIntDescriptor(length)) failed at /home/akuhlenschmi/work/lorado/src/llvm-project/flang-rt/lib/runtime/command.cpp(154)
Aborted (core dumped)
$ prior/flang good.f90 && ./a.out
7
$ current/flang error.f90 && ./a.out
error: Semantic errors in t.f90
./t.f90:2:25: error: Actual argument for 'length=' has bad type or kind 'INTEGER(1)'
call get_command(length=i)
^
$ current/flang good.f90 && ./a.out
7
```
Also while making the change, I noticed that "get_command_argument"
suffers from the same issue, so I made a similar change for it.
This commit is contained in:
committed by
GitHub
parent
12e6622d4a
commit
82982d74e7
@@ -1587,8 +1587,8 @@ static const IntrinsicInterface intrinsicSubroutine[]{
|
||||
{"get_command",
|
||||
{{"command", DefaultChar, Rank::scalar, Optionality::optional,
|
||||
common::Intent::Out},
|
||||
{"length", AnyInt, Rank::scalar, Optionality::optional,
|
||||
common::Intent::Out},
|
||||
{"length", TypePattern{IntType, KindCode::greaterOrEqualToKind, 2},
|
||||
Rank::scalar, Optionality::optional, common::Intent::Out},
|
||||
{"status", AnyInt, Rank::scalar, Optionality::optional,
|
||||
common::Intent::Out},
|
||||
{"errmsg", DefaultChar, Rank::scalar, Optionality::optional,
|
||||
@@ -1598,8 +1598,8 @@ static const IntrinsicInterface intrinsicSubroutine[]{
|
||||
{{"number", AnyInt, Rank::scalar},
|
||||
{"value", DefaultChar, Rank::scalar, Optionality::optional,
|
||||
common::Intent::Out},
|
||||
{"length", AnyInt, Rank::scalar, Optionality::optional,
|
||||
common::Intent::Out},
|
||||
{"length", TypePattern{IntType, KindCode::greaterOrEqualToKind, 2},
|
||||
Rank::scalar, Optionality::optional, common::Intent::Out},
|
||||
{"status", AnyInt, Rank::scalar, Optionality::optional,
|
||||
common::Intent::Out},
|
||||
{"errmsg", DefaultChar, Rank::scalar, Optionality::optional,
|
||||
|
||||
30
flang/test/Semantics/command.f90
Normal file
30
flang/test/Semantics/command.f90
Normal file
@@ -0,0 +1,30 @@
|
||||
! RUN: %python %S/test_errors.py %s %flang_fc1
|
||||
program command
|
||||
implicit none
|
||||
Integer(1) :: i1
|
||||
Integer(2) :: i2
|
||||
Integer(4) :: i4
|
||||
Integer(8) :: i8
|
||||
Integer(16) :: i16
|
||||
Integer :: a
|
||||
!ERROR: Actual argument for 'length=' has bad type or kind 'INTEGER(1)'
|
||||
call get_command(length=i1)
|
||||
!OK:
|
||||
call get_command(length=i2)
|
||||
!OK:
|
||||
call get_command(length=i4)
|
||||
!OK:
|
||||
call get_command(length=i8)
|
||||
!OK:
|
||||
call get_command(length=i16)
|
||||
!ERROR: Actual argument for 'length=' has bad type or kind 'INTEGER(1)'
|
||||
call get_command_argument(number=a,length=i1)
|
||||
!OK:
|
||||
call get_command_argument(number=a,length=i2)
|
||||
!OK:
|
||||
call get_command_argument(number=a,length=i4)
|
||||
!OK:
|
||||
call get_command_argument(number=a,length=i8)
|
||||
!OK:
|
||||
call get_command_argument(number=a,length=i16)
|
||||
end program
|
||||
Reference in New Issue
Block a user