[flang-commits] [flang] [flang] Accept L0 (PR #121998)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue Jan 7 13:40:38 PST 2025
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/121998
Accept a zero field width for formatted logical output (L0), interpreting it as if it had been L1.
>From 7e6eaefb057da72ad96c2157616bb82d6e80bfbf Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Tue, 7 Jan 2025 13:33:04 -0800
Subject: [PATCH] [flang] Accept L0
Accept a zero field width for formatted logical output (L0), interpreting
it as if it had been L1.
---
flang/docs/Extensions.md | 1 +
flang/include/flang/Common/format.h | 11 +++++++----
flang/test/Semantics/io07.f90 | 4 ++--
flang/test/Semantics/io08.f90 | 3 +--
flang/unittests/Runtime/LogicalFormatTest.cpp | 2 +-
5 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
index 2d1c967a6068de..6a3186968a58c7 100644
--- a/flang/docs/Extensions.md
+++ b/flang/docs/Extensions.md
@@ -406,6 +406,7 @@ end
* A character length specifier in a component or entity declaration
is accepted before an array specification (`ch*3(2)`) as well
as afterwards.
+* A zero field width is allowed for logical formatted output (`L0`).
### Extensions supported when enabled by options
diff --git a/flang/include/flang/Common/format.h b/flang/include/flang/Common/format.h
index de6967139c5caf..c5e9fb06e260f1 100644
--- a/flang/include/flang/Common/format.h
+++ b/flang/include/flang/Common/format.h
@@ -463,10 +463,13 @@ template <typename CHAR> void FormatValidator<CHAR>::check_r(bool allowed) {
template <typename CHAR> bool FormatValidator<CHAR>::check_w() {
if (token_.kind() == TokenKind::UnsignedInteger) {
wValue_ = integerValue_;
- if (wValue_ == 0 &&
- (*argString_ == 'A' || *argString_ == 'L' ||
- stmt_ == IoStmtKind::Read)) { // C1306, 13.7.2.1p6
- ReportError("'%s' edit descriptor 'w' value must be positive");
+ if (wValue_ == 0) {
+ if (*argString_ == 'A' || stmt_ == IoStmtKind::Read) {
+ // C1306, 13.7.2.1p6
+ ReportError("'%s' edit descriptor 'w' value must be positive");
+ } else if (*argString_ == 'L') {
+ ReportWarning("'%s' edit descriptor 'w' value should be positive");
+ }
}
NextToken();
return true;
diff --git a/flang/test/Semantics/io07.f90 b/flang/test/Semantics/io07.f90
index 64a32c9959287c..a013849472f611 100644
--- a/flang/test/Semantics/io07.f90
+++ b/flang/test/Semantics/io07.f90
@@ -68,10 +68,10 @@
6001 format(((I0, B0)))
!ERROR: 'A' edit descriptor 'w' value must be positive
- !ERROR: 'L' edit descriptor 'w' value must be positive
+ !WARNING: 'L' edit descriptor 'w' value should be positive
6101 format((A0), ((L0)))
- !ERROR: 'L' edit descriptor 'w' value must be positive
+ !WARNING: 'L' edit descriptor 'w' value should be positive
6102 format((3(((L 0 0 0)))))
7001 format(17G8.1, 17G8.1e3)
diff --git a/flang/test/Semantics/io08.f90 b/flang/test/Semantics/io08.f90
index f6038b471759f3..517984fe3433d6 100644
--- a/flang/test/Semantics/io08.f90
+++ b/flang/test/Semantics/io08.f90
@@ -192,8 +192,7 @@
!ERROR: 'A' edit descriptor 'w' value must be positive
write(*,'(A0)')
- !ERROR: 'L' edit descriptor 'w' value must be positive
- write(*,'(L0)')
+ write(*,'(L0)') ! warning, not error
!ERROR: Expected 'G' edit descriptor '.d' value
write(*,'(G4)')
diff --git a/flang/unittests/Runtime/LogicalFormatTest.cpp b/flang/unittests/Runtime/LogicalFormatTest.cpp
index c4fbfc81f06a43..26c9374be13389 100644
--- a/flang/unittests/Runtime/LogicalFormatTest.cpp
+++ b/flang/unittests/Runtime/LogicalFormatTest.cpp
@@ -23,7 +23,7 @@ TEST(IOApiTests, LogicalFormatTest) {
char buffer[bufferSize];
// Create format for all types and values to be written
- const char *format{"(L,L3,I3,L2,L2,I3,L2,A3,L2,L,F4.1,L2)"};
+ const char *format{"(L0,L3,I3,L2,L2,I3,L2,A3,L2,L,F4.1,L2)"};
auto cookie{IONAME(BeginInternalFormattedOutput)(
buffer, bufferSize, format, std::strlen(format))};
More information about the flang-commits
mailing list