[flang] Accept L0 (#121998)

Accept a zero field width for formatted logical output (L0),
interpreting it as if it had been L1.
This commit is contained in:
Peter Klausler 2025-01-08 13:15:51 -08:00 committed by GitHub
parent 9462ce885b
commit eb77f442b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 12 additions and 9 deletions

View File

@ -410,6 +410,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

View File

@ -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;

View File

@ -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)

View File

@ -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)')

View File

@ -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))};