[flang-commits] [flang] [flang] Accept L0 (PR #121998)
via flang-commits
flang-commits at lists.llvm.org
Tue Jan 7 13:41:11 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Peter Klausler (klausler)
<details>
<summary>Changes</summary>
Accept a zero field width for formatted logical output (L0), interpreting it as if it had been L1.
---
Full diff: https://github.com/llvm/llvm-project/pull/121998.diff
5 Files Affected:
- (modified) flang/docs/Extensions.md (+1)
- (modified) flang/include/flang/Common/format.h (+7-4)
- (modified) flang/test/Semantics/io07.f90 (+2-2)
- (modified) flang/test/Semantics/io08.f90 (+1-2)
- (modified) flang/unittests/Runtime/LogicalFormatTest.cpp (+1-1)
``````````diff
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))};
``````````
</details>
https://github.com/llvm/llvm-project/pull/121998
More information about the flang-commits
mailing list