Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions flang/lib/Parser/io-parsers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,11 @@ TYPE_PARSER(construct<format::FormatItem>(
construct<format::FormatItem>(
maybe(repeat), Parser<format::DerivedTypeDataEditDesc>{}) ||
construct<format::FormatItem>(Parser<format::ControlEditDesc>{}) ||
// Error recovery: accept [r] before control-edit-desc so that the
// format validator can diagnose a repeat specifier before descriptors
// like SS, SP, S, BN, BZ, etc., rather than failing the parse entirely.
construct<format::FormatItem>(
maybe(repeat), Parser<format::ControlEditDesc>{}) ||
construct<format::FormatItem>(charStringEditDesc) ||
construct<format::FormatItem>(maybe(repeat), parenthesized(formatItems)))

Expand Down
45 changes: 45 additions & 0 deletions flang/test/Semantics/io17.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
! Test error messages for repeat specifier before control edit descriptors
! in FORMAT statements (not just in inline format strings).

! Repeat specifier before sign-edit-desc in WRITE format strings
!ERROR: Repeat specifier before 'SS' edit descriptor
write(*,'(2SS, F10.3)') 0.5
!ERROR: Repeat specifier before 'SP' edit descriptor
write(*,'(2SP, F10.3)') 0.5
!ERROR: Repeat specifier before 'S' edit descriptor
write(*,'(2S, F10.3)') 0.5

! Repeat specifier before blank-interp-edit-desc in WRITE format strings
!ERROR: Repeat specifier before 'BN' edit descriptor
write(*,'(2BN, F10.3)') 0.5
!ERROR: Repeat specifier before 'BZ' edit descriptor
write(*,'(2BZ, F10.3)') 0.5

! Repeat specifier before sign-edit-desc in FORMAT statements
!ERROR: Repeat specifier before 'SS' edit descriptor
2001 format(2SS, F10.3)
!ERROR: Repeat specifier before 'SP' edit descriptor
2002 format(2SP, F10.3)
!ERROR: Repeat specifier before 'S' edit descriptor
2003 format(2S, F10.3)

! Repeat specifier before blank-interp-edit-desc in FORMAT statements
!ERROR: Repeat specifier before 'BN' edit descriptor
2004 format(2BN, F10.3)
!ERROR: Repeat specifier before 'BZ' edit descriptor
2005 format(2BZ, F10.3)

! Repeat specifier before round-edit-desc in FORMAT statements
!ERROR: Repeat specifier before 'RU' edit descriptor
2006 format(2RU, F10.3)
!ERROR: Repeat specifier before 'RZ' edit descriptor
2007 format(2RZ, F10.3)

! Repeat specifier before decimal-edit-desc in FORMAT statements
!ERROR: Repeat specifier before 'DC' edit descriptor
2008 format(2DC, F10.3)
!ERROR: Repeat specifier before 'DP' edit descriptor
2009 format(2DP, F10.3)

end