diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h --- a/flang/include/flang/Parser/dump-parse-tree.h +++ b/flang/include/flang/Parser/dump-parse-tree.h @@ -222,6 +222,7 @@ NODE(CommonStmt, Block) NODE(parser, CompilerDirective) NODE(CompilerDirective, IgnoreTKR) + NODE(CompilerDirective, NameValue) NODE(parser, ComplexLiteralConstant) NODE(parser, ComplexPart) NODE(parser, ComponentArraySpec) diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h --- a/flang/include/flang/Parser/parse-tree.h +++ b/flang/include/flang/Parser/parse-tree.h @@ -3211,8 +3211,12 @@ TUPLE_CLASS_BOILERPLATE(IgnoreTKR); std::tuple, Name> t; }; + struct NameValue { + TUPLE_CLASS_BOILERPLATE(NameValue); + std::tuple> t; + }; CharBlock source; - std::variant, std::list> u; + std::variant, std::list> u; }; // Legacy extensions diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp --- a/flang/lib/Parser/Fortran-parsers.cpp +++ b/flang/lib/Parser/Fortran-parsers.cpp @@ -1173,7 +1173,9 @@ defaulted(parenthesized(some("tkr"_ch))), name))}; TYPE_PARSER( beginDirective >> sourced(construct(ignore_tkr) || - construct("DIR$" >> many(name))) / + construct("DIR$" >> + many(construct( + name, maybe("=" >> digitString64))))) / endDirective) TYPE_PARSER(extension(construct( diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -1761,7 +1761,9 @@ Word("!DIR$ IGNORE_TKR"); // emitted even if tkr list is empty Walk(" ", tkr, ", "); }, - [&](const std::list &names) { Walk("!DIR$ ", names, " "); }, + [&](const std::list &names) { + Walk("!DIR$ ", names, " "); + }, }, x.u); Put('\n'); @@ -1777,6 +1779,10 @@ } Walk(std::get(x.t)); } + void Unparse(const CompilerDirective::NameValue &x) { + Walk(std::get(x.t)); + Walk("=", std::get>(x.t)); + } // OpenACC Directives & Clauses void Unparse(const AccAtomicCapture &x) {