[flang-commits] [flang] [flang] Catch I/O statement error (PR #116647)
via flang-commits
flang-commits at lists.llvm.org
Mon Nov 18 08:19:14 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Peter Klausler (klausler)
<details>
<summary>Changes</summary>
Fortran doesn't have unformatted internal I/O, so catch attempts to use internal units without a format or namelist specifier.
Fixes https://github.com/llvm/llvm-project/issues/116586.
---
Full diff: https://github.com/llvm/llvm-project/pull/116647.diff
4 Files Affected:
- (modified) flang/lib/Semantics/check-io.cpp (+2)
- (modified) flang/test/Semantics/io03.f90 (+10-2)
- (modified) flang/test/Semantics/io04.f90 (+4-2)
- (modified) flang/test/Semantics/undef-result01.f90 (+1-1)
``````````diff
diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp
index eeeda553d8a467..3c99163c1f134f 100644
--- a/flang/lib/Semantics/check-io.cpp
+++ b/flang/lib/Semantics/check-io.cpp
@@ -860,6 +860,8 @@ void IoChecker::Leave(const parser::WriteStmt &writeStmt) {
void IoChecker::LeaveReadWrite() const {
CheckForRequiredSpecifier(IoSpecKind::Unit); // C1211
+ CheckForRequiredSpecifier(flags_.test(Flag::InternalUnit),
+ "UNIT=internal-file", flags_.test(Flag::FmtOrNml), "FMT or NML");
CheckForProhibitedSpecifier(IoSpecKind::Nml, IoSpecKind::Rec); // C1216
CheckForProhibitedSpecifier(IoSpecKind::Nml, IoSpecKind::Fmt); // C1216
CheckForProhibitedSpecifier(
diff --git a/flang/test/Semantics/io03.f90 b/flang/test/Semantics/io03.f90
index 9cd672ee016968..6c05924f09dce6 100644
--- a/flang/test/Semantics/io03.f90
+++ b/flang/test/Semantics/io03.f90
@@ -58,6 +58,13 @@
read(internal_file2, *) jj
read(internal_file4, *) jj
+ !This is a valid statement but it's not what it looks like; "(internal-file)"
+ !must be parsed as a format expression, not as an internal unit.
+ read(internal_file) jj
+
+ !ERROR: If UNIT=internal-file appears, FMT or NML must also appear
+ read(internal_file, iostat=stat1) jj
+
!ERROR: Internal file must not have a vector subscript
read(internal_fileA(vv), *) jj
@@ -106,11 +113,12 @@
!ERROR: If UNIT=* appears, POS must not appear
read(*, pos=13)
+ !ERROR: If UNIT=internal-file appears, FMT or NML must also appear
!ERROR: If UNIT=internal-file appears, REC must not appear
read(internal_file, rec=13)
!ERROR: If UNIT=internal-file appears, POS must not appear
- read(internal_file, pos=13)
+ read(internal_file, *, pos=13)
!ERROR: If REC appears, END must not appear
read(10, fmt='(I4)', end=9, rec=13) jj
@@ -135,7 +143,7 @@
read(*, asynchronous='yes')
!ERROR: If ASYNCHRONOUS='YES' appears, UNIT=number must also appear
- read(internal_file, asynchronous='y'//'es')
+ read(internal_file, *, asynchronous='y'//'es')
!ERROR: If ID appears, ASYNCHRONOUS='YES' must also appear
read(10, id=id)
diff --git a/flang/test/Semantics/io04.f90 b/flang/test/Semantics/io04.f90
index 685e43dd6e4013..7114f14a9488a7 100644
--- a/flang/test/Semantics/io04.f90
+++ b/flang/test/Semantics/io04.f90
@@ -34,6 +34,7 @@
write(unit=10) 'Ok'
write(*, nnn)
write(10, nnn)
+ !ERROR: If UNIT=internal-file appears, FMT or NML must also appear
write(internal_file)
write(internal_file, *)
write(internal_file, fmt=*)
@@ -55,7 +56,7 @@
allocate(a(8), stat=stat8)
!ERROR: Duplicate UNIT specifier
- write(internal_file, unit=*)
+ write(internal_file, unit=*, fmt=*)
!ERROR: WRITE statement must have a UNIT specifier
write(nml=nnn)
@@ -84,6 +85,7 @@
!ERROR: If UNIT=internal-file appears, POS must not appear
write(internal_file, err=9, pos=n, nml=nnn)
+ !ERROR: If UNIT=internal-file appears, FMT or NML must also appear
!ERROR: If UNIT=internal-file appears, REC must not appear
write(internal_file, rec=n, err=9)
@@ -106,7 +108,7 @@
write(*, asynchronous='yes')
!ERROR: If ASYNCHRONOUS='YES' appears, UNIT=number must also appear
- write(internal_file, asynchronous='yes')
+ write(internal_file, *, asynchronous='yes')
!ERROR: If ID appears, ASYNCHRONOUS='YES' must also appear
write(10, *, id=id) "Ok"
diff --git a/flang/test/Semantics/undef-result01.f90 b/flang/test/Semantics/undef-result01.f90
index 08e7fe1e448998..e1ae58dae7c0a6 100644
--- a/flang/test/Semantics/undef-result01.f90
+++ b/flang/test/Semantics/undef-result01.f90
@@ -117,7 +117,7 @@ function defdByNamelist()
end
character(4) function defdByWrite()
- write(defdByWrite) 'abcd'
+ write(defdByWrite,*) 'abcd'
end
integer function defdBySize()
``````````
</details>
https://github.com/llvm/llvm-project/pull/116647
More information about the flang-commits
mailing list