diff --git a/flang/lib/Parser/openacc-parsers.cpp b/flang/lib/Parser/openacc-parsers.cpp index 09b30e679de0e..75aeffd29f92f 100644 --- a/flang/lib/Parser/openacc-parsers.cpp +++ b/flang/lib/Parser/openacc-parsers.cpp @@ -150,11 +150,12 @@ TYPE_PARSER(sourced(construct( TYPE_PARSER(construct( sourced(Parser{}), Parser{})) -TYPE_PARSER(construct(startAccLine >> "END LOOP"_tok)) +TYPE_PARSER(construct("END LOOP"_tok)) TYPE_PARSER(construct( sourced(Parser{} / endAccLine), - maybe(Parser{}), maybe(Parser{} / endAccLine))) + maybe(Parser{}), + maybe(startAccLine >> Parser{} / endAccLine))) // 2.15.1 Routine directive TYPE_PARSER(sourced(construct(verbatim("ROUTINE"_tok), @@ -227,22 +228,25 @@ TYPE_PARSER(construct( TYPE_PARSER(construct( sourced(Parser{}), Parser{})) -TYPE_PARSER( - startAccLine >> first(sourced(construct( - Parser{})), - sourced(construct( - Parser{})))) +TYPE_PARSER(startAccLine >> + withMessage("expected OpenACC directive"_err_en_US, + first(sourced(construct( + Parser{})), + sourced(construct( + Parser{}))))) // OpenACC constructs TYPE_CONTEXT_PARSER("OpenACC construct"_en_US, startAccLine >> - first(construct(Parser{}), - construct(Parser{}), - construct(Parser{}), - construct(Parser{}), - construct(Parser{}), - construct(Parser{}), - construct(Parser{}))) + withMessage("expected OpenACC directive"_err_en_US, + first(construct(Parser{}), + construct(Parser{}), + construct(Parser{}), + construct( + Parser{}), + construct(Parser{}), + construct(Parser{}), + construct(Parser{})))) TYPE_PARSER(startAccLine >> sourced(construct(sourced("END"_tok >> diff --git a/flang/test/Semantics/OpenACC/acc-error.f90 b/flang/test/Semantics/OpenACC/acc-error.f90 new file mode 100644 index 0000000000000..b1c3b77847429 --- /dev/null +++ b/flang/test/Semantics/OpenACC/acc-error.f90 @@ -0,0 +1,15 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenacc + +! Check parser specific error for OpenACC + + +subroutine test(a, n) + integer :: a(n) + !ERROR: expected OpenACC directive + !$acc p + integer :: i,j + + i = 0 + !ERROR: expected OpenACC directive + !$acc p + end subroutine