mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 17:46:49 +00:00

The parser combinator withMessage("error message"_err_en_US, PARSER) is meant to run the parser PARSER and, if it fails, override its error messages if it failed silently or it was unable to recognize any tokens at all. This gives the parser a way to avoid emitting some confusing or missing error messages. Unfortunately, the implementation could sometimes lose track of whether any tokens had been recognized, leading to problems with outer usage of withMessage() and also -- more seriously -- with ParseState::CombineFailedParses(). That's a utility that determines which error messages to retain when two or more parsers have been attempted at the same starting point and none of them succceed. Its policy is to retain the state from the parser that consumed the most input text before failing, so long as it had recognized at least one token. So anyway, fix up withMessage(), adjust the tests, and add a test of the original motivating confusing error situation, in which a syntax error in a COMMON statement was being diagnosed as a problem with a statement function definition because withMessage() had lost the fact that the parse of the COMMON statement had recognized some tokens, and the last attempted parse later was a failed attempt to parse a statement function. Differential Revision: https://reviews.llvm.org/D135216
49 lines
1.3 KiB
Fortran
49 lines
1.3 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
! This test checks for errors in sync memory statements based on the
|
|
! statement specification in section 11.6.5 of the Fortran 2018 standard.
|
|
|
|
program test_sync_memory
|
|
implicit none
|
|
|
|
integer sync_status
|
|
character(len=128) error_message
|
|
|
|
!___ standard-conforming statements ___
|
|
|
|
sync memory
|
|
sync memory()
|
|
sync memory(stat=sync_status)
|
|
sync memory( errmsg=error_message)
|
|
sync memory(stat=sync_status, errmsg=error_message)
|
|
|
|
!___ non-standard-conforming statements ___
|
|
|
|
!______ invalid sync-stat-lists: invalid stat= ____________
|
|
|
|
!ERROR: expected end of statement
|
|
sync memory(status=sync_status)
|
|
|
|
! Invalid sync-stat-list: missing stat-variable
|
|
!ERROR: expected end of statement
|
|
sync memory(stat)
|
|
|
|
! Invalid sync-stat-list: missing 'stat='
|
|
!ERROR: expected end of statement
|
|
sync memory(sync_status)
|
|
|
|
!______ invalid sync-stat-lists: invalid errmsg= ____________
|
|
|
|
! Invalid errmsg-variable keyword
|
|
!ERROR: expected end of statement
|
|
sync memory(errormsg=error_message)
|
|
|
|
! Invalid sync-stat-list: missing 'errmsg='
|
|
!ERROR: expected end of statement
|
|
sync memory(error_message)
|
|
|
|
! Invalid sync-stat-list: missing errmsg-variable
|
|
!ERROR: expected end of statement
|
|
sync memory(errmsg)
|
|
|
|
end program test_sync_memory
|