diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md index 2d1c967a6068d..6a3186968a58c 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 de6967139c5ca..c5e9fb06e260f 100644 --- a/flang/include/flang/Common/format.h +++ b/flang/include/flang/Common/format.h @@ -463,10 +463,13 @@ template void FormatValidator::check_r(bool allowed) { template bool FormatValidator::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 64a32c9959287..a013849472f61 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 f6038b471759f..517984fe3433d 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 c4fbfc81f06a4..26c9374be1338 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))};