diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h index c0cf90c4696b6..bfe286e3c5085 100644 --- a/flang/include/flang/Parser/dump-parse-tree.h +++ b/flang/include/flang/Parser/dump-parse-tree.h @@ -57,11 +57,15 @@ class ParseTreeDumper { NODE(format, IntrinsicTypeDataEditDesc) NODE(format::IntrinsicTypeDataEditDesc, Kind) NODE(parser, Abstract) + NODE(parser, AccAtomicCaptureDirective) NODE(parser, AccAtomicCapture) NODE(AccAtomicCapture, Stmt1) NODE(AccAtomicCapture, Stmt2) + NODE(parser, AccAtomicReadDirective) NODE(parser, AccAtomicRead) + NODE(parser, AccAtomicUpdateDirective) NODE(parser, AccAtomicUpdate) + NODE(parser, AccAtomicWriteDirective) NODE(parser, AccAtomicWrite) NODE(parser, AccBeginBlockDirective) NODE(parser, AccBeginCombinedDirective) diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h index ca8473c6f9674..4138dcfc275e2 100644 --- a/flang/include/flang/Parser/parse-tree.h +++ b/flang/include/flang/Parser/parse-tree.h @@ -5243,38 +5243,65 @@ struct AccEndBlockDirective { }; // ACC END ATOMIC -EMPTY_CLASS(AccEndAtomic); +struct AccEndAtomic { + WRAPPER_CLASS_BOILERPLATE(AccEndAtomic, Verbatim); + CharBlock source; +}; // ACC ATOMIC READ +struct AccAtomicReadDirective { + TUPLE_CLASS_BOILERPLATE(AccAtomicReadDirective); + std::tuple t; + CharBlock source; +}; + struct AccAtomicRead { TUPLE_CLASS_BOILERPLATE(AccAtomicRead); - std::tuple, + std::tuple, std::optional> t; }; // ACC ATOMIC WRITE +struct AccAtomicWriteDirective { + TUPLE_CLASS_BOILERPLATE(AccAtomicWriteDirective); + std::tuple t; + CharBlock source; +}; + struct AccAtomicWrite { TUPLE_CLASS_BOILERPLATE(AccAtomicWrite); - std::tuple, + std::tuple, std::optional> t; }; // ACC ATOMIC UPDATE +struct AccAtomicUpdateDirective { + TUPLE_CLASS_BOILERPLATE(AccAtomicUpdateDirective); + std::tuple, AccClauseList> t; + CharBlock source; +}; + struct AccAtomicUpdate { TUPLE_CLASS_BOILERPLATE(AccAtomicUpdate); - std::tuple, AccClauseList, Statement, + std::tuple, std::optional> t; }; // ACC ATOMIC CAPTURE +struct AccAtomicCaptureDirective { + TUPLE_CLASS_BOILERPLATE(AccAtomicCaptureDirective); + std::tuple t; + CharBlock source; +}; + struct AccAtomicCapture { TUPLE_CLASS_BOILERPLATE(AccAtomicCapture); WRAPPER_CLASS(Stmt1, Statement); WRAPPER_CLASS(Stmt2, Statement); - std::tuple t; + std::tuple t; }; struct OpenACCAtomicConstruct { @@ -5287,6 +5314,7 @@ struct OpenACCAtomicConstruct { struct OpenACCBlockConstruct { TUPLE_CLASS_BOILERPLATE(OpenACCBlockConstruct); std::tuple t; + CharBlock source; }; struct OpenACCStandaloneDeclarativeConstruct { @@ -5324,7 +5352,11 @@ struct OpenACCDeclarativeConstruct { }; // OpenACC directives enclosing do loop -EMPTY_CLASS(AccEndLoop); +struct AccEndLoop { + WRAPPER_CLASS_BOILERPLATE(AccEndLoop, Verbatim); + CharBlock source; +}; + struct OpenACCLoopConstruct { TUPLE_CLASS_BOILERPLATE(OpenACCLoopConstruct); OpenACCLoopConstruct(AccBeginLoopDirective &&a) @@ -5332,6 +5364,7 @@ struct OpenACCLoopConstruct { std::tuple, std::optional> t; + CharBlock source; }; struct OpenACCEndConstruct { diff --git a/flang/lib/Parser/openacc-parsers.cpp b/flang/lib/Parser/openacc-parsers.cpp index ad035e6ade321..a37aebe622e73 100644 --- a/flang/lib/Parser/openacc-parsers.cpp +++ b/flang/lib/Parser/openacc-parsers.cpp @@ -169,12 +169,12 @@ TYPE_PARSER(sourced(construct( TYPE_PARSER(construct( sourced(Parser{}), Parser{})) -TYPE_PARSER(construct("END LOOP"_tok)) +TYPE_PARSER( + sourced(construct(startAccLine >> verbatim("END LOOP"_tok)))) -TYPE_PARSER(construct( +TYPE_PARSER(sourced(construct( sourced(Parser{} / endAccLine), - maybe(Parser{}), - maybe(startAccLine >> Parser{} / endAccLine))) + maybe(Parser{}), maybe(Parser{} / endAccLine)))) // 2.15.1 Routine directive TYPE_PARSER(sourced(construct(verbatim("ROUTINE"_tok), @@ -190,27 +190,32 @@ TYPE_PARSER(construct( sourced(Parser{}), Parser{})) // 2.12 Atomic constructs -TYPE_PARSER(construct(startAccLine >> "END ATOMIC"_tok)) +TYPE_PARSER(sourced( + construct(startAccLine >> verbatim("END ATOMIC"_tok)))) -TYPE_PARSER("ATOMIC" >> construct(verbatim("READ"_tok), - Parser{} / endAccLine, - statement(assignmentStmt), - maybe(Parser{} / endAccLine))) +TYPE_PARSER(sourced(construct( + "ATOMIC" >> verbatim("READ"_tok), Parser{}))) +TYPE_PARSER( + construct(Parser{} / endAccLine, + statement(assignmentStmt), maybe(Parser{} / endAccLine))) -TYPE_PARSER("ATOMIC" >> construct(verbatim("WRITE"_tok), - Parser{} / endAccLine, - statement(assignmentStmt), - maybe(Parser{} / endAccLine))) +TYPE_PARSER(sourced(construct( + "ATOMIC" >> verbatim("WRITE"_tok), Parser{}))) +TYPE_PARSER( + construct(Parser{} / endAccLine, + statement(assignmentStmt), maybe(Parser{} / endAccLine))) -TYPE_PARSER("ATOMIC" >> - construct(maybe(verbatim("UPDATE"_tok)), - Parser{} / endAccLine, statement(assignmentStmt), - maybe(Parser{} / endAccLine))) +TYPE_PARSER(sourced(construct( + "ATOMIC" >> maybe(verbatim("UPDATE"_tok)), Parser{}))) +TYPE_PARSER( + construct(Parser{} / endAccLine, + statement(assignmentStmt), maybe(Parser{} / endAccLine))) -TYPE_PARSER("ATOMIC" >> - construct(verbatim("CAPTURE"_tok), - Parser{} / endAccLine, statement(assignmentStmt), - statement(assignmentStmt), Parser{} / endAccLine)) +TYPE_PARSER(sourced(construct( + "ATOMIC" >> verbatim("CAPTURE"_tok), Parser{}))) +TYPE_PARSER(construct( + Parser{} / endAccLine, statement(assignmentStmt), + statement(assignmentStmt), Parser{} / endAccLine)) TYPE_PARSER( sourced(construct(Parser{})) || @@ -240,14 +245,14 @@ TYPE_PARSER(startAccLine >> sourced(construct("END"_tok >> construct(pure( llvm::acc::Directive::ACCD_data)))))) -TYPE_PARSER(construct( +TYPE_PARSER(sourced(construct( Parser{} / endAccLine, block, // NB, This allows mismatched directives, but semantics checks that they // match. recovery(withMessage("expected OpenACC end block directive"_err_en_US, attempt(Parser{} / endAccLine)), construct(construct( - pure(llvm::acc::Directive::ACCD_data)))))) + pure(llvm::acc::Directive::ACCD_data))))))) // Standalone constructs TYPE_PARSER(construct(